WEB-SECURITY SECURITY VULNERABILITY BACKEND-SECURITY XML XXE THREAT-PREVENTION APPLICATION-SECURITY OWASP

XML External Entity (XXE) Attacks: Memahami Ancaman dan Strategi Pencegahan untuk Aplikasi Web Anda

⏱️ 14 menit baca
👨‍💻

XML External Entity (XXE) Attacks: Memahami Ancaman dan Strategi Pencegahan untuk Aplikasi Web Anda

1. Pendahuluan

Di era modern web development, format data seperti JSON (JavaScript Object Notation) telah menjadi raja. API RESTful yang menggunakan JSON mendominasi sebagian besar komunikasi antar layanan. Namun, jangan salah, XML (Extensible Markup Language) masih hidup dan sehat di banyak sistem, terutama di lingkungan enterprise, sistem lama (legacy systems), integrasi pihak ketiga, atau standar industri tertentu (misalnya, SOAP, SAML, RSS, konfigurasi aplikasi, bahkan beberapa format dokumen).

Meski tidak sepopuler dulu, keberadaan XML ini seringkali menjadi “blind spot” bagi developer, terutama yang baru terjun. Akibatnya, kerentanan yang berkaitan dengan XML, seperti XML External Entity (XXE) attacks, sering terabaikan. Padahal, dampak dari serangan XXE bisa sangat fatal, mulai dari pembacaan file sensitif di server, melakukan serangan Server-Side Request Forgery (SSRF), hingga Denial of Service (DoS) yang melumpuhkan aplikasi Anda.

Artikel ini akan membawa Anda memahami apa itu XXE, bagaimana penyerang mengeksploitasinya, dan yang terpenting, strategi praktis untuk melindungi aplikasi web Anda dari ancaman tersembunyi ini. Mari kita jaga aplikasi kita tetap aman, bahkan dari ancaman yang mungkin terlihat “kuno”!

2. Apa itu XML External Entity (XXE)?

Untuk memahami XXE, kita perlu sedikit menyegarkan ingatan tentang dasar-dasar XML, khususnya konsep “Entities” dan “DTD” (Document Type Definition).

XML Entities adalah cara untuk merepresentasikan unit data dalam dokumen XML. Mereka mirip dengan variabel atau makro. Ada dua jenis utama:

Deklarasi entity ini dilakukan di dalam Document Type Definition (DTD), yang merupakan bagian dari dokumen XML yang mendefinisikan struktur dan elemen yang diizinkan.

Contoh deklarasi external entity:

<!DOCTYPE foo [ <!ENTITY external_file SYSTEM "file:///etc/passwd"> ]>

Di sini, external_file dideklarasikan sebagai external entity yang akan memuat konten dari file /etc/passwd di sistem operasi Linux. Jika XML parser yang memproses dokumen ini dikonfigurasi untuk mengizinkan dan memproses external entities, maka saat entity &external_file; direferensikan di dalam dokumen, konten dari /etc/passwd akan disisipkan.

⚠️ Masalahnya? Banyak XML parser lama atau yang dikonfigurasi secara default mengizinkan pemrosesan external entities. Ini membuka pintu bagi penyerang untuk menyuntikkan referensi ke sumber daya yang tidak seharusnya diakses oleh aplikasi Anda.

3. Bagaimana Serangan XXE Bekerja?

Serangan XXE mengeksploitasi kemampuan XML parser untuk memproses external entities. Penyerang akan mengirimkan input XML yang dibuat khusus untuk memaksa parser membaca data dari lokasi yang tidak diinginkan.

Berikut adalah beberapa skenario serangan XXE yang umum:

Contoh Skenario 1: Membaca File Lokal (Local File Disclosure)

Ini adalah bentuk serangan XXE yang paling umum dan mudah dipahami. Penyerang mencoba membaca file sensitif di sistem server.

🎯 Tujuan Penyerang: Mengakses file konfigurasi, kode sumber, data pengguna, atau informasi sistem lainnya.

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>
  <name>&xxe;</name>
  <email>attacker@example.com</email>
</user>

Jika aplikasi memproses XML ini dan mengembalikan konten dari elemen <name>, penyerang akan menerima isi dari file /etc/passwd. Bayangkan jika file yang dibaca adalah /etc/shadow (berisi hash password), kunci SSH, atau file konfigurasi database!

Contoh Skenario 2: SSRF (Server-Side Request Forgery) melalui XXE

Serangan XXE juga bisa digunakan untuk melakukan SSRF, di mana server dipaksa untuk membuat permintaan ke sumber daya internal atau eksternal yang tidak seharusnya diakses.

🎯 Tujuan Penyerang:

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-role">
]>
<invoice>
  <id>&xxe;</id>
  <amount>100</amount>
</invoice>

Jika aplikasi memproses XML ini, server akan mencoba mengambil data dari http://169.254.169.254/latest/meta-data/... (alamat IP khusus untuk metadata AWS EC2). Jika berhasil, penyerang bisa mendapatkan kredensial AWS sementara yang sangat berbahaya.

Contoh Skenario 3: Denial of Service (DoS) / Billion Laughs Attack

Serangan ini bertujuan untuk melumpuhkan server dengan membuat XML parser mengkonsumsi sumber daya komputasi (CPU, memori) secara berlebihan.

🎯 Tujuan Penyerang: Membuat aplikasi atau server tidak responsif.

<?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;">
  <!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>

XML ini mendefinisikan entity lol yang berisi “lol”. Kemudian lol2 berisi sepuluh lol, lol3 berisi sepuluh lol2, dan seterusnya. Ketika parser mencoba menyelesaikan &lol9;, ia akan mencoba memperluas string “lol” sebanyak 10^9 kali, yang akan dengan cepat menghabiskan memori dan CPU server, menyebabkan DoS.

4. Mengidentifikasi Kerentanan XXE di Aplikasi Anda

Mendeteksi XXE mungkin tidak semudah XSS atau SQL Injection karena XML tidak selalu terlihat di frontend. Namun, ada beberapa indikator dan pendekatan:

5. Strategi Pencegahan XXE yang Efektif

Kabar baiknya, pencegahan XXE relatif mudah: 📌 Prinsip Utama adalah menonaktifkan pemrosesan External Entities dan DTD secara default pada XML parser Anda.

Berikut adalah tips praktis untuk berbagai bahasa/framework: