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.