XXE (XML External Entity) Injection Zafiyeti - Kasım Feke

Merhaba Arkadaşlar
Bu yazımda hakkında fazla Türkçe kaynak bulunmadığını gördüğüm XXE injection zafiyetinden bahsetmeye çalışacağım, umarım faydalı olur :)

XML ve Entity Nedir ?
XXE injection zafiyetini daha iyi anlayabilmek için XML ve Entity’den kısaca bahsedilmesi yerinde olacaktır.

 

Örnek XML dosyası

XML’in açılımı Extensible Markup Language, Türkçe olarak Genişletilebilir İşaretleme Dili dir. Farklı sistemler arasında veri iletimi yapılabilinmesini sağlamaktadır. XML’i HTML’den ayırt edilebilir hâle getiren en önemli özelliği taglerin belirlenebilmesidir(kurallar çerçevesinde). XML genellikle B2B kapsamında e-ticaret siteleri arasında veri iletimi sağlamak için kullanılmaktadır, bu sayede alıcı firma satıcı firmanın ürünlerini manuel olarak girmek zorunda kalmamaktadır ve örnek vermek gerekir ise ürünlerin fiyatları gibi verileri düzenleyebilmektedir.
Entity’den kısaca bahsetmek gerekir ise veritabanında bulunan tablolardaki her kayıt entity olarak adlandırılır ve veritabanı modellemesi için kullanılır.

XXE (XML External Entity) Injection
Türkçe’ye çevrildiğinde XML dış varlık enjeksiyonu anlamına gelmektedir. OWASP, XXE başlığı altında referans olarak XML injection ismini de kullanmaktadır. Bu zafiyet XML verilerini parse ederken özel olarak tanımlanmış entity çağırılması ile tetiklenir. XML verilerinin parse edilmesi o verilerin uygulamalar tarafından anlaşılabilir hâle getirilmesi işlemidir. Zafiyetin sömürülmesi için XML kütüphanesinin özel olarak entity tanımlama ve çağırmaya izin vermesi gerekmektedir, bazı kütüphanelerde default olarak bu özellik açık gelmektedir.

XXE Zafiyeti ile Yapılabilecekler
Hedef sistemde passwd gibi hassas dosyalar okunabilir, dos attack, port tarama, ssrf gibi ciddi saldırılar yürütülebilir ve hatta PHP expect modülü yüklenmiş ise uzaktan kod çalıştırılabilir.

XXE Injection Demoları
1-)

İlk demomuzu hack.me üzerinden yapacağız http://s70972-101587-z16.croto.hack.me/index.html adresinde basit bir login sayfası hazırlanmış “Log In” dedikten sonra burp suite proxy yazılımı ile araya giriyoruz. (Yapılacak demolarda Burp Suite kullanılacaktır, dilerseniz OWASP ZAP gibi farklı proxy yazılımları tercih edebilirsiniz)

 

İşlem kolaylığı olması bakımından “Action > Send to Repeater” yolunu izleyerek Request’i Repeater’a gönderiyoruz.

 

Login veya password taglerinde Go butonu aracılığı ile herhangi bir veri göndermediğimizde kullanıcı adı veya parola yanlıştır tarzında bir cevap dönüyor. Acaba login taginde “test” kelimesini gönderirsek nasıl bir sonuç ile karşılaşırız?

 

Test olarak gönderdiğimizde X-Auth-Policy(Kimlik Doğrulama Politikası) olarak base64 ile encode edilmiş bir hash dönüyor, bu hashi decode ederek plain-textinin ne olduğunu görelim.

 

Hashimizi işaretledikten sonra sağ tıklayarak “Convert selection > Base64 > Base64-decode” yolundan decode ediyoruz. https://www.base64decode.org gibi online decoderlardan da bu işlemi gerçekleştirebilirsiniz.

 

Hashimizi decode ettikten sonra gördüğümüz plain-text de storage(depo): secret.txt , path(dosyanın bulunduğu yer): / ana dizindeymiş , principal: token(secret.txt de karşılaşacaklarımızın token olduğunu belirtiyor)

 

Secret.txt dosyamızın ana dizinde olduğunu öğrendik, dosyamıza erişim sağladığımızda tokenların altında tebrikler beni hackledin tarzında bir yorum geçilmiş.

2-) Bu demomuzu da Acunetix tarafından hazırlanmış bir test ortamı olan http://testhtml5.vulnweb.com üzerinden gerçekleştirelim.

 

İlk olarak yapacağımız işlem login sayfasından zafiyetin barındığı kısım olan forgot pwd yani parolanızı mı unuttunuza tıklayarak burp suite ile araya girmektir ve ilk demomuzda yapmış olduğumuz gibi Request’i Repeater’a gönderiyoruz.

 

Xml kullanılarak veri iletildiğini rahatlıkla gözlemleyebiliyoruz ve admin olarak giriş yaptığımızdan dolayı response olarak admin dönüyor.

 

<!DOCTYPE Deneme [<!ENTITY deneme “kasimfeke”>]>” payloadında deneme değişkenini belirliyoruz ve kasimfeke adında bir stringin bastırılmasını istiyoruz. Hazırlamış olduğumuz payloadımızı enjekte ediyoruz ve Response’a baktığımızda XML ayrıştırıcısının gönderdiklerimizi ayrıştırarak kasimfeke stringini bastırdığını görmekteyiz. Bu durum XXE injection zafiyetinin var olduğunu ve herhangi bir önlem alınmadığını göstermektedir.

3-) Son demomuzu PentesterLab tarafından hazırlanmış olan Web For Pentester üzerinden gerçekleştirelim.

 

URL incelendiğinde xml adında bir parametre olduğunu ve test tagleri arasına girilen verinin xml parametresine atanarak sayfaya bastırıldığını görüyoruz. Herhangi bir tag olmadan ‘KASIM’ girmeyi deneyelim ve sonuca bakalım.

 

‘<’ ile başlayan bir tag olmadığına dair hata ile karşılaşıyoruz, XML’de taglerin özelleştirilebildiğini görmüştük yazılımcının kullanmış olduğu test tagleri haricinde biz de deneme tagleri arasına string girerek göndermeyi deneyelim.

 

Başarılı bir şekilde KASIM stringini bastırdık, bu durumdan hareket ile payloadımızı hazırlayarak enjekte etmeye çalışalım.

 

Payloadımız: <!DOCTYPE deneme [<!ENTITY kasimfeke SYSTEM “file:///etc/passwd”>]><deneme>&kasimfeke;</deneme>
Önceki demolarımızdan farklı olarak linuxda kullanıcı bilgilerinin saklandığı, yetkisiz birisinin eline geçmesi hâlinde sistemde ciddi zararlara sebebiyet verebilecek olan etc klasörü altındaki passwd dosyasına ulaşmaya çalıştığımızda hata alıyoruz. Bu hatayı bypass türlerinde en çok kullanılan yöntem olan URL Encode ile aşmayı deneyelim.

 

Payloadımızın encode edilmiş hali:
%3C%21DOCTYPE%20deneme%20%5B%3C%21ENTITY%20kasimfeke%20SYSTEM%20%22file%3A%2F%2F%2Fetc%2Fpasswd%22%3E%5D%3E%3C
deneme%3E%26kasimfeke%3B%3C%2Fdeneme%3E
Bu işlemi https://www.urlencoder.org/ gibi online toollar ile gerçekleştirebilirsiniz.
Görmüş olduğumuz üzere URL Encode yöntemini uygulayarak passwd dosyasına erişmiş olduk.

XXE injection için alınabilecek önlemler
1-) En güvenli yol DTD(Document Type Definition)’leri ayrıştırıcıya bağlı olarak Java’da buna benzer yöntem ile tamamen devre dışı bırakmaktır: Factory.setFeature (“http://apache.org/xml/features/disallow-doctype-decl”, true);
2-) PHP’de ise “bool libxml_disable_entity_loader ([ bool $disable = true ] )” şeklinde libxml uzantılarını devre dışı bırakabilirsiniz.
Detaylı bilgi için OWASP’ın: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet sayfasını inceleyebilirsiniz.