tags: SSTI SSTI_Identificazione_Template Identificazione_Template_SSTI


Siccome esistono diversi template che utilizzano sintassi simili non esiste un singolo payload per identificare che tipo di template stia utilizzando.

Il metodo più semplice è quello di inserire un errore sicuro nella speranza che il server parli troppo e ci restituisca un errore che ci dica quale template stia utilizzando, per esempio:

<%=foobar%>
 
${{<%[%'"}}%\
 

Questo errore ci restituisce questo output di errore:

(erb):1:in `<main>': undefined local variable or method `foobar' for main:Object (NameError)
from /usr/lib/ruby/2.5.0/erb.rb:876:in `eval'
from /usr/lib/ruby/2.5.0/erb.rb:876:in `result'
from -e:4:in `<main>'

Nel caso in cui invece sia muto come un pesce dobbiamo provare diversi payload fino a trovare il template giusto. Ti regoli sulla sintassi che “attacca”: {{...}}, ${...}, #{...}, <%...%> puntano a famiglie diverse.

L’engine decide che tipo di attacco puoi fare, e quindi cosa cercare:

  • Motori “ricchi” / non sandboxati → punti alla RCE. Qui rientrano Jinja2, Twig, Freemarker, Velocity, Mako, Smarty, e Handlebars su NodeJS. Valutano espressioni quasi arbitrarie, quindi esiste una catena per arrivare a eseguire comandi.
  • Motori “ristretti” / sandboxati by design → punti all’information disclosure. Il caso tipico è il Django Template Language: niente shell diretta, ma puoi leakare oggetti, settings, la SECRET_KEY.

Questa immagine fornisce uno schema da seguire per testare i vari template:

Lo stesso payload a volte può restituire una risposta positiva in più di una lingua del modello. Ad esempio, il payload {{7*‘7’}} restituisce 49 in Twig e 7777777 in Jinja2. Pertanto, è importante non trarre conclusioni affrettate basandosi su un’unica risposta positiva.