Files
HIP7CTF_Writeups/de/the_wrapper.md
m0rph3us1987 a79656b647 Added writeups
2026-03-08 12:22:39 +01:00

4.2 KiB
Raw Blame History

The Wrapper

Willkommen zum Write-up für The Wrapper. Dies ist eine "Web"-Challenge, die eine klassische und mächtige Schwachstelle in PHP-Anwendungen untersucht: Local File Inclusion (LFI) unter Verwendung von PHP Wrappers.

In dieser Challenge haben wir Zugriff auf einen "Language Loader v2.0", der dynamisch verschiedene Sprachdateien lädt. Unser Ziel ist es, den geheimen Inhalt von flag.php zu lesen.


1. Erste Erkundung

Die Challenge-Beschreibung sagt:

"Unser Entwicklerteam hat gerade den neuen Language Loader v2.0 gestartet! Er bietet eine schlanke Sidebar und dynamisches Laden von Inhalten, um unsere globalen Benutzer auf Englisch, Deutsch und Spanisch zu unterstützen."

Wenn wir die Seite besuchen, sehen wir eine Sidebar mit Links wie:

  • ?lang=english.php
  • ?lang=german.php
  • ?lang=spanish.php

Wenn wir auf diese Links klicken, ändert sich der Inhalt der Hauptbox. Dies ist ein starker Indikator für dynamische Datei-Inklusion.

2. Quellcode-Analyse

Die Challenge stellt uns the_wrapper.tar.xz zur Verfügung. Untersuchen wir index.php:

<div class="box">
    <?php
        // Standardsprache
        $file = "english.php";

        if (isset($_GET['lang'])) {
            $file = $_GET['lang'];
        }

        include($file);
    ?>
</div>

Dieser Code nimmt den lang-Parameter direkt aus der URL und übergibt ihn an die PHP include()-Funktion. Dies ist eine klassische Local File Inclusion (LFI) Schwachstelle. Die Anwendung vertraut unserer Eingabe blind und versucht, jede von uns angegebene Datei einzubinden und auszuführen.

3. Das Hindernis: Ausführung vs. Offenlegung

Wir wissen, dass es eine flag.php-Datei im selben Verzeichnis gibt (wir haben sie im Quellcode-Archiv gesehen). Versuchen wir, sie einzubinden: ?lang=flag.php

Die Seite lädt, aber die Box ist leer! Warum? Schauen wir uns flag.php an:

<?php
$flag = "{flag:PHP_Wrappers_R_Magic_F0r_LFI}";
?>

Die Datei definiert nur eine Variable namens $flag; sie druckt sie nicht aus. Wenn wir sie über ?lang=flag.php einbinden, führt PHP den Code aus, setzt die Variable, und das war's. Nichts wird auf dem Bildschirm angezeigt.

Um die Flagge zu erhalten, müssen wir den Quellcode von flag.php lesen, ohne ihn auszuführen.

4. Die Schwachstelle: PHP Wrapper

Der Challenge-Titel "The Wrapper" ist ein riesiger Hinweis. PHP hat ein Feature namens "Wrapper", das es Ihnen ermöglicht, die Art und Weise, wie auf Dateien zugegriffen wird, zu modifizieren.

Ein besonders nützlicher Wrapper für LFI ist php://filter. Er ermöglicht es Ihnen, Filter (wie Base64-Kodierung) auf eine Datei anzuwenden, bevor sie gelesen oder eingebunden wird.

Wenn wir den convert.base64-encode-Filter verwenden, kodiert PHP den gesamten Inhalt der Datei als Base64-String und "bindet" dann diesen String ein. Da ein Base64-String kein gültiger PHP-Code ist, wird er nicht ausgeführt er wird einfach als reiner Text direkt auf die Seite gedruckt.

5. Ausnutzung

Wir können einen Payload erstellen, um den Quellcode von flag.php zu leaken:

?lang=php://filter/convert.base64-encode/resource=flag.php

Wenn wir diese URL besuchen, enthält die Inhaltsbox einen langen Base64-String: PD9waHAKJGZsYWcgPSAie2ZsYWc6UEhQX1dyYXBwZXJzX1JfTWFnaWNfRjByX0xGSX0iOwo/Pgo=

Jetzt müssen wir ihn nur noch dekodieren: echo "PD9waHAKJGZsYWcgPSAie2ZsYWc6UEhQX1dyYXBwZXJzX1JfTWFnaWNfRjByX0xGSX0iOwo/Pgo=" | base64 -d

<?php
$flag = "{flag:PHP_Wrappers_R_Magic_F0r_LFI}";
?>

6. Die Lösung

Flag: {flag:PHP_Wrappers_R_Magic_F0r_LFI}


Gelernte Lektionen

  • Vertrauen Sie niemals Benutzereingaben in include() oder require(): Verwenden Sie eine Whitelist erlaubter Dateien, anstatt direkt vom Benutzer bereitgestellte Strings zu übergeben.
  • PHP Wrapper sind mächtig: Sie können verwendet werden, um Filter zu umgehen, Quellcode zu lesen oder sogar Remote Code Execution (RCE) in einigen Konfigurationen zu erreichen (z.B. php://input oder data://).
  • Defense in Depth: Selbst wenn eine LFI existiert, ist es schwerer auszunutzen, wenn die PHP-Konfiguration des Servers die Verwendung gefährlicher Wrapper einschränkt (allow_url_include = Off).

Frohes Hacken!