PHP : Faille de comparaisons
1.Présentation
Php est un langage qui utilise le typage ( int pour un entier , string pour une chaine de caractère …).
Quand il compare deux variables il peut le faire de plusieurs manières différentes :
La comparaison large ( == ) :
- Il compare la valeur en utilisant le transtypage : convertit une des deux valeurs (ce qui donne de nombreux faux positifs)
La comparaison stricte ( === ) :
- Il compare le type et la valeur
Les fonctions php :
- Elles ont été développées pour comparer les variables. ex :strcmp
Exemple de code vulnérable :
<?php if($_POST['login']== "admin" && $_POST['password'] == "Super_p@ssword_3v3r!")){ echo "Accès ok"; } ?>
Ou encore :
<?php if(!strcmp($_POST['login'], "admin") && !strcmp($_POST['password'], "Super_p@ssword_3v3r!")){ echo "Accès ok"; } ?>
2.Exploitation
Le but est d'exploiter les faux positifs pour bypasser une authentification.
2.1 Méthode 1 : Comparaison large ( == )
Pour bypasser la comparaison large il faut regarder le tableau des comparaisons (cf source).
Une des lignes indique que “php” == 0 ⇒ renvoie true.
Nous allons envoyer dans le formulaire ces données:
login=0&password=0
Le php va l’interpréter de la manière suivante :
if (0==0 && 0==0)
Ce qui est toujours vrai.
2.2 Méthode 2 : fonction Strcmp
Pour bypasser la fonction strcmp il faut utiliser un tableau.
Nous allons envoyer dans le formulaire ces données:
login[]=abc&password[]=abc
Le php va générer une erreur mais va tout de même renvoyer true.
3.Comment se protéger
Pour se protéger il faut utiliser des comparaisons strictes ( === ).
Il faut aussi toujours filtrer les valeurs envoyées par l'utilisateur avant de les utiliser.
Source :
http://php.net/manual/fr/types.comparisons.php
http://danuxx.blogspot.fr/2013/03/unauthorized-access-bypassing-php-strcmp.html