Пример #1
0
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
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;
}
Пример #3
0
        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);
?>
Пример #4
0
            $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 : «&nbsp;<em>{$commande}</em>&nbsp;»)</p>";
                crackme_error($msg);
                $repertoire = './';
            }
        }