Web Security Academy

Insecure deserialization - Lab : Modifying serialized data types

Objectif :

  • Obtenir les droits d'administrateur du site pour ensuite supprimer le compte d'une personne se nommant Carlos.

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 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ère suivante :

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

On va maintenant tenter de modifier notre objet sérialisé pour obtenir les permissions administrateurs.

Dans l'énoncé, il est précisé que le nom de compte de l'administrateur est administrator. Il va donc falloir dans un premier temps modifier la valeur du champ username est lui attribuer la valeur "administrator".

Dans un second temps, on va s'occuper de l'attribut "access_token". On va tenter de modifier le type cet attribut pour profiter d'une éventuelle faille de comparaison (PHP loose comparaison) présent dans le code PHP.

En PHP, lorsqu'une comparaison large ( == ) est utilisée, la valeur est comparée en utilisant le transtypage : une des deux valeurs est convertie (ce qui donne de nombreux faux positifs).

Par exemple, la comparaison 0 == "string" sera évaluée à true car PHP considère la chaîne de caractères comme un entier égal à 0.

Une comparaison large est peut-être ici utilisée dans le code pour vérifier si le token du cookie de session correspond à celui de l'administrateur.

On va donc tenter de changer le type de l'attribut access_token en integer (entier) et mettre sa valeur à 0.

Ce qui nous donne le cookie de session suivant :

O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}

On recode notre nouveau cookie en Base64 et on remplace l'ancien par celui-ci dans toutes nos requêtes qui vont être envoyées.

Une nouvelle section Admin panel apparaît :

On a effectivement obtenu les permissions administrateurs !

Enfin il suffit d'accéder à cette section et de supprimer l'utilisateur Carlos pour valider le lab.