Tanım:
XXE (XML External Entity), XML veri işleme sırasında ortaya çıkan bir güvenlik açığıdır. Saldırganlar, XML parser'ların dış kaynakları (ör. dosya sistemleri, harici URL'ler) okuma yeteneğini kötüye kullanarak hassas verileri sızdırabilir, sunucu tarafında istek başlatabilir (SSRF) veya hizmet aksaklığına (DoS) neden olabilir.
XML, DTD (Document Type Definition) aracılığıyla "entity" adı verilen yapılar tanımlamaya izin verir. Bu entity'ler harici kaynaklara işaret edebilir. Güvenliği yapılandırılmamış bir XML parser, bu entity'leri işlediğinde saldırganlar hedef sisteme zarar verebilir.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<userInfo>
<name>&xxe;</name>
</userInfo>
- Açıklama:
<!DOCTYPE foo [...]>
: DTD bloğu içindexxe
adlı bir entity tanımlanır.SYSTEM "file:///etc/passwd"
: Entity, sunucunun/etc/passwd
dosyasını okur.&xxe;
: Entity, parser tarafından dosya içeriğiyle değiştirilir.
- Zararlı XML Oluşturma: Saldırgan, harici bir entity içeren XML verisi hazırlar.
- XML Gönderimi: Bu veri, hedef uygulamaya (ör. bir SOAP/XML-RPC API) gönderilir.
- Parser'ın Entity'yi İşlemesi: Güvenliği yapılandırılmamış parser, entity'yi çözümler ve harici kaynağı okur.
- Veri Sızıntısı: Okunan veri, yanıtta görüntülenir veya saldırganın sunucusuna gönderilir.
- Klasik XXE: Dosya okuma veya SSRF (ör.
file://
,http://
). - Blind XXE: Yanıtta veri görünmez; veri exfiltration için harici bir sunucu kullanılır (DNS/HTTP istekleri).
- Billion Laughs: Özyinelemeli entity'lerle kaynak tüketimi (DoS).
<!ENTITY a "lol"> <!ENTITY b "&a;&a;&a;&a;&a;"> <!ENTITY c "&b;&b;&b;&b;&b;">
- Hassas Veri Açığa Çıkması:
/etc/passwd
,.ssh/id_rsa
, veritabanı yapılandırma dosyaları. - SSRF (Server-Side Request Forgery): Dahili ağda tarama veya AWS metadata'ya erişim.
- Hizmet Aksaklığı (DoS): Bellek/CPU tüketimi.
- Uzaktan Kod Çalıştırma (Nadir): PHP "expect" modülü gibi durumlarda.
XML parser'larını, DTD ve harici entity'leri işlemeyecek şekilde yapılandırın.
Örnek Kodlar:
-
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);
-
Python (lxml):
from lxml import etree parser = etree.XMLParser(resolve_entities=False)
-
PHP:
libxml_disable_entity_loader(true);
XML yerine JSON tercih edin ve JSON.parse
kullanın.
Kullanıcıdan gelen XML verilerindeki <!DOCTYPE>
ve <!ENTITY>
ifadelerini filtreleyin.
OWASP ZAP, Burp Suite veya Checkmarx ile açık taraması yapın.
-
Zorluk 1: Legacy sistemlerde harici entity'lerin devre dışı bırakılamaması.
Çözüm: WAF (Web Application Firewall) ile<!ENTITY
içeren istekleri engelleyin. -
Zorluk 2: Uygulamanın DTD kullanma zorunluluğu.
Çözüm: Sadece whitelist'teki entity'lere izin verin.
- Manuel Test:
file:///etc/passwd
veyahttp://attacker.com
içeren XML gönderimi. - Otomatik Araçlar: Burp Suite (Active Scan), OWASP ZAP, XXEinjector.
XXE, XML parser'larının yanlış yapılandırılmasından kaynaklanan kritik bir açıktır:
- Harici entity'leri devre dışı bırakın.
- DTD kullanımını sınırlayın.
- Düzenli güvenlik testleri yapın.