XML External Entity (XXE) and XML Injection (XMLI)

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İ Zaafiyeti nasıl çalışır?
 
Bir siteye girdiğimizde ve herhangi bir işlem yapmaya başladığımızda client ile server arasında paslaşmalar başlar. XML zaafiyetinin çalışma mantığı da söz edilen paslaşmadan pek farklı değildir, bizim isteklerimiz karşı taraftaki sunucuya gider ve giderken clientin yaptığı isteği de beraberinde götürür ardından sunucu gelen isteği parse ederek yani kendince yorumlayarak tekrar cliente gönderir. İste tam da bu sırada client sunucuya istek yaparken gönderilen XML verisinin manipüle edilmesi ile sunucu gelen isteği parse ederek cliente yollar fakat geri yollanan veriler artık manipüle edilmiştir. Sunucuya gönderilen verilerin manipüle edilmesi için BurpSuite aracı kullanılabilir.
 
 
 
 

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.

 

asd

 

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();

Okuduğunuz için teşekkürler 🙂

Kaynaklar

[1] https://tr.wikipedia.org/wiki/XML

[2] https://www.acunetix.com/blog/articles/xml-external-entity-xxe-vulnerabilities/

[3] https://www.owasp.org