PY-Membres 4.2 ************** Informations : °°°°°°°°°°°°°° Langage : PHP Version : [3.x?], 4.0, 4.1, 4.2 Website : http://www.scripts-php.com Problèmes : - Accès Admin - Injection SQL Developpement : °°°°°°°°°°°°°°° PY-Membres est un application permettant de gérer sa propre partie membres sur son site, via une partie administration. La première faille permet d'accèder à la partie administration. Le fichier admin/secure.php est le fichier inclut dans tous les fichiers de la partie admin permettant de voir si on est bien loggé ou pas. Voici son code : ---------------------------------------------- ---------------------------------------------- Il vérifie donc si la variable $adminpy est vide ET si elle est différente du mot de passe admin. Si c'est le cas, on est redirigé vers l'index, où on doit se logger. Le problème est le "ET" (&&). En effet, ça devrait être un "ou" (||) (le mot de passe est enregistré dans le cookie dont le nom est adminpy), c'est-à-dire que on devrait se logger si la variable $adminpy est vide OU si elle est différente du mot de passe admin. Ici, pour être redirigé, il faut que les 2 conditions soient remplies. Donc si une des 2 ne l'est pas, on est pas redirigé, et considéré comme admin. Evidemment ce n'est pas la condition vérifiant qyue le mot de passe est le bon qu'un hacker peut changer, mais bien celle vérifiant que la variable n'est pas vide. Ainsi pour être admin sur PY-Membres, il suffira de taper une url du type : http://[target]/admin/admin.php?adminpy=1 ou d'y envoyer un cookie nommé "adminpy" et ayant une valeur quelconque, sauf nulle. La deuxième faille est un problème d'injection SQL, qui ne fonctionne que si magic_quotes_gpc=OFF dans php.ini. Elle vient du fichier pass_done.php, qui permet de récupérer sont mot de passe en donnant son email de membre. On y voit le code suivant : ----------------------------------------------------------------------------------------------------------------------------- [...] if($Submit) { connexiondb(); $query = mysql_query("SELECT login, passwd FROM $db_table WHERE email='$email'"); list($login, $passwd) = mysql_fetch_row($query); $nb=mysql_num_rows($query); if($nb<1) { echo""; exit;} [...] ----------------------------------------------------------------------------------------------------------------------------- Si on donne à $email la valeur : ' OR 3 IN (1,2,3) INTO OUTFILE '/complete/path/file.txt via par exemple l'url : http://[target]/pass_done.php?Submit=1&email='%20OR%203%20IN%20(1,2,3)%20INTO%20OUTFILE%20'/complete/path/file.txt /complete/path/ étant par exemple le chemin complet vers le site web, on obtiendra la requête suivante : SELECT login, passwd FROM $db_table WHERE email='' OR 3 IN (1,2,3) INTO OUTFILE '/complete/path/file.txt' qui enregistrera TOUT les logins et mot de passes de la table $db_table dans le fichier http://[target]/file.txt (l'expression 3 IN (1,2,3) renvoit toujours vrai), si les conditions propres à INTO OUTFILE sont remplies. Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info. Le créateur a été mailé de nombreuses fois, sans encore aucun résultat. Dans admin/secure.php, remplacer la ligne : ---------------------------------------------- if (!isset($adminpy) && $adminpy !== "$admin") ---------------------------------------------- par : ---------------------------------------------- if (!isset($adminpy) || $adminpy !== "$admin") ---------------------------------------------- Et dans pass_done.php, avant la ligne --------------------------------------------------------------------------------- $query = mysql_query("SELECT login, passwd FROM $db_table WHERE email='$email'"); --------------------------------------------------------------------------------- ajouter la ligne : ---------------------------- $email = addslashes($email); ---------------------------- Credits : °°°°°°°°° Auteur : frog-m@n E-mail : leseulfrog@hotmail.com Website : http://www.phpsecure.info Date : 12/08/03