XML External Entity (XXE)

XML External Entity (XXE) adalah jenis kerentanan keamanan yang muncul dari cara pemrosesan data XML yang tidak aman. XXE dapat mengekspos sistem terhadap berbagai risiko, termasuk pembocoran data, serangan denial-of-service (DoS), dan RCE.
Sejarah
Kerentanan XXE pertama kali diidentifikasi dan dieksploitasi pada awal 2000-an. Seiring dengan perkembangan teknologi dan adopsi XML dalam berbagai aplikasi web dan sistem, kerentanan ini menjadi semakin relevan. XXE muncul ketika pemrosesan dokumen XML memungkinkan entitas eksternal untuk diakses atau diproses tanpa pengamanan yang memadai.
Cara Kerja XXE
Kerentanan XXE terjadi ketika aplikasi yang memproses XML memperbolehkan referensi entitas eksternal yang dapat menyebabkan eksekusi atau akses data yang tidak diinginkan. Sebagai contoh, jika aplikasi menerima dokumen XML yang berisi referensi entitas eksternal, dan server XML memproses referensi tersebut, data sensitif atau file sistem dapat diakses atau diungkapkan.
Contoh HTTP Request
Misalkan aplikasi menerima dokumen XML berikut:
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<name>&xxe;</name>
</root>
Jika aplikasi memproses dokumen ini dengan tidak aman, isi dari file /etc/passwd
dapat diakses dan dimasukkan dalam respons HTTP, menyebabkan kebocoran data sensitif.
Dampak
Kerentanan XXE dapat memiliki berbagai dampak, tergantung pada bagaimana dan di mana kerentanan ini dieksploitasi:
- Pembocoran Data: Informasi sensitif dari file sistem atau data internal dapat diakses dan diungkapkan.
- Denial-of-Service (DoS): Penyerang dapat menyebabkan aplikasi atau sistem menjadi tidak responsif dengan mengirimkan dokumen XML yang berisi referensi entitas besar atau berulang.
- RCE: Dalam beberapa kasus, XXE dapat digunakan untuk mengeksploitasi sistem dan menjalankan kode berbahaya.
Cara Mencegah XXE
PHP
Untuk mencegah kerentanan XXE di PHP, pastikan untuk menonaktifkan pemrosesan entitas eksternal saat menggunakan parser XML. Berikut adalah contoh cara melakukannya dengan DOMDocument
:
$doc = new DOMDocument();
$doc->loadXML($xmlData, LIBXML_NOENT | LIBXML_DTDLOAD);
Dalam kode di atas, LIBXML_NOENT
dan LIBXML_DTDLOAD
digunakan untuk menghindari pemrosesan entitas eksternal.
Java
Di Java, Anda dapat mencegah XXE dengan menonaktifkan pemrosesan entitas eksternal pada parser XML. Contoh penggunaan DocumentBuilderFactory
:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlData)));
Pengaturan http://apache.org/xml/features/disallow-doctype-decl
memastikan bahwa deklarasi DOCTYPE tidak diproses.
Python
Di Python, saat menggunakan lxml
atau xml.etree.ElementTree
, pastikan untuk menonaktifkan pemrosesan entitas eksternal. Contoh dengan lxml
:
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse(xml_file, parser)
Dengan resolve_entities=False
, entitas eksternal tidak akan diproses oleh parser.
Kesimpulan
Entitas Eksternal XML (XXE) adalah kerentanan keamanan yang signifikan yang dapat mengekspos sistem terhadap berbagai risiko, termasuk kebocoran data dan serangan denial-of-service. Dengan memahami cara kerja kerentanan ini dan menerapkan langkah-langkah pencegahan yang sesuai, pengembang dapat melindungi aplikasi dan sistem mereka dari serangan yang dapat memanfaatkan kelemahan dalam pemrosesan XML.