**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 :
Ou encore :
**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]]