Bu yazı 14.01.2020 tarihinde kaleme alınmıştır.
Bu yazıda XXE’nin sebep olduğu zafiyetler nelerdir ve nasıl exploit edilir sorularına cevap arayacağız.
XXE’yi anlayabilmek için öncelikle XML nedir onu anlamamız gerekmektedir.
XML (Extensible Markup Language) Nedir?
XML, açılımı ile Extensible Markup Language Genişletilebilir İşaretleme Dili anlamına gelmektedir. Yaratıcısı ise HTML’in yaratıcısı olan ve hepimizin tanıdığı bildiği Tim Berners Lee’dir.
XML, W3C (World Wide Web Consortium) tarafından tasarlanmış bir veri iletişimi ve veri saklama standardıdır. XML sayesinde farklı sistemler arasında veri alışverişi sağlanabilmektedir.
Tanım yapacak olursak:
Extensible Markup Language (Genişletilebilir İşaretleme Dili, kısaca XML), hem insanlar hem bilgi işlem sistemleri tarafından kolayca okunabilecek dokümanlar oluşturmaya yarayan bir işaretleme dilidir. W3C tarafından tanımlanmış bir standarttır. Bu özelliği ile veri saklamanın yanında farklı sistemler arasında veri alışverişi yapmaya yarayan bir ara format görevi de görür. SGML’in basitleştirilmiş bir alt kümesidir.
Günümüzde birçok yazılım, diğer yazılımlarla veri alışverişini XML formatı üzerinden yapmaktadır. Ayrıca XML’i esas format olarak kullanan uygulamalara rastlamak mümkündür. Rastgele veri erişimine uygun olmadığından veri tabanı amaçlı kullanılmamaktadır.
Microsoft’un geliştirdiği .NET teknolojisinde kullanılan DataSet nesneleri XML formatındadır. Ayrıca XML, ofis uygulamalarının alt yapısı haline getirilmiştir.
İçeriğin, doküman yapısının ve şeklin birbirinden ayrı ele alınması XML’i İçerik yönetim sistemlerinin ideal formatı haline getirmiştir.Daha net anlaşılabilmesi adına somut bir örnek ile devam edelim.
Diyelim ki içerik yönetiminden sorumlu olduğum bir e-ticaret sitesi var. Bu e-ticaret sitesinde Türkiye’nin en iyi 8 markasının halıları satılıyor. Her markanın yaklaşık 100’ün üzerinde modeli ve her modelin yaklaşık 15 farklı çeşidi ve her çeşidin de en az 7 farklı ölçüsü var.
Bu durumda elimizde siteye yüklenmesi gereken yaklaşık:
• 8 marka• 800 model• 12.000 çeşit• 84.000 ölçü
Ürün var demektir. Tüm bu ürünlerin 1 hafta gibi kısa bir sürede siteye eklenmesinden sorumlu olsaydınız bunu yapabilir miydiniz?
Eğer ürünleri tek tek girmeye kalkarsanız ve her bir ölçüye 2 dakika harcadığınızı düşünürsek 168.000 dakikada tüm ürünleri girebilirdiniz.
Peki 168.000 dakika ne demek?
• 2.800 saat• 116 gün• 3,8 ay demektir.
İşte tam burada XML bir kurtarıcı oluyor. Tüm ürünlerinizi uygun bir XML formatında toparlarsanız, tek bir XML dosyasını e-ticaret sitesine upload ederek ürünlerinizi çok kısa zamanda ekleyebilirsiniz.
Buradan bakınca harika gibi gözükse de her sistemi olumlu ve olumsuz yanları ile incelemek gerekir. Genel bir çerçeve olması açısından olumlu ve olumsuz yanlarına bakalım.
Olumlu Yanları:
• XML entegrasyonu ile dinamik ve hızlı e-ticaret siteleri• Evrensel dilde etiketler belirleme ve anlaşılabilirlik• Her sistemde çalışabilir olması çalışabilirlik açısından bir bağımlılığının olmaması• Birbirinden farklı sistemler arasındaki uyumluluğu, optimizasyonu• Öğrenilmesi kolay olması• İçerisindeki verilere erişimin kolay olması. Bu sayede geliştirilecek uygulamalarla kolay çalışabilmesi.
Olumsuz Yanları:
• XML verinin nasıl işleyeceğini tanımlamaz.• XML kendi başına harikalar yaratamaz. XML onu işleyecek ayrıştırıcılara ve uygulamalara gereksinim duyar.• Beraberinde getirdiği güvenlik açıkları
En önemli nokta burada oluşan güvenlik açığı kısmıdır.
XXE (XML External Entity) Nedir?
XML içerisinde yer alan verilerin parse edilirken özel olarak tanımlanmış entity çağırılması ile tetiklenen açığa XXE injection denmektedir.Bu açığı anlayabilmek için yine anlamamız gereken birkaç kavram daha bulunmaktadır.
Document Type (DOCTYPE)
Her XML dosyası içerisinde DOCTYPE adı verilen “entity” yani varlık vardır. DOCTYPE varlığı içerisinde bazı bilgileri bize belirtir. Bunlar; dosyada işlenen belgenin türü, belgeyi oluşturan etiketlerin tanımlandığı paketin ismi ve sürümü, nerede bulunabileceği, belgeyi oluşturan ek dosyaların tanımları vb.
Document Type Definiton (DTD)
Her ne kadar XML’in kendisinin belirli bir standartı olmasa da iki platform arasında veri taşınırken bu veriler ortak bir iletişim standardına göre taşınmak zorundadır. Bu nedenle kullanılan bu yapıya DTD denmektedir. DTD ile belirli bir sistem için standartlar tanımlanabilmektedir.
DTD bir kurallar dizisi olarak düşünülecek olursa biz DTD’mizi bir XML içerisinde veya harici bir .dtd dosyasında bulundurabiliriz. Bunu da Internal ve External olarak iki ayrı sınıfa ayırabiliriz.
Daha net anlaşılması açısından kısa bir DTD örneği paylaşalım.
Yukarıdaki örneği incelerseniz basit bir rehber oluşturduğumuzu görebilirsiniz.
Yakından baktığımızda bu XML dosyasının bir dtd örneği olduğunu ve içerisinde Parsed Character Data (#PCDATA) bulundurduğunu görebiliriz.
Public ve Private Farkı
Yazının başlarında bahsettiğimiz external dtd’ler public ve private olmak üzere ikiye ayrılmaktadır. Public kısmında dosya farklı bir adresten alınırken private kısmında ise adresleme iletişimi kurduğumuz sunucu üzerinden yapılmaktadır.
Exploit Örnekleri
Bazı önemli kavramları açıkladığımıza göre XXE Exploit kısmına geçebiliriz. XXE nedir kısmında kısa bir tanım yapmıştık. Şimdi bunu biraz daha açalım.
Karşımızda bir uygulama olduğunu ve bunun da XML kullandığını düşünelim. Bu uygulama XML verilerini işlerken bizim müdahalemize açık ise orada bir manipülasyon yapabilir miyiz? Hassas dosyalara ulaşabilir miyiz? Bu soruların cevabı evet.
XXE sunucu tabanlı bir zafiyet olup bir injection vakasıdır diyebiliriz.
XXE örneklerini lab ortamında incelemenin daha faydalı olacağını düşündük. Bu nedenle Web for Pentester üzerinden ilerlemeye devam edeceğiz.
Example 1:
Öncelikle karşımıza çıkan her sayfanın ilk önce kaynak kodunu incelememizde fayda var.
Karşımıza çıkan sayfa:
Kaynak Kodu:
URL’ye daha yakından bakalım:
192.168.254.130/xml/example1.php?xml=<test>hacker</test>
URL’yi incelediğimizde xml adında bir parametre var ve test etiketleri arasına girilen veriyi xml parametresine atayarak sayfada bize gösterdiğini gözlemleyebiliriz. Öncelikle şunu deneyelim, test etiketleri arasına bir şey yazarsak ne oluyor? “Hacker” yazısını silerek “serhan was here” yazalım.
192.168.254.130/xml/example1.php?xml=<test>serhan was here</test>
Sonuç olarak sayfada da yazımızı görebiliriz.
Şimdi burayı bozmaya çalışalım. XML’e farklı bir parametre girmeyi deneyelim. Mesela xml=serhan yapalım.
192.168.254.130/xml/example1.php?xml=serhan
Bunu yaptığımızda bize hata verdi. Ve biz hataları çok severiz çünkü bazen bu hatalar sayesinde sistem hakkında çok kapsamlı bilgiler elde edebiliriz.
Aldığımız hata çıktısı:
Hata çıktısını incelediğimizde vereceğimiz parametrenin “<” işareti ile başlamamasının bir sorun olduğunu gördük. O zaman onu kullanarak sistemin bu açığını kullanabiliriz. Bunun için de aşağıdaki payload’umuzu kullanalım.
<!DOCTYPE sb [<!ELEMENT sb ANY><!ENTITY serhan SYSTEM “file:////etc/passwd”>]><wsb>&serhan;</wsb>
Elbette bunu kullanmadan önce url encode ederek kullanalım ki herhangi bir önlem alınmışsa ona takılmayalım:
%3C%21DOCTYPE%20sb%20%5B%3C%21ELEMENT%20sb%20ANY%3E%3C%21EN TITY%20serhan%20SYSTEM%20%22file%3A%2F%2F%2F%2Fetc%2Fpasswd%22%3E %5D%3E%3Cwsb%3E%26serhan%3B%3C%2Fwsb%3E
Bu payload ile Linux sistemlerde bulunan ve ulaşılabildiğinde çok değerli bilgileri açığa çıkarabilecek /etc/passwd’ye erişmiş olduk.
Example 2:
Yine sayfamıza bir bakalım:
Kaynak kodu:
Name=hacker yazan yerde hacker yerine kendi adımızı yazıp deneyelim. Name=serhan yazdığımızda bize hiçbir şey dönmedi. Demek ki bir yerde bir şeyi atlıyoruz. Bir önceki örnekte yaptığımız gibi etiketle bunu deneyelim.
Kaynak koda detaylı baktığımızda x değişkeni ile bir XML haritası oluşturulduğunu görebiliriz. Daha sonra xml değişkenine, simplexml_load_string modülü ile x değişkeni atanmış. xpath değişkeni ile name etiketi içerisindeki veri GET isteği ile atanmış. While döngüsü ile de xpath değişkeninden gelen parametre ekrana bastırılmış.
Şimdi name kısmının bir parametre aldığını ancak admin veya hacker dışında bir şey yazdığımızda hata vereceğini anlıyoruz. O halde orada yazan hacker’ı kıllanarak bir şeyler yapmayı deneyebiliriz.
Bir de url’ye şunu girerek deneyelim: hacker’ or 1=1]/parent::node()/password%00
Ve sonucumuzu aldık.
XXE Saldırı Çeşitleri
1. Dosyalara Erişmek için XXE Kullanımı
Sunucunun sisteminden rastgele bir dosya çeken XXE injection saldırısı gerçekleştirmek için, gönderilen XML’yi iki yolla değiştirmemiz gerekir.
Dosyanın yolunu içeren ve harici bir varlık tanımlayan bir DOCTYPE öğesi düzenleyebiliriz ya da tanımlanan harici varlığı kullanmak için uygulamanın yanıtında döndürülen XML’deki veri değerini düzenleyebiliriz.
Örnek ile durumu somutlaştıralım. Yazının başında bahsettiğimiz halı satış sitesinde XML’i sunucuya göndererek bir halının stok seviyesini kontrol ettiğimi düşünelim:
Yukarıdaki bana stokları dönüyorsa aşağıdaki sizce neyi döner?
XXE saldırılarına karşı belirli bir savunma mekanizması oluşturmadıysam, kötü niyetli bir hacker yukarıdaki kodu çalıştırarak /etc/passwd’ye ulaşabilir.
2. 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.
3. 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.
4. XInclude Saldırısı
Bazı uygulamalar istemci tarafından gönderilen verileri alır, bunu sunucu tarafında bir XML belgesine ekler ve ardından o belgeyi ayrıştırır.
Bu durumda, klasik bir XXE saldırısı gerçekleştiremeyiz, çünkü tüm XML belgesini kontrol etmemiz ve bir DOCTYPE öğesi tanımlamamız veya değiştirmemiz mümkün olmaz. Ancak, bunun yerine XInclude saldırısı yapabiliriz. XInclude saldırısı, bir XML belgesinin alt belgelerden oluşturulmasına olanak sağlayan XML belirtiminin bir parçasıdır. XInclude saldırısını bir XML belgesindeki herhangi bir veri değerinin içine yerleştirebiliriz, böylece saldırı yalnızca sunucu tarafındaki bir XML belgesine yerleştirilmiş olacak ve tek bir veri öğesini kontrol ettiğimiz durumlarda gerçekleştirilebilir olacaktır.
Örnek verecek olursak:
5. Dosya Upload Ederek XXE Saldırısı Yapmak
Bazı uygulamalar sunucu tarafında daha sonra işlenen dosyaları kullanıcıların yüklemelerine izin verirler. Bazı yaygın dosya formatları XML kullanır veya XML alt bileşenlerini içerir. XML tabanlı formatlara örnek olarak DOCX gibi office belgesi formatları ve SVG gibi görüntü formatlarını verebiliriz.
Örneğin, bir uygulama kullanıcıların resim yüklemesine ve yüklendikten sonra bunları sunucuda işlemesine veya doğrulamasına izin verebilir. Uygulama PNG veya JPEG gibi bir format almayı beklese bile, kullanılan görüntü işleme kütüphanesi SVG görüntülerini destekleyebilir. SVG formatı XML kullandığından, saldırgan zararlı bir SVG resmi gönderebilir XXE açığını tetikleyebilir.
XXE Açığı için Alınabilecek Önlemler
1. XML işlemcisi ve kütüphaneleri her daim en son sürümde olması önerilmektedir.2. SOAP 1.2’nin altında bir sürümün çalıştırılmaması önerilmektedir.3. Uygulamada bulunan tüm XML parser’ların XML External Entity özelliğinin kapatılması önerilmektedir.4. “Whitelist” gibi çalışacak bir filtreleme sistemi kullanılması önerilmektedir.5. Neredeyse tüm XXE açıkları, uygulamanın XML ayrıştırma kütüphanesinin, uygulamanın ihtiyaç duymadığı ya da kullanmak istemediği potansiyel olarak tehlikeli XML özelliklerini desteklemesi nedeniyle ortaya çıkar. XXE saldırılarını önlemenin en kolay ve etkili yolu bu özellikleri devre dışı bırakmaktır. Bu özelliklerin devre dışı bırakılması önerilmektedir.6. Dış varlıkların çözümlenmesini devre dışı bırakmak ve XInclude desteğini devre dışı bırakmak önerilmektedir.
Kaynaklar:
https://tr.wikipedia.org/wiki/XML
https://canyoupwn.me/tr-xml-external-entity-xxe/
https://gaissecurity.com/yazi/xml-external-entity-injection-and-oob-out-of-band-data-retrieval