FORCER UN TÉLÉCHARGEMENT (REPRISE DU CODE DE "EJBYE7"), ON SYNTHÉTISE !!

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 2 nov. 2006 à 13:23
museumdive Messages postés 1 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 5 avril 2011 - 5 avril 2011 à 03:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40181-forcer-un-telechargement-reprise-du-code-de-ejbye7-on-synthetise

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
2 nov. 2006 à 13:23
ini_set("memory_limit","50M");

c'est quoi cette abération... mémory_limit ne sert pas à ça... qui plus est tel quel ça risque de générer un warning qui corrompra le fichier téléchargé il serait donc interessant de désactiver le report d'erreur... la taille du fichier n'est pas spécifier dans les en-têtes http... penser à désactiver la compression zlib si elle est activée... éventuellement désactiver la mise en cache... ton code est sensible à une attaque par directory transversal... tu vérifis même pas que le fichier existe et puis d'où vient $fichier_forc ???

bref ça aurait pu être mieux... 5/10 mais ça les vaut tout juste... .. .

Voici la version corrigée... .. .

@ tchaOo°

<?php

/** path du répertoir contenant les fichiers (à éditer) **/
define('DOWNLOAD_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR);

/** on récupère le nom du fichier demandé **/
if(isset($_GET['file']))
$file = $_GET['file'];
elseif(isset($_POST['file']))
$file = $_POST['file'];
else
$file = '';

/** tant qu'a faire évitons les attaques par directory transversal **/
$file = str_replace(array('../','..\\'),'',$file);

/** la variable est elle vide, le fichier existe ? **/
if(empty($file))
exit('Please select a file for download !');
elseif(!is_file(DOWNLOAD_PATH.$file))
exit('Requested file not found !');

function getMimeType($file)
{
$mimes = array(
'hqx' => 'application/mac-binhex40',
'doc' => 'application/msword',
'dot' => 'application/msword',
'bin' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'class' => 'application/octet-stream',
'so' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'pdf' => 'application/pdf',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'wbxml' => 'application/vnd.wap.wbxml',
'wmlc' => 'application/vnd.wap.wmlc',
'wmlsc' => 'application/vnd.wap.wmlscriptc',
'xla' => 'application/vnd.ms-excel',
'xls' => 'application/vnd.ms-excel',
'xlt' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'csh' => 'application/x-csh',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'spl' => 'application/x-futuresplash',
'gtar' => 'application/x-gtar',
'php' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'php5' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'js' => 'application/x-javascript',
'sh' => 'application/x-sh',
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tcl' => 'application/x-tcl',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'xhtml' => 'application/xml',
'ent' => 'application/xml-external-parsed-entity',
'dtd' => 'application/xml-dtd',
'mod' => 'application/xml-dtd',
'gz' => 'application/x-gzip',
'zip' => 'application/zip',
'au' => 'audio/basic',
'snd' => 'audio/basic',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'kar' => 'audio/midi',
'mp1' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'aif' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'm3u' => 'audio/x-mpegurl',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'wav' => 'audio/x-wav',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tif',
'wbmp' => 'image/vnd.wap.wbmp',
'pnm' => 'image/x-portable-anymap',
'pbm' => 'image/x-portable-bitmap',
'pgm' => 'image/x-portable-graymap',
'ppm' => 'image/x-portable-pixmap',
'xbm' => 'image/x-xbitmap',
'xpm' => 'image/x-xpixmap',
'ics' => 'text/calendar',
'ifb' => 'text/calendar',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'asc' => 'text/plain',
'txt' => 'text/plain',
'rtf' => 'text/rtf',
'sgml' => 'text/x-sgml',
'sgm' => 'text/x-sgml',
'tsv' => 'text/tab-seperated-values',
'wml' => 'text/vnd.wap.wml',
'wmls' => 'text/vnd.wap.wmlscript',
'xsl' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => 'video/x-msvideo',
);

if(false ($pos strrpos($file,'.')))
return isset($mimes[$file]) ? $mimes[$file] : 'application/force-download';

$ext = substr($file,$pos+1);

return isset($mimes[$ext]) ? $mimes[$ext] : 'application/force-download';
}

/**** on désactive les erreurs ****/
error_reporting(0);
/**** on désactive la compression en sortie ****/
ini_set('zlib.output_compression', 0);
$now = time();

/*** Gestion du cache ***/
header('Pragma: public');
header('Last-Modified: '.gmdate("D, d M Y H:i:s").' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');

/**** Informations sur la réponse HTTP elle-même ****/
header('Date: '.gmdate("D, d M Y H:i:s", $now).' GMT');
header('Expires: '.gmdate("D, d M Y H:i:s", $now+1).' GMT');
header('Last-Modified: '.gmdate("D, d M Y H:i:s", $now).' GMT');

/**** Informations sur le contenu à envoyer ****/
header('Content-Tranfer-Encoding: none');
header('Content-Length: '.filesize(DOWNLOAD_PATH.$file));
header('Content-Type: '.getMimeType($file).'; name="'.$file.'"');
header('Content-Disposition: attachement; filename="'.$file.'"');

/**** pour finir lecture du fichier ****/
readfile(DOWNLOAD_PATH.$file);
exit();

?>
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
2 nov. 2006 à 14:29
La variable $fichier_forc est envoyée par Get (je devrais sans doute mettre en POST) par la page "répertoire_fichier.php" qui liste le contenue du dossier ou son contenu les fichiers,on verifie la présence de cette variable et le fichier existe forcement car il a été listé dans la page précédente.Il est vrai que je recopier les yeux fermé cette fonction :"ini_set("memory_limit","50M");" du code de "EJBYE7" sans meme verifier je suis donc vraiment pas malin.Sinon pour la sécurité j'avoue que j'y connai rien et je lis ce que tu a mis avec grande attention.
Merci beaucoup de prendre attention aux nouveaux codes qui sortent!!
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
2 nov. 2006 à 14:51
"La variable $fichier_forc est envoyée par Get"

Et si register_globals est désactivé... .. ? ;o)

Quand à la mettre en post pas forcement autant accepter les deux... .. .

"le fichier existe forcement car il a été listé dans la page précédente."

Et si un petit malin fait un hotlink sur la page et que le fichier est supprimé ou renomé entre temps... si un petit malin veut faire une injection de code pour modifier les header ou pour essayer de récupérer le path physique du site en provoquant l'affichage d'une erreur dans le but de réutiliser ce dernier dans une attaque... .. . ;o)

Ca en fait beaucoups des si... il faut (essayer de) penser à tout... .. .

Concernant l'attaque par directory transversal par exemple imaginons que je fais...

http://www.tonsite.ext/downloads/donwload.php?fichier_forc=../config.php

Si à la racine de ton site (ou ailleur il suffit juste de changer le path dans l'url) tu as un fichier config.php par exemple avec tes identifiants de connection à ta base de donnée je le téléchargerais finger in the nose... .. . ;o)

@ tchaOo°
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
2 nov. 2006 à 14:55
La je doit avouer que je suis un gros naz !!
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
2 nov. 2006 à 15:53
Non non, c'est Kankrelune qui est tres bon ;-)

"Et si un petit malin fait un hotlink sur la page et que le fichier est supprimé ou renomé entre temps... si un petit malin veut faire une injection de code pour modifier les header ou pour essayer de récupérer le path physique du site en provoquant l'affichage d'une erreur dans le but de réutiliser ce dernier dans une attaque... .. . ;o)"
J'ai pas trop comrpis ce que tu essaye de dire par HOT LINK ? Et DIRECTORYP SEPRATOR, c'est une constante a toi ou cela existe vraiment ?

Merci ^^