function telecharge($fichier) { // Interdit des exploits trop vilains $allow = array('INTO', 'LOAD_FILE', 'OUTFILE'); if (!crackme_check_sql($fichier, $allow)) { crackme_error('<p>Nom de fichier incorrect : « <em>' . $str . '</em> ».'); return; } // Vérifie les LOAD_FILE if (!crackme_check_loadfile($fichier)) { return; } // Vérifie les OUTFILE if (preg_match_all('/OUTFILE +([^ ]+)/i', $fichier, $match)) { foreach ($match[1] as $string) { $str = mysql2str($string); if (!$str) { crackme_error("<p>Chaîne non reconnue : « {$string} »."); return; } if (strpos($str, '/') === false || !crackme_file_allowed($str)) { crackme_error("<p>Pas le droit d'écrire dans le fichier « {$str} ». Utilisez le répertoire couran(" . realpath('.') . ") ..."); return; } } } // Lit le compteur crackme_init_sql(); $compteur = crackme_sql_query("SELECT compteur FROM crackme4 WHERE fichier='{$fichier}';"); if (!$compteur) { crackme_error("<p>Erreur du compteur ...</p>"); return; } // Interdit les fichiers autres que truc.txt if (!ereg("^[a-zA-Z0-9]+\\.txt\$", $fichier)) { crackme_error("<p>Seul les fichiers textes (.txt) du répertoire courant sont autorisés.</p>"); return; } // Mise à jour du compteur if (mysql_num_rows($compteur) == 1) { crackme_sql_query("UPDATE crackme4 SET compteur=compteur+1 WHERE fichier='{$fichier}';"); } else { crackme_sql_query("INSERT INTO crackme4 (fichier, compteur) VALUES('" . mysql_real_escape_string($fichier) . "',1);"); } // Lit la taille du fichier $size = filesize($fichier); if ($size === false || $size == 0) { crackme_error("<p>Impossible de lire la taille du fichier \"<em>{$fichier}</em>\", ou alors il est vide.</p>"); return; } header("Content-Type: application/octet-stream"); header("Content-Length: " . $size); header("Content-Disposition: attachment; filename=\"" . basename($fichier) . "\";"); readfile($fichier); die; }
function crackme_check_loadfile($sql) { if (preg_match_all('/LOAD_FILE\\(([^)]+)\\)/i', $sql, $match)) { foreach ($match[1] as $string) { $str = mysql2str($string); if (!$str) { crackme_error("<p>Chaîne non reconnue : « {$string} »."); return false; } if (strpos($str, "/") === false || !crackme_file_allowed($str)) { crackme_error("<p>Pas le droit au fichier « <em>{$str}</em> »."); return false; } } } return true; }