<summary><strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
* **Şirketinizi HackTricks'te reklamını 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!
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı adlandırılmış etiketlerin kullanımına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiketlerle sınırlı olmamasıyla farklılık gösterir. JSON'ın yükselişiyle XML'in önemi azalmıştır, ancak başlangıçtaki AJAX teknolojisindeki rolüyle.
* **Varlıklar Aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` gibi özel karakterler de dahil olmak üzere verinin temsil edilmesini sağlar; bu karakterler, `<` ve `>` ile çakışmayı önlemek için kullanılır.
* **XML Elemanlarının Tanımlanması**: XML, eleman türlerinin tanımlanmasına izin verir, elemanların nasıl yapılandırılması gerektiğini ve hangi içeriğe sahip olabileceğini belirler, her türden içerikten belirli çocuk elemanlara 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ö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şeleri doğurur; 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 XML parametre varlıkları kullanılabilir. Bu varlıklar, DNS sorgularını tetikleyerek veya HTTP isteklerini kontrol edilen bir alan adına yaparak zafiyeti doğrulamak için dış-band tespit tekniklerine izin verir.
[**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)
**Önceki 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, sunucuyu, bir dosyanın içeriğini bir HTTP isteği aracılığıyla gönderecek kötü amaçlı bir yük taşıyan yeni bir DTD yüklemeye zorlayacağız (**çok satırlı dosyalar için bunu örneğin şu temel sunucu kullanarak **_**ftp://**_** üzerinden dışarıya çıkarabilirsiniz** [**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 varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
* Başka bir XML parametre varlığı, `%eval`, tanımlanır. Dinamik olarak yeni bir XML parametre varlığı, `%exfiltrate`, 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.
2.**Varlıkların Yürütülmesi:**
*`%eval` varlığı kullanılarak, `%exfiltrate` varlığının dinamik bildiriminin yürütülmesine yol açılır.
* Daha sonra `%exfiltrate` varlığı kullanılarak, dosyanın içeriği ile belirtilen URL'ye HTTP isteği başlatılır.
Bu payload, bir XML parametre varlığı`%xxe` 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 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ında 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 Document Type Definition (DTD) kullanılarak, bir XML ayrıştırma hatası mesajı tetiklenerek `/etc/passwd` dosyasının içeriği ortaya çıkarılabilir. 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 parametre varlığı tanımlanır.
2. Dinamik bir bildirim içeren `eval` adlı başka bir XML parametre varlığı tanımlanır. Bu `error` varlığı, değerlendirildiğinde, `file` varlığının içeriğini adı olarak içeren bir olmayan dosya yükleme girişiminde bulunur.
4.`error` varlığının çağrılması, bir olmayan dosya yükleme girişiminde bulunur ve `/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çeride yeniden tanımlanmasına izin vererek hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış bir DTD'de orijinal olarak deklare edilen bir XML parametre varlığının iç DTD içinden yeniden tanımlanmasını sömürür. Sunucu tarafından dış bağlantılar engellendiğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri ortaya çıkarmak için ayrıştırma hatası oluşturmayı amaçlarlar.
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:
* Harici DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanımlama gerçekleşir ve [hata tabanlı XXE saldırısını](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsayacak şekilde tasarlanmıştır. Bu yeniden tanımlama, `/etc/passwd` dosyasının içeriğini ortaya çıkarmak için bir ayrıştırma hatası oluşturmayı amaçlar.
*`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 gerekir**. Bunun için aynı**İşletim Sistemi / Yazılımı yükleyerek** sunucunun kullandığı ve **bazı varsayılan DTD'leri arayabilirsiniz**, veya sistemler içindeki **varsayılan DTD'lerin bir listesini alabilir** 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'sini](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. Daha önce 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 destekler.
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.
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 sarmalayıcıları**`php://filter/convert.base64-encode/resource=` kullanarak **dahili dosyalara erişebilirsiniz**.
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 ilham alınarak oluşturulmuştur.
XLIFF (XML Localization Interchange File Format), veri değişimini standartlaştırmak için kullanılan bir formattır. Genellikle yerelleştirme süreçlerinde yerelleştirilebilir verilerin araçlar arasında 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'in kullanıldığını gösterdiğini ortaya koyar. Bu Java sürümünün bir kısıtlaması, /etc/passwd gibi bir yeni satır karakteri içeren dosyaları Out of Band tekniğini kullanarak alamaması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, 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 Bağlam Dışı Hem de Hata Tabanlı teknikleri kullanan başarılı bir XXE (XML Dış Entity) saldırısını gösterir.
XML dış varlık enjeksiyonu (XXE) saldırıları, kötü niyetli XML dış varlıklarını yüklemek için kullanılır. Bu saldırılar, hedef sistemin hassas bilgilerini ifşa etmek veya hedef sistemdeki dosyaları okumak gibi zararlı eylemleri gerçekleştirmek için kullanılabilir.
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.
Bu sınıf, işletim sisteminde yeni bir işlem başlatmak için kullanılır. Ayrıca, işlemle etkileşim kurmak için giriş ve çıkış akışlarını yönlendirmek için de kullanılabilir.
* Kendi harici DTD'sini 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>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!