Ci-dessous, les différences entre deux révisions de la page.
web:faille_comparaison_php [2016/03/14 11:01] arkinar créée |
web:faille_comparaison_php [2016/07/04 08:38] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | **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 positif) | ||
- | |||
- | La comparaison stricte ( === ) : | ||
- | |||
- | - Il compare le type et la valeur | ||
- | |||
- | Les fonctions php : | ||
- | |||
- | - Elles ont été développés pour comparer les variables. ex :strcmp | ||
- | |||
- | Exemple de code vulnérable : | ||
- | <code> | ||
- | <?php | ||
- | if($_POST['login']== "admin" && $_POST['password'] == "Super_p@ssword_3v3r!")){ | ||
- | echo "Accès ok"; | ||
- | } | ||
- | ?> | ||
- | </code> | ||
- | |||
- | Ou encore : | ||
- | |||
- | <code> | ||
- | <?php | ||
- | if(!strcmp($_POST['login'], "admin") && !strcmp($_POST['password'], "Super_p@ssword_3v3r!")){ | ||
- | echo "Accès ok"; | ||
- | } | ||
- | ?> | ||
- | </code> | ||
- | |||
- | **2.Exploitation** | ||
- | |||
- | Le but est d'exploiter les faux positif 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 indiques que "php" == 0 => renvoie true. | ||
- | |||
- | Nous allons envoyer en donnée dans le formulaire : | ||
- | |||
- | <code>login=0&password=0</code> | ||
- | |||
- | Le php va l'interpreter de la manière suivante : | ||
- | |||
- | <code>if (0==0 && 0==0)</code> | ||
- | |||
- | 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 en donnée dans le formulaire : | ||
- | |||
- | <code>login[]=abc&password[]=abc</code> | ||
- | |||
- | Le php va générer une erreur mais il va renvoyer true. | ||
- | |||
- | |||
- | **3.Comment se protéger** | ||
- | |||
- | Pour se protéger il faut utiliser des comparaisons stricte ( === ). | ||
- | |||
- | Il faut aussi toujours filtrer les valeurs envoyer 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]] | ||
- | |||