Aller au contenu principal
Expert Cybersécurité & IAv9.0
Centres de ressources conformité
Besoin d'un accompagnement expert ?
Devis personnalisé sous 24h — audit, conformité, incident
Checklists Sécurité — Audit & Durcissement
Formats disponibles
📄 PDF 📊 Excel 🌐 Web

11 checklists professionnelles couvrant 2 200+ points de contrôle. Téléchargement gratuit, aucune inscription.

Server-Side Template Injection (SSTI)

hacking

Définition

La Server-Side Template Injection (SSTI) est une vulnérabilité web qui survient quand des entrées utilisateur sont incorporées dans des templates côté serveur sans assainissement suffisant, permettant à l'attaquant d'injecter des directives de template qui seront interprétées par le moteur de templating et peuvent conduire à l'exécution de code arbitraire sur le serveur. Les moteurs de templates côté serveur (Jinja2 pour Python, Twig pour PHP, Freemarker pour Java, Pebble, Thymeleaf, Smarty, ERB pour Ruby, etc.) permettent d'incorporer des expressions et du code dans des templates HTML. Quand des données utilisateur sont directement interpolées dans la chaîne de template (plutôt que passées comme variable au template), l'attaquant peut injecter des expressions du moteur. Le test basique est l'injection de {{7*7}} : si la réponse affiche 49 (au lieu de la chaîne littérale), le moteur de template interprète l'expression, confirmant la vulnérabilité. La syntaxe varie selon le moteur : {{...}} pour Jinja2/Twig, ${...} pour Freemarker, <%=...%> pour ERB. L'exploitation via Jinja2 (Python) peut mener à l'exécution de commandes : {{config.items()}} pour accéder à la configuration, {{''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}} pour lire des fichiers (en utilisant la MRO Python pour accéder à la classe file), et {{''.__class__.__mro__[1].__subclasses__()[59].__init__.__globals__['__builtins__']['__import__']('os').system('id')}} pour exécuter des commandes. Des outils comme Tplmap automatisent la détection et l'exploitation des SSTI pour de nombreux moteurs de templates. La SSTI est souvent plus dangereuse que le XSS car elle s'exécute côté serveur avec les privilèges du processus web.

Fonctionnement

Test de détection : {{7*7}} → si affiche 49, Jinja2/Twig. ${7*7} → 49 pour Freemarker. Exploitation Jinja2 (Python Flask) pour RCE : {{request.application.__globals__.__builtins__.__import__('os').popen('id').read()}} exécute 'id' et retourne le résultat. Alternative via MRO : {{''.__class__.__bases__[0].__subclasses__()[137].__init__.__globals__['popen']('id').read()}} (l'index 137 varie selon Python version). Tplmap automatise tout cela.

Exploitation offensive

La SSTI est particulièrement impactante dans les CMS et frameworks qui utilisent des templates utilisateur (systèmes de newsletter, générateurs de documents, configurateurs de pages) et qui n'isolent pas correctement les données du code template. Une SSTI dans un système de génération de PDF ou de factures peut donner accès au système complet avec les privilèges du serveur d'application.

Détection et mitigation

La mitigation fondamentale est de ne jamais construire des templates en concaténant des données utilisateur non validées - utiliser les variables de contexte du moteur (passer les données comme variables, pas les interpoler dans la chaîne template). Des sandboxes de templates (Jinja2 SandboxedEnvironment) limitent l'accès aux classes Python dangereuses mais peuvent être contournées. Les WAF bloquent des patterns connus comme {{ ou ${ dans les paramètres.

Articles liés

Un projet cybersécurité ?

Expert dispo · Réponse 24h

Devis