Scripts d'upload de fichiers sur les sites internet et leurs vulnerabilites par zorgon C'est en etant sur un site particulier que j'ai repere ce probleme ( certainement que je ne suis pas le seul a m'en etre apercu ). Le probleme apparait sur des sites proposant d'uploader des fichiers grace a un script en php (souvent upload.php3). La plupart du temps, ces scripts ne verifient pas l'extension du fichier que l'utilisateur distant souhaite uploader. e.g (trouve sur un site web): $uploaddir = "./uploadfiles"; if(ereg("^\.", "$filename_name") || ereg("[ %/,;:+~#````'$%&\\()?!^|\]\[]", $filename_name)) { ... } elseif(file_exists("$uploaddir/$filename_name")) { ... } elseif($filename_size <= $max_uploadsize) { copy($filename, "$uploaddir/$filename_name"); ... On s'apercoit que le script verifie d'abord s'il existe des meta-caraceteres, puis si le fichier a uploader existe deja. Mais nulle part, il ne verifie l'extension du fichier (pour interdire les .cgi, .php ...). De plus le script copie le fichier de l'utilisateur dans la racine du serveur web et indique a l'utilisateur distant son emplacement (par un message, dans les sources html ...). e.g (idem): file dans les sources html Donc, si on upload un fichier du style : $cat foo.php3 $ et qu'on l'execute le script via le browser web : http://www.victim.com/uploadfiles/foo.php3 On peut recuperer le fichier upload.txt et donc les sources du fichiers upload.php3. Avec un peu d'imagination, on s'apercoit tres vite que l'on peut par exemple recuperer le login/password d'une base mysql. Le probleme a ete decrit sur un script personnel mais il existe aussi sur beaucoup de softs qui implementent l'upload de fichiers. e.g: AnyPortal(php)-0.1 de Stefan Wiesendanger (d@nger.org) --- ligne 830 ------------------------------------------------- case "UPLOAD" : if (!Writeable($fsDir)) Error("Write denied",$relDir) ; if (strstr($FN_name,"/")) Error("Non-conforming filename") ; // TODO : should rather check for escapeshellcmds // but maybe RFC 18xx asserts safe filenames .... $source = $FN ; $target = $fsDir . "/" . $FN_name ; exec("cp $source $target") ; --------------------------------------------------------------- Les solutions a ce probleme peuvent etre : - verification de l'extension du fichier, - renommer le fichier par un nom qui ne peut pas etre dangereux (en fonction de l'heure) - copie du fichier dans un repertoire non accessible a l'utilisateur distant ... -------------------------------------------------------------------------- zorgon http://www.nightbird.free.fr