XML Nedir ?
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.[1]
XML dokumanları ağaç veri yapısında olurlar. Bağımsız imler yapıyı oluştururken, içerik ya imin özelliği olarak ya da iki im arasında gösterilir. Yapıyla ilgili ayrıntılar DTD (Document Type Definition) ya da XML Schema adı verilen harici dokümanlar ile tanımlanır. Örnek bir XML dökümanı :[2]
<?xml version=”1.0″ encoding=”UTF-8″?>
<note>
<to>Kevin</to>
<from>Worm</Ffrom>
<heading>Reminder</heading>
<body>Don’t forget me this weekend!</body>
</note>
Kevin Worm Reminder Don't forget me this weekend!
XMLİ ve XEE zaafiyeti ile neler yapılabilir?
Hedef siteten gelen response a göre sistemin passwd dosyası listelenebilir, gerekli önlem alınmamışsa herhangi bir shell yüklenebilir veya XSS uygulanabilir. Fakat zaafiyetten faydalanabilmek için XML ile gelen kütüphanelerin içinde entity kütüphanesinin dahil edilmesi ve açık olması gerekmektedir.
XML verisini manipüle etmek için BurpSuite aracını localhost’ u dinleyecek şekilde açıyoruz. Ardından hedef sitenin ( burada Webgoat kullanılmıştır ) XML verisi içerebilecek alanına istek yolluyoruz. Bundan sonrasını BurpSuite bizim için helledecektir.
Yakalanan istekte de görüldüğü gibi Content-Type : TEXT/ XML dir. Yani hedefimiz XML ile bir şeyler çeviriyor.
Ardından isteğe kendi verimizi XML ekleyip forward ediyoruz ve hedefimize baktığımızda sunucu değiştirilmiş isteği parse edip bize yollayacaktır.
Örnek XML verisi :
“><reward>XML İnjection is success</reward>”
“><username>write script</username>”
XXE ve XMLİ Zafiyetine Karşı Önlem Alma
Çalışma mantığına göre clientten gelen veriyi sunucumuz parse ediyordu. Burada enjeksiyona uğramış verimiz de sorunsuz bir şekilde parse edildi fakat server taraflı korumada gelen veriyi belirli şartlar ile parse ederek tekrar clienta yollayabiliriz yani “çift tırnak” ve ‘tek tırnak’ karakterini silebiliriz. Fakat bu önlem yeterli değildir çünkü client tarafından gelen her veriyi şüpeli olarak tanımlayıp yeniden düzenlemek gerekecekdir. Örnek olarak .NET ile yazılmış bir XML reader kod parçası
XmlReader reader = XmlReader.Create("deneme.xml"); XPathDocument doc = new XPathDocument(reader); XPathNavigator nav = doc.CreateNavigator(); string xml = nav.InnerXml.ToString();
Kaynaklar
[1] https://tr.wikipedia.org/wiki/XML
[2] https://www.acunetix.com/blog/articles/xml-external-entity-xxe-vulnerabilities/