Bypass la fonction PHP strcmp

De très nombreux sites offrent la possibilité de pouvoir se connecter. La vérification des identifiants fournis par l'utilisateur peut se faire de différentes manières. Il est par exemple possible d'utiliser la fonction strcmp pour vérifier que le nom d'utilisateur et mot de passe correspondent aux identifiants attendus... Mais c'est une très mauvaise idée car il est possible de bypasser la vérification réalisée par cette fonction.

Prenons comme exemple ce code:

Ce script PHP affiche un form html dans lequel l'utilisateur peut rentrer un mot de passe. Le code PHP vérifie ensuite que le mot de passe rentré est correct. En pratique tout fonctionne correctement mais la fonction strcmp possède une particularité dangereuse. Cette fonction n'interprète pas correctement les tableaux. Si un tableau est comparé avec une chaîne de caractères alors strcmp va retourner 0 et donc va indiquer que les deux chaines de caractères sont identiques.

Vu qu'un petit exemple est plus parlant qu'un long blabla voici comment est-il possible d'exploiter le code afficher un peu plus haut.

Cette capture d'écran viens de burp. Burp est un proxy qui intercepte les requêtes http. Une fois les requêtes interceptées il est possible de les modifier.

Ici on peut voir que le mot de passe est envoyé via une variable POST

Pour convertir cette variable password en tableau il suffit de rajouter [] à la fin du nom de la variable:

On transmet la requête http modifiée et c'est gagné 🙂

Conclusion

Une bonne pratique est de ne jamais utiliser strcmp mais plutôt de préférer la comparaison stricte (avec "===") car cette méthode vérifie le type des variables utilisées.