Added writeups

This commit is contained in:
m0rph3us1987
2026-03-08 12:22:39 +01:00
parent a566ea77d1
commit a79656b647
43 changed files with 6940 additions and 0 deletions

98
de/the_wrapper.md Normal file
View File

@@ -0,0 +1,98 @@
# 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`:
```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
<?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
<?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!