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; }
echo '<div class="article"><p>Mot de passe valide !</p></div>'; // ... (normalement on fait plein de truc ici) } else { crackme_error('<p>Mot de passe incorrect.</p>'); } } $article = crackme_html_request('article'); if ($article) { // Test pour rendre l'exercice plus complique if (strstr($article, "../") !== false) { crackme_error("<p>Tututu, pas de \"../\" dans un nom d'article ! (pas folle l'abeille)</p>"); $article = false; // Test pour eviter qu'on sorte du "cadre de l'exercice" ... } else { if (file_exists($article)) { if (!crackme_file_allowed($article)) { crackme_error("<p>Tututu, pas le droit au repertoire \"" . dirname($article) . "\" !</p>"); $article = false; } } } } // S'il y a une erreur, utilise l'article par defaut if (!$article) { $article = 'index.txt'; } // Affiche le contenu de l'article $texte = file($article); echo join("\n", $texte); ?>
$url .= '/'; } $url .= rawurlencode($file); } return $prefix . '<a href="' . $url . '">' . $file . '</a>'; } // Configure l'exercice error_reporting(E_ALL); $rootpath = '../'; $url_root = '../'; require_once $rootpath . 'include/crackme_func.php'; // Lit le répertoire demandé, puis le vérifie $repertoire = crackme_html_request('r'); if ($repertoire) { // Interdit les repertoires parents if (!crackme_file_allowed($repertoire)) { crackme_error("<p>Pas le droit au répertoire <em>{$repertoire}</em> (ou répertoire inexistant) !</p>"); $repertoire = "./"; } // Vérifie l'exploit :-) if (ereg("^([a-zA-Z0-9._/]+)( *(;+|&&|\\|\\|) *(.*))?\$", $repertoire, $regs)) { $exploit = $regs[4]; $commande = $regs[4]; if ($exploit != '') { if (!eregi("^uname( --?[a-z-]+)?\$", $commande)) { $msg = "<p>Désolé, seule la commande <em>uname</em> est autorisée.</p>"; $msg .= "<p>(commande détectée : « <em>{$commande}</em> »)</p>"; crackme_error($msg); $repertoire = './'; } }