{"id":4274,"date":"2021-12-29T15:06:20","date_gmt":"2021-12-29T14:06:20","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=4274"},"modified":"2023-06-21T10:31:50","modified_gmt":"2023-06-21T08:31:50","slug":"vulnerabilite-web-server-side-template-injection-ssti-qu-est-ce-que-c-est-comment-s-en-proteger","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/vulnerabilite-web-server-side-template-injection-ssti-qu-est-ce-que-c-est-comment-s-en-proteger\/","title":{"rendered":"La vuln\u00e9rabilit\u00e9 web Server-Side Template Injection (SSTI) : qu\u2019est-ce que c\u2019est et comment s\u2019en prot\u00e9ger"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium\"><img decoding=\"async\" width=\"300\" height=\"157\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2021\/12\/SSTI_vulnerabilite-300x157.png\" alt=\"SSTI : vulnerabilite Server Side Template Injection\" class=\"wp-image-5363\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2021\/12\/SSTI_vulnerabilite-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2021\/12\/SSTI_vulnerabilite-1024x535.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2021\/12\/SSTI_vulnerabilite.png 1200w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/figure>\n<\/div>\n\n\n<p>L<strong>es failles server-side template injection (SSTI) <\/strong>restent moins recherch\u00e9es que d\u2019autres types de vuln\u00e9rabilit\u00e9s. Pourtant, leur impact est important et m\u00e8ne souvent \u00e0 de l\u2019ex\u00e9cution de code \u00e0 distance (RCE). Ce sont donc des failles \u00e0 ne pas sous-estimer.<\/p>\n\n\n\n<p><strong>Dans quels contextes se produisent les vuln\u00e9rabilit\u00e9s SSTI&nbsp;? Comment d\u00e9tecter ces failles et comment s\u2019en prot\u00e9ger&nbsp;?<\/strong><\/p>\n\n\n\n<p>C\u2019est ce que nous allons d\u00e9tailler dans cet article.<\/p>\n\n\n\n<!--more-->\n\n\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Qu\u2019est-ce qu\u2019une vuln\u00e9rabilit\u00e9 server-side template injection (SSTI) ?<\/strong><\/h2>\n\n\n\n<p>Certaines applications web utilisent des moteurs de template pour dissocier la pr\u00e9sentation visuelle (HTML, CSS\u2026) de la logique applicative (PHP, Python\u2026). Ces moteurs permettent de cr\u00e9er des fichiers mod\u00e8les (des templates) dans l\u2019application. Les templates sont un m\u00e9lange de donn\u00e9es fixes (mise en page) et de donn\u00e9es dynamiques (variables). Lors de l\u2019utilisation de l\u2019application, le moteur de template va remplacer les variables contenues dans un template par des valeurs et va transformer le template en page web (HTML) puis l\u2019envoyer au client.<\/p>\n\n\n\n<p><strong>Une vuln\u00e9rabilit\u00e9 SSTI (server-side template injection) se produit lorsque les donn\u00e9es utilisateurs sont int\u00e9gr\u00e9es directement dans un template puis interpr\u00e9t\u00e9es par le moteur de template.<\/strong> Cela permet aux attaquants d\u2019injecter des directives arbitraires pour manipuler le moteur de template.<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dans quelles situations apparait cette faille ?<\/strong><\/h2>\n\n\n\n<p>La source du probl\u00e8me est li\u00e9e au fait que les donn\u00e9es transmises par les utilisateurs sont interpr\u00e9t\u00e9es directement par le moteur de template (en tant que donn\u00e9es dynamiques), au lieu d\u2019\u00eatre int\u00e9gr\u00e9es en tant que donn\u00e9es fixes.<\/p>\n\n\n\n<p>On retrouve le plus souvent ce type de vuln\u00e9rabilit\u00e9 sur des sites voulant offrir des fonctionnalit\u00e9s de personnalisations avanc\u00e9es comme les wikis, les blogs, les applications marketing ou les CMS.<\/p>\n\n\n\n<p>Une vuln\u00e9rabilit\u00e9 SSTI arrive g\u00e9n\u00e9ralement lorsqu\u2019un template est modifi\u00e9 pour obtenir un r\u00e9sultat personnalis\u00e9 pour un besoin pr\u00e9cis et que les utilisateurs ont acc\u00e8s \u00e0 des fonctions de modification du template.<\/p>\n\n\n\n<p>Un exemple concret pourrait \u00eatre une faille SSTI dans une application web qui propose aux utilisateurs un moyen de g\u00e9rer les mod\u00e8les des mails qui sont envoy\u00e9s par l\u2019application. Un template de base est d\u00e9fini pour l\u2019email mais l\u2019utilisateur peut modifier certains champs. Le moteur de template g\u00e9n\u00e8re ensuite l\u2019email final. Si l\u2019utilisateur injecte des expressions dans le template et qu\u2019elles sont \u00e9valu\u00e9es par le moteur de template, la fonctionnalit\u00e9 sera vuln\u00e9rable. L\u2019utilisateur pourra alors tenter de prendre la main sur le serveur.<\/p>\n\n\n\n<p>\u00c0 noter qu\u2019une faille SSTI ne donne pas syst\u00e9matiquement lieu \u00e0 une RCE et une compromission du serveur, cela d\u00e9pend de la situation (comment l\u2019application utilise le template, l\u2019endroit de l\u2019injection, etc.).<\/p>\n\n\n\n<p>Elle peut aussi permettre d\u2019autres attaques comme la lecture de fichiers sur le serveur, des fuites d\u2019information ou des \u00e9l\u00e9vations de privil\u00e8ges. Dans de rares cas, la vuln\u00e9rabilit\u00e9 n\u2019est pas exploitable. &nbsp;<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Comment trouver une faille SSTI&nbsp;?<\/strong><\/h2>\n\n\n\n<p>Les failles SSTI sont peu souvent d\u00e9couvertes, car elles sont moins connues et moins recherch\u00e9es que des <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/failles-xss-principes-types-dattaques-exploitations-et-bonnes-pratiques-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\">failles Cross Site Scripting (XSS)<\/a> par exemple. Leur identification se d\u00e9roule en deux parties\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une premi\u00e8re phase de d\u00e9tection de la vuln\u00e9rabilit\u00e9.<\/li>\n\n\n\n<li>Une seconde phase d\u2019identification du moteur de template utilis\u00e9.<\/li>\n<\/ul>\n\n\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>D\u00e9tecter la vuln\u00e9rabilit\u00e9<\/strong><\/h3>\n\n\n\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 d\u00e9terminer si une application est vuln\u00e9rable.<\/p>\n\n\n\n<p>Une approche efficace consiste \u00e0 fuzzer la cible dans tous les champs de donn\u00e9es avec un playload contenant des caract\u00e8res sp\u00e9ciaux souvent utilis\u00e9s par les moteurs de templates.<\/p>\n\n\n\n<p>Par exemple&nbsp;: <code>${{&lt;%[%'\"}}@{%\\.#{&lt;%=<\/code><\/p>\n\n\n\n<p>Si un message d\u2019erreur est retourn\u00e9 dans les r\u00e9ponses du serveur, cela indique que l\u2019application est potentiellement vuln\u00e9rable. Analyser le message d\u2019erreur pourrait permettre de d\u00e9terminer quel moteur est utilis\u00e9.<\/p>\n\n\n\n<p>Exemple de message d\u2019erreur avec le moteur de template Tornado en python&nbsp;lors de l\u2019injection du payload <code>\u00ab{{\u00bb<\/code> dans un param\u00e8tre vuln\u00e9rable:<\/p>\n\n\n\n<p><code>Internal Server Error<\/code><\/p>\n\n\n\n<p><code>No handlers could be found for logger \"tornado.application\" Traceback (most recent call last): File \"&lt;string&gt;\", line 15, in &lt;module&gt; File \"\/usr\/lib\/python2.7\/dist-packages\/tornado\/template.py\", line 317, in __init__ \"exec\", dont_inherit=True) File \"&lt;string&gt;.generated.py\", line 4 _tt_tmp = user.nickname{{ # &lt;string&gt;:1 ^ SyntaxError: invalid syntax<\/code><\/p>\n\n\n\n<p>Les injections de template peuvent survenir dans deux contextes diff\u00e9rents&nbsp;:<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Contexte Plaintext&nbsp;:<\/span> Beaucoup de moteurs de templates permettent d\u2019entrer du contenu directement dans des balises HTML ou en utilisant la syntaxe du moteur de template. Ce contenu sera interpr\u00e9t\u00e9 c\u00f4t\u00e9 serveur avant que le serveur ne renvoie une r\u00e9ponse HTTP. Dans ce cas, il est conseill\u00e9 d\u2019envoyer des formules math\u00e9matiques dans les champs test\u00e9s&nbsp;(en fonction du moteur de template, la syntaxe peut changer). Voici quelques exemples :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>{{7*7}}<\/code><\/li>\n\n\n\n<li><code>${7*7}<\/code><\/li>\n\n\n\n<li><code>${{7*7}}<\/code><\/li>\n\n\n\n<li><code>&lt;%= 7*7 %&gt;<\/code><\/li>\n\n\n\n<li><code>#{7*7}<\/code><\/li>\n<\/ul>\n\n\n\n<p>Si une de ces formules est interpr\u00e9t\u00e9e, la r\u00e9ponse du serveur contiendra \u00ab&nbsp;49&nbsp;\u00bb. Cela veut dire que l\u2019op\u00e9ration math\u00e9matique a \u00e9t\u00e9 interpr\u00e9t\u00e9e dans un contexte \u00ab&nbsp;Plaintext&nbsp;\u00bb et qu\u2019une vuln\u00e9rabilit\u00e9 SSTI est pr\u00e9sente.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Contexte code&nbsp;:<\/span> C\u2019est lorsque les entr\u00e9es utilisateurs sont directement ins\u00e9r\u00e9es dans une expression \u00e9valu\u00e9e par le moteur de template. Dans ce cas-l\u00e0, l\u2019id\u00e9e consiste \u00e0 modifier le param\u00e8tre concern\u00e9 en essayant de g\u00e9n\u00e9rer une erreur.<\/p>\n\n\n\n<p>Pour plus de d\u00e9tails sur les contextes, vous pouvez consulter <a href=\"https:\/\/portswigger.net\/web-security\/server-side-template-injection#constructing-a-server-side-template-injection-attack\" target=\"_blank\" rel=\"noreferrer noopener\">cet article<\/a>.<\/p>\n\n\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Identifier le moteur de template utilis\u00e9<\/strong><\/h3>\n\n\n\n<p>Identifier le moteur de template utilis\u00e9 est une \u00e9tape cl\u00e9 qui permettra par la suite de r\u00e9aliser la phase d\u2019exploitation.<\/p>\n\n\n\n<p>De nombreux moteurs de template existent. Parmi les plus populaires, nous pouvons citer&nbsp;Twig pour PHP, Freemarker pour Java, ERB pour ruby, Jinja pour python\u2026<\/p>\n\n\n\n<p>La plupart des moteurs de template utilisent des syntaxes tr\u00e8s diff\u00e9rentes du code HTML pour \u00e9viter les confusions.<\/p>\n\n\n\n<p>La m\u00e9thode d\u2019identification rejoint ce qui a \u00e9t\u00e9 \u00e9voqu\u00e9 dans la partie \u00ab&nbsp;D\u00e9tecter la vuln\u00e9rabilit\u00e9&nbsp;\u00bb&nbsp;: r\u00e9ussir \u00e0 g\u00e9n\u00e9rer un message d\u2019erreur permet souvent d\u2019identifier le moteur de template utilis\u00e9.<\/p>\n\n\n\n<p>En revanche, lorsque cette m\u00e9thode \u00e9choue (par exemple si les messages d\u2019erreurs ne sont pas affich\u00e9s dans les r\u00e9ponses du serveur), il convient de proc\u00e9der par \u00e9limination en testant des payloads simples (op\u00e9ration arithm\u00e9tique) avec des syntaxes diff\u00e9rentes correspondant \u00e0 diff\u00e9rents moteurs de template. L\u2019analyse des r\u00e9ponses du serveur doit permettre de d\u00e9terminer si l\u2019op\u00e9ration transmise a \u00e9t\u00e9 interpr\u00e9t\u00e9e ou non. En fonction de la syntaxe utilis\u00e9e, cela donnera une indication sur le moteur de template utilis\u00e9.<\/p>\n\n\n\n<p>Vous pouvez retrouver ici une <a href=\"https:\/\/github.com\/swisskyrepo\/PayloadsAllTheThings\/tree\/master\/Server%20Side%20Template%20Injection\" target=\"_blank\" rel=\"noreferrer noopener\">liste de payload<\/a> selon les langages de templating.<\/p>\n\n\n\n<p>Note&nbsp;: Si vous connaissez le langage de programmation utilis\u00e9 pour d\u00e9velopper l\u2019application, cela peut vous orienter sur les moteurs de templates utilis\u00e9s et vous permettre de cibler les tests pour la phase d\u2019identification.<\/p>\n\n\n\n<p>Une fois que vous savez le moteur de template utilis\u00e9, vous pourrez commencer \u00e0 exploiter la faille afin d\u2019obtenir l\u2019impact le plus \u00e9lev\u00e9 possible. La premi\u00e8re \u00e9tape consiste \u00e0 lire la documentation associ\u00e9e au moteur de template afin de d\u00e9terminer les actions existantes. Il convient ensuite de d\u00e9terminer quels sont les objets et fonctions auxquels vous avez acc\u00e8s sur l\u2019application vuln\u00e9rable. Une fois que vous avez une id\u00e9e globale de ce qu\u2019il est possible de faire, il ne reste plus qu\u2019\u00e0 tenter d\u2019exploiter la vuln\u00e9rabilit\u00e9 en essayant d\u2019obtenir une ex\u00e9cution de commande, lire des fichiers, etc.<\/p>\n\n\n\n<p>Exemple d\u2019un payload permettant d\u2019ex\u00e9cuter du code arbitraire lorsque Freemarker est utilis\u00e9&nbsp;:<\/p>\n\n\n\n<p><code>${\"freemarker.template.utility.Execute\"?new()(\"id\")}<\/code><\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Comment se prot\u00e9ger des failles SSTI&nbsp;?<\/strong><\/h2>\n\n\n\n<p>Voyant la gravit\u00e9 potentielle de la faille SSTI, on peut se demander pourquoi utiliser un template engine. Il pr\u00e9sente des avantages&nbsp;et notamment, il facilite les modifications. En effet, un changement de design pourra se faire sans toucher au flux du code et de mani\u00e8re autonome par les designers\/int\u00e9grateurs. Les modifications sont ind\u00e9pendantes du code et des traitements logiques. Il n\u2019y a pas besoin de toucher au fonctionnement de l\u2019application.<\/p>\n\n\n\n<p>De m\u00eame, les d\u00e9veloppeurs peuvent faire \u00e9voluer le code et des \u00e9l\u00e9ments logiques sans que l\u2019affichage des donn\u00e9es ne soit affect\u00e9 ou que l\u2019interface graphique ne soit cass\u00e9e.<\/p>\n\n\n\n<p>La maintenance du projet en est facilit\u00e9e. Cependant, une bonne configuration est primordiale.<\/p>\n\n\n\n<p>Le meilleur moyen d\u2019\u00e9viter les vuln\u00e9rabilit\u00e9s SSTI consiste \u00e0 ne jamais autoriser la modification ou la cr\u00e9ation de templates aux utilisateurs. Cependant lorsqu\u2019il s\u2019agit d\u2019un besoin m\u00e9tier, des solutions existent&nbsp;:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Faire de la <strong>sanitization (Assainissement)<\/strong><\/h3>\n\n\n\n<p>Cela consiste \u00e0 d\u00e9tecter et retirer le contenu potentiellement malveillant avant de les utiliser dans le template. Il faut donc analyser efficacement les donn\u00e9es transmises par les utilisateurs. Pour cela diff\u00e9rents moyens sont possibles (utilisation de regex, de liste blanche d\u2019expressions autoris\u00e9es, etc.).<\/p>\n\n\n\n<p>Cependant cette solution n\u2019est pas fiable \u00e0 100%. Une erreur de configuration peut laisser votre environnement vuln\u00e9rable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Avoir recours au sandboxing (Bac \u00e0 sable)<\/strong><\/h3>\n\n\n\n<p>Il s\u2019agit de fournir un environnement ferm\u00e9, o\u00f9 les modules et fonctionnalit\u00e9s \u00e0 risques sont d\u00e9sactiv\u00e9s. Si les donn\u00e9es fournies par les utilisateurs sont interpr\u00e9t\u00e9es, cela ne pourra pas donner acc\u00e8s \u00e0 d\u2019autres fonctionnalit\u00e9s ou d\u2019autres donn\u00e9es.<\/p>\n\n\n\n<p>Malheureusement, les environnements sandbox sont difficiles \u00e0 configurer et peuvent \u00eatre contourn\u00e9s en cas de mauvaise configuration ou d\u2019oublis. C\u2019est un peu un jeu du chat et de la souris entre les d\u00e9fenseurs et les attaquants.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Utiliser un template logic less<\/strong><\/h3>\n\n\n\n<p>Des templates engine \u00ab&nbsp;logic-less&nbsp;\u00bb existent, qui s\u00e9parent au maximum le rendu visuel et l\u2019interpr\u00e9tation de code. Mustache est l\u2019un des plus connus.<\/p>\n\n\n\n<p>Il n\u2019a pas d\u2019\u00e9nonc\u00e9s explicites de flux de contr\u00f4le, tout le contr\u00f4le \u00e9tant pilot\u00e9 par les donn\u00e9es, et il est impossible d\u2019int\u00e9grer une logique d\u2019application dans les templates Mustache.<\/p>\n\n\n\n<p>Les attaques les plus dangereuses (RCE) ne sont ainsi plus possibles et cela r\u00e9duit grandement le risque d\u2019attaques.<\/p>\n\n\n\n\n\n<p><strong>Conclusion<\/strong><\/p>\n\n\n\n<p>La grande majorit\u00e9 des vuln\u00e9rabilit\u00e9s de type SSTI que nous rencontrons lors <a href=\"https:\/\/www.vaadata.com\/fr\/pentest-web\/\" target=\"_blank\" rel=\"noreferrer noopener\">des tests d\u2019intrusion sur une plateforme web<\/a> conduisent \u00e0 une ex\u00e9cution de code arbitraire et \u00e0 la compromission du serveur. Il s\u2019agit donc d\u2019une faille \u00e0 ne pas n\u00e9gliger. Les recommandations peuvent \u00eatre complexes \u00e0 mettre en place et des tests sont n\u00e9cessaires pour confirmer leur efficacit\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les failles server-side template injection (SSTI) restent moins recherch\u00e9es que d\u2019autres types de vuln\u00e9rabilit\u00e9s. Pourtant, leur impact est important et m\u00e8ne souvent \u00e0 de l\u2019ex\u00e9cution de code \u00e0 distance (RCE). Ce sont donc des failles \u00e0 ne pas sous-estimer. Dans quels contextes se produisent les vuln\u00e9rabilit\u00e9s SSTI&nbsp;? Comment d\u00e9tecter ces failles et comment s\u2019en prot\u00e9ger&nbsp;?<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":{"0":"post-4274","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-technique"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/4274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=4274"}],"version-history":[{"count":6,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/4274\/revisions"}],"predecessor-version":[{"id":7131,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/4274\/revisions\/7131"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=4274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=4274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=4274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}