tags: SSTI RilevazioneSSTI SSTI_Rilevazione


https://portswigger.net/research/server-side-template-injection

Plaintext context

Per rilevare se un parametro web è vulnerabile ad una SSTI possiamo usare diverse strategie.

Poniamo che il sito abbia un template di questo tipo:

render('Hello ' + username)

Se noi nell’URL inseriamo al posto del nome questa operazione matematica:

http://vulnerable-website.com/?username=${7*7}

Il risultato sarà Hello 49 indicando chiaramente che il server è vulnerabile a questo tipo di attacco. Purtroppo però bisogna testare questa operazione per ogni linguaggio fino a trovare quella giusta.

Code context

In altri casi, la vulnerabilità viene esposta tramite l’inserimento di input da parte dell’utente all’interno di un’espressione di modello, come abbiamo visto in precedenza con il nostro esempio di email. Ciò può assumere la forma di un nome di variabile controllabile dall’utente inserito all’interno di un parametro, come ad esempio:

greeting = getQueryParameter('greeting')
engine.render("Hello {{"+greeting+"}}", data)

Sul sito web, l’URL risultante sarebbe qualcosa del tipo:

http://vulnerable-website.com/?greeting=data.username

Questo verrebbe visualizzato nell’output di Hello Carlos, ad esempio.

Un metodo per testare l’inserimento di modelli lato server in questo contesto consiste nello stabilire innanzitutto che il parametro non contenga una vulnerabilità XSS diretta inserendo HTML arbitrario nel valor

http://vulnerable-website.com/?greeting=data.username<tag>

In assenza di XSS, ciò di solito risulterà in una voce vuota nell’output (solo Hello senza nome utente), tag codificati o un messaggio di errore. Il passo successivo è provare a uscire dall’istruzione utilizzando la sintassi di template comune e tentare di inserire HTML arbitrario dopo di essa:

http://vulnerable-website.com/?greeting=data.username}}<tag>

Se anche questo genera un errore o un output vuoto, è stata utilizzata la sintassi del linguaggio di template sbagliato oppure, se nessuna sintassi dello stile del modello sembra essere valida, l’inserimento del modello lato server non è possibile. In alternativa, se l’output viene visualizzato correttamente, insieme all’HTML arbitrario, questa è un’indicazione chiave che è presente una vulnerabilità di template injection lato server:

Hello Carlos<tag>

Payload Generici

Prova a chiudere il parametro che ritieni vulnerabile con la chiusura della sua espressione come se fosse l’' per le SQL Injection, per esempio con il template Tornado puoi fare nel seguente modo:

}}{%25+import+os+%25}{{os.system('rm%20/home/carlos/morale.txt')

Questo payload rimuove il file morale.txt chiudendo l’espressione legittima con le doppie }}, importando l’OS con {%25+import+os+%25} e infine eseguendo il comando con {{os.system('rm%20/home/carlos/morale.txt') encodeato in URL