예제 #1
0
파일: index.php 프로젝트: haypo/conf
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 : «&nbsp;<em>' . $str . '</em>&nbsp;».');
        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 : «&nbsp;{$string}&nbsp;».");
                return;
            }
            if (strpos($str, '/') === false || !crackme_file_allowed($str)) {
                crackme_error("<p>Pas le droit d'écrire dans le fichier «&nbsp;{$str}&nbsp;». 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;
}
예제 #2
0
파일: crackme_func.php 프로젝트: haypo/conf
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 : «&nbsp;{$string}&nbsp;».");
                return false;
            }
            if (strpos($str, "/") === false || !crackme_file_allowed($str)) {
                crackme_error("<p>Pas le droit au fichier «&nbsp;<em>{$str}</em>&nbsp;».");
                return false;
            }
        }
    }
    return true;
}