- 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 XMLin 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:
Örnek senaryoda sunucu tarafında gelen XML verisini parse edip ekrana basan aşağıdaki gibi basit bir PHP kodu bulunuyor.
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.
Ö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.
Ö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.
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 PHPnin expect (PECL :: Package :: expect) modülü kuruluysa
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:
Ö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;?>
Kod:
<?xml version=1.0″ ?><tag>test</tag>
Kod:
<?xml version=1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM file:///etc/passwd>]><tag>&ups;</tag>
Kod:
xml version=1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM php://filter/read=convert.base64-encode/resource=/etc/passwd>]><tag>&ups;</tag>
Kod:
<?xml version=1.0″?><!DOCTYPE tag [<!ENTITY ups SYSTEM expect://whoami>]><tag>&ups;</tag>
ASP.NET ile XXE Senaryosu:
ASP.NET ve C# ile XXE zafiyetini örneklendirmek için sunucu tarafında aşağıdaki kod kullanılmıştır.
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 XMLdeki DTD/DOCTYPE elemanlarının yorumlanması sağlanıyor.
Sunucuya gönderilen sıradan bir XML
XXE payloadı içeren bir XML
XXE ile SSRF Saldırısı
Blind XXE
Birçok XXE güvenlik açığı örneği blinddı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.
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 parserları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.
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());}
Sunucuya gönderilen sıradan bir XML
Kod:
<?xml version=1.0″?><tag>test</tag>
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 URLyi 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 URLden gelen yanıtı görebilecek ve böylece backend kısmında two-way etkileşim kazanabiliriz.
Blind XXE
Birçok XXE güvenlik açığı örneği blinddı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.
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 parserları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: