X_holes ******* Produits : ********** x_stat x_news http://www.xqus.com/ Versions : ********** x_stat : 2.3 et moins. x_news : 1.1 et moins. Date : ****** 12/03/02 (22H05.57) Problemes : *********** x_stat : - Recuperation de nombreuses données sur l'ordinateur (phpinfo()). - Cross Site Scripting. - Path disclosure. x_news : - Accès à la partie administrateur. Developpement : *************** a) x_stat : ----------- Les failles se trouvent dans x_stat_admin.php . Un exemple d'une url sur ce fichier : x_stat_admin.php?action=monthly. Cette url executera la fonction monthly(). Si on met x_stat_admin.php?action=nimportekoi , cela nous affichera l'erreur : -------------------------------------------------------------------------------- Fatal error: Call to undefined function: nimportekoi() in /home/path/x-stat/x_stat_admin.php on line 808 -------------------------------------------------------------------------------- La deuxieme faille se trouve au même endroit : l'exploit : http://www.host.com/x_stat_admin.php?action=phpinfo , qui executera la commande phpinfo() et nous donnera des infos comme l'host, l'os, le serveur, et bien d'autres choses interessantes. Enfin, le cross site scripting. Il est à utiliser avec la commande phpinfo. Comme autres infos, phpinfo affiche aussi le HTTP_SERVER_VARS["argv"]. L'url http://www.host.com/x_stat_admin.php?action=phpinfo& executera donc un script dans cette case. b) x_news : ----------- Le fichier 'interdit', ou plutôt reservé aux admins, et donc le fichier qui nous interesse est x_news.php. Dans ce script php, on peut voir ces quelques lignes : ---------------------------------------------------------------------------- $is_loged_in="0"; if(isset($username)) { if(!isset($md5_password)) { $md5_password=md5($password); } $full_member_db=file("db/users.txt"); foreach($full_member_db as $member_db_line){ $member_db=explode("|",$member_db_line); if($member_db[1]==$username && $member_db[2]==$md5_password) { $is_loged_in=1; setcookie("username", $username, time()+1012324305); setcookie("md5_password", $md5_password, time()+1012324305); break; } } } ---------------------------------------------------------------------------- On peut voir que 2 insécurités ont été évitées. La premiere est le fait d'avoir spécifié juste avant une valeur pour la variable $is_loged_in ($is_loged_in="0";). Si cela n'avait pas été le cas, l'url x_news.php?is_loged_in=1 aurait peut-être suffit à rentrer comme admin. La deuxième est le fait que le password est crypté en md5. Il y a néanmoins une premiere erreur : il est envoyé par cookie. Il suffirait donc de le recuperer, ce qui ne s'avere pas si facile que ça, car les scripts envoyés comme news ne sont pas acceptés. Mais il y a plus grave, d'où le fait qu'on ne s'attarde pas sur ce point. Sur le site officiel, on peut trouver un txt où se trouve entre autre le passage qui m'a attiré : ------------------------------------------------------------------- -Data files: 1) users.txt: user_id|username|pass(md5)|mail|user_level 2) news.txt: news_id|date(stamp)|author|header|short_story|full_story 3) news_id.txt: contains the last used news id 4) users_id.txt contains the last used user id Notes: Uses cookies to log in, one with pass(md5) and one with username. ------------------------------------------------------------------- !!!!!!!! Si on va dans le fichier db/users.txt, on a donc le pseudo et le password admin. Il suffit donc d'envoyer un premier cookie nom : username valeur : voir users.txt et un deuxieme nom : md5_password valeur : voir users.txt à la page x_news.php pour être considéré comme admin, avec comme menu : ----------------------------------------- -Add news -Edit news -Apply changes -Control panel -Add/remove Users -Manage Comments ----------------------------------------- Pour savoir qui est l'admin dans users.txt, il suffit de regarder l'user_level (le dernier chiffre sur une ligne) : 1 = Super Admin 2 = Admin 3 = Writer Patch : ******* / Greetz : ******** Mercussio Credits : ********* frog-m@n leseulfrog@hotmail.com