La vulnérabilité des templates : l’injection de template

1- Qu’est ce qu’un moteur de template ?

Les développeurs Web utilisent les moteurs de template pour insérer des données dynamiques dans les pages Web.

Lorsque les pages Web proviennent d’un template, elles peuvent structurer le composant des pages Web de manière à pouvoir être modifiées indépendamment les unes des autres. Un composant peut inclure n’importe quoi comme en-tête, pied de page, ou contenu tel que vidéos, images, audio. Les moteurs de modèles sont couramment utilisés pour :

  • Afficher des informations sur les utilisateurs, les produits, les entreprises,
  • Afficher une galerie de photos, vidéos,
  • Vendre des produits en lign ,
  • Envoyer des e-mails en masse.

Voici quelques exemples de moteurs de template :

Java (Free marker, Velocity), PHP (smarty, twig), python (Jinja, tornado), ruby (Liquid).

Exemple de fonctionnement d’une template avec un objet java :

2- Qu’est ce que l’injection de template ?

L’injection de template se produit lorsque les entrées utilisateur ne sont pas intégrées de manière sécurisée dans un fichier de template, ce qui permet aux utilisateurs d’injecter des directives de template. À l’aide de ces directives de template malveillantes, un attaquant peut être en mesure d’exécuter du code arbitraire et de prendre le contrôle total du serveur Web.

Exemple d’injection de template:

Voici un exemple d’injection de template en python avec le moteur de template Tornado :

import tornado.template
import tornado.ioloop
import tornado.web

# exemple d'injection de template en utilisant le moteur de template "Tornado"
# la variable donnee est le code injectee par l'utilisateur 
TEMPLATE = '''
<html>
 <head><title> Texte injecte  est : {{ donnee }} </title></head> 
 <body> Texte de injecte est :  TEXT </body>
</html>
'''
class Main(tornado.web.RequestHandler):
 
    def get(self):
        donnee = self.get_argument('donnee', '')
        template_data = TEMPLATE.replace("TEXT",donnee)
        t = tornado.template.Template(template_data)
        self.write(t.generate(donnee=donnee))
 
application = tornado.web.Application([
    (r"/", Main),
], debug=True, static_path=None, template_path=None)
 
if __name__ == '__main__':
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

pour tester ce code :

  • enregistrer le code dans un fichier test.py
  • si vous n’avez pas encore installé Tornado utilisez cette commande pour l’installer : python -m pip install tornado
  • lancer la commande : python test.py
  • lancer le navigateur avec: http://localhost:8000/?donnee= "text à injecter" par exemple : donnee=Injected Data.
  • comme montrée dans l’exemple ci-dessous :

3- Détection de l’injection de template :

L’outil TplMap :

Tplmap automatise la détection et l’exploitation des vulnérabilités SSTI (Server-Side Template Injection) . L’outil peut être utilisé pour effectuer des recherches sur la classe de vulnérabilité SSTI ou comme outil de sécurité offensif dans les missions de test de pénétration.

Installation:

git clone https://github.com/epinna/tplmap

Test de l’outil sur l’exemple précédent :

pour tester l’outil on tape :

./tplmap.py -u <'url de test'>

Comme montrée dans l’image précédente, si une vulnérabilité est trouvée, l’outil génère les détails sur les points d’injection possibles dans la cible.

Ceux-ci incluent la valeur du paramètre GET (dans notre exemple c’est la variable “donnee”), le moteur de modèle (par exemple Tornado), le système d’exploitation (par exemple Linux) et la technique d’injection (par exemple, blind).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.