Server-Side Template Injection (SSTI)
Detection
Injecter une expression mathematique dans un champ de saisie pour verifier si le moteur de template l'evalue.
{{7*7}}
Si le serveur retourne 49, c'est une SSTI.
Box :
Bike
Exploitation Handlebars (Node.js)
Sur Bike, le serveur utilise Handlebars avec Node.js/Express.
Etape 1 : Identifier le moteur
Le message d'erreur revele le moteur de template (ex: Handlebars, Jinja2, Twig...).
Etape 2 : Tenter un payload basique
Resultat : require is not defined — Handlebars sandbox bloque require.
Etape 3 : Bypass du sandbox
Utiliser process (accessible globalement) pour remonter vers require :
Etape 4 : Lire le flag
Remplacer 'id' par la commande souhaitee :
'cat /root/flag.txt'
Box :
Bike
Outil : BurpSuite
- Intercepter la requete POST du formulaire
- Envoyer au Repeater pour modifier le payload
- URL-encoder le payload via l'onglet Decoder
- Envoyer et lire la reponse
astuce
Toujours URL-encoder les payloads SSTI avant de les envoyer, sinon les caracteres speciaux cassent la requete.
Moteurs de template courants
| Moteur | Langage | Test de detection |
|---|---|---|
| Jinja2 | Python | {{7*7}} → 49 |
| Twig | PHP | {{7*7}} → 49 |
| Handlebars | Node.js | {{7*7}} → 49 |
| Freemarker | Java | ${7*7} → 49 |
| ERB | Ruby | <%= 7*7 %> → 49 |