Web Security Academy

Server-side template injection - Lab : Basic server-side template injection in a code context

Objectif :

  • Supprimer le fichier morale.txt se situant dans le répertoire home de l'utilisateur Carlos. Le serveur utilise le framework Tornado. Les identifiants d'un compte utilisateur sont connus : wiener / peter

Solution :

On lance le lab et on arrive sur un blog avec des publications affichées :

On se logue ensuite avec le compte donné dans l'énoncé.

En accédant au détail d'une publication, on constate qu'il y a un espace commentaire disponible :

On poste un commentaire et on aperçoit que c'est le prénom qui est affiché en tant qu'auteur :

On revient dans l'accueil et on clique sur "My Account". Il y a une fonctionnalité pour choisir le nom affiché lorsqu'on poste un commentaire. On essaye de le changer en sélectionnant "First Name" :

On clique sur "Submit" et on analyse la requête envoyée au serveur: C'est une requête POST avec les paramètres suivants :

La valeur du premier paramètre est bien le nom d'une variable. On va tenter une injection de template ( en se basant sur le fait que le serveur utilise Tornado ) depuis cette entrée utilisateur.

En cherchant sur le net, on trouve que l'on peut exécuter du code avec le framework Tornado en utilisant la syntaxe suivante :

{% import os %}{{ os.system(' [COMMAND_TO_EXECUTE] ') }}

On adapte ce payload à notre contexte et ça devient : user.first_name}}{% import os %}{{os.system('rm /home/carlos/morale.txt')

On remplace la valeur du paramètre POST "blog-post-author-display" par ce payload et on soumet la requête au serveur.

Le lab se valide. La commande s'est donc bien exécutée.