Web Security Academy

Insecure deserialization - Lab : Arbitrary object injection in PHP

Objectif :

  • Supprimer le fichier morale.txt se situant dans le répertoire personnel d'une personne se nommant Carlos dans le serveur distant.

Solution :

Lorsqu'on lance le lab, on arrive sur la première page d'un site de commerce. On aperçoit que l'on peut se loguer sur le site avec un compte utilisateur en appuyant sur "Account login" en haut à droite.

En utilisant les identifiants fournis dans l'énoncé (nom de compte : wiener ; mot de passe : peter ), on se connecte au site en tant que client ordinaire. Un cookie de session a été créé et va désormais apparaître parmi les headers des requêtes envoyées par le navigateur au serveur :

En utilisant un outil pour analyser les requêtes émises (par exemple Burp Suite), on extrait notre cookie de session codé en Base64 et on le décode. Ce qui nous donne la chaîne de caractères suivante :

O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"EpaeAYasrzKmjVkRxaF8EkcYc6qjTYyU";}

Ce qui nous donne un objet sérialisé en PHP.

En regardant le code source de la page d'accueil, une ligne nous saute aux yeux :

On connaît désormais la potentielle existence d'un fichier CustumTemplate.php situé dans le dossier /libs/ dans le serveur et qu'il est mis à jour.

On va alors tenter d'accéder à un éventuel fichier backup associé à CustumTemplate.php depuis l'URL en rajoutant "~" à la fin du nom d'origine.

Ce qui nous donne pour ma part : https://ac021fb11f26c4ee80113b7900ba00cd.web-security-academy.net/libs/CustomTemplate.php~

On essaie d'accéder à la ressource et le fichier en question apparaît.

Dans ce fichier PHP, la classe CustumTemplate est définie. Une fonction particulière nous intéresse :

la fonction _destruct est une fonction en PHP que l'on décrit comme "magique". Elle va automatiquement s'exécuter lors de la destruction de l'objet. Cette fonction a été ici redéfinie pour qu'elle supprime le fichier dont le chemin est précisé dans l'attribut lock_file_path.

Désormais, l'astuce est de remplacer le cookie de session par un objet sérialisé de la classe CustumTemplate en initialisant l'attribut lock_file_path avec la valeur "/home/carlos/morale.txt". Lorsque cet objet sera traité par le serveur et ensuite détruit, le fichier morale.txt sera supprimé.

Ce qui donne l'objet suivant à placer dans le cookie :

O:14:"CustomTemplate":2:{s:18:"template_file_path";s:6:"random";s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}

Il suffit donc de coder en base64 notre objet, de remplacer le cookie d'origine par celui-ci dans une des requêtes envoyées et le fichier morale.txt sera supprimé ! Ce qui validera le lab.