Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Canyoupwn.me ~

TR | XML External Entity (XXE)

XML EXTERNAL ENTITY(XXE)

Hakkında

Bu yazımızda XML EXTERNAL ENTITIY(XXE injection) kavramını ve atak türlerini anlatmaya çalışacağım. Aşama aşama hangi konuları inceleyeceğiz görelim:

  • XML nedir ?
  • XML kullanıldığı alanlar ?
  • XML avantaj ve dezavantajları nelerdir ?
  • XXE injection nedir ?
  • XXE saldırıları tarihsel örnekler
  • Test ortamlarında uygulamalı XXE injection attack çözümleri

XML Nedir ?

Xxe injection saldırısına geçmeden önce xml yapısını ve mantığını kavramak bu aşamada gerçekten önemlidir. İlk olarak xml nedir sorusuna cevap arayalım. Açılımı Extensible Markup Language (Genişletilebilir İşaretleme Dili) ‘ dir. XML W3C (World Wide Web Consortium) tarafından tasarlanmış  veri iletişimi ve veri saklama standardıdır. XML veri iletimi noktasında sistemlerin aynı dili konuşmasına olanak sağlaması olarak görülebilir. XML’in tasarımcısı HTML’i de tasarlamış olan Tim Berners Lee ‘ dir. XML’in HTML’den farklı olan noktasını öğrenirsek kafamızda daha iyi canlandırabiliriz. Örneğin Html sayfası tasarlarken önceden belirlenmiş tagları kullanırız. Fakat XML bu şekilde değildir. XML de belli kurallara göre taglari geliştirici kendisi belirlemektedir. Diğer önemli nokta ise html verinin sunumuyla ilgilenmektedir. Xml ise direk olarak verinin kendisiyle ilgilenmektedir. Yani html de verinin konumlandırılması, boyutlandırılması ele alınırken xml de direk olarak verinin kendisi ele alındığından verinin tanımı, bilgileri gibi özellikleri işlenmektedir. Farklı sistemlerdeki veri alışverişlerinde xml kullanımı yaygındır. Ayrıca html statik verileri döndürürken xml dinamik verileri saklayabilir. Html ‘ de hatalarla karşılaştığımızda çalışma durumlarında devamlılık görebiliriz. Fakat XML hatalara karşı kontrol sistemine sahiptir yani bir hata ile karşılaşıldığında çalışma durumu sonlanmaktadır. XML ve HTML birbirlerini tamamlayan unsurlar olarak görülebilir. Bir nevi XML HTML’in geliştirilmiş modeli olarak düşünülebilir.

<?xml version="1.0" encoding="utf-8"?>
<takimlar>

<takim no="1">
<isim>Canyoupwnme</isim>
<sayi>12</sayi>
</takim>

<takim no="2">
<isim>Hacktrick</isim>
<sayi>25</sayi>
</takim>

</takimlar>
<html>
<body>
Canyoupwnme 12<br />
Hacktrick 25 <br />
</body>
</html>

2 koda baktığımızda xml kodlarındaki ögelere nasıl rahat erişebileceğimiz gözükmektedir. Ayrıca kendi taglerimizi belirttiğimiz için daha anlaşılır hale gelmektedir. Buna nerede denk gelebiliriz diye sorarsak örneğin elimizde bir xml dosyası var ve biz bu xml içerisindeki verilere kontrollü erişmemiz gerekmektedir. Verilere erişim değişken tarzında olduğu için istersek örnekteki Canyoupwnme verisini çekebiliriz veya  Hacktrick verisini çekebiliriz. XML bize bu avantajı sağlamaktadır.

XML’in Kullanıldığı Alanlar

XML veri alışverişinin yapıldığı sistemlerde çoğunlukla kullanılmaktadır. Unicode desteği bulunmaktadır ve bu özellik çoğu alfabedeki karakter desteğini sunmaktadır. Böylelikle evrensel bir uygulama da tercih edilebilir. Veri paylaşımlarında veri tabanı sistemleri farklılıklar gösterebilir ve bunların paylaşımları zor olabilir. Hele birde verilerin büyüklüğü devasa ise (big data ) XML ‘in text tabanlı olması ve kolay anlaşılabilir olması avantaj sağlar. Bu açıdan Busines To Busines (B2B) uygulamalarında büyük avantaj sağlamaktadır. Kısaca özetlemek istersek verinin taşınması ve saklanması gerekilen uygulamalarda XML kullanımı yaygındır.

XML Avantajlar Ve Dezavantajlar

Avantajlar :

  • XML entegrasyonu ile dinamik ve hızlı e-ticaret siteleri
  • Evrensel dilde tagler belirleme ve anlaşılabilirlik
  • Her sistemde çalışabilir olması çalışabilirlik açısından bir bağımlılığının olmaması
  • Birbirinden farklı sistemler arasındaki uyumluluğu , optimizasyonu
  • Öğrenilmesi kolaydır.
  • İçerisindeki verilere erişimin kolay olması. Bu sayede geliştirilecek uygulamalarla kolay çalışabilmesi.

Dezavantajlar :

  • XML verinin nasıl işleyeceğini tanımlamaz.
  • XML kendi başına harikalar yaratamaz. XML onu işleyecek ayrıştırıcılara ve uygulamalara gereksinim duyar.
  • Beraberinde getirdiği güvenlik açıkları

 XXE Injection 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. Bir örnek ile xxe injection inceleyelim;

payload = '''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ZSL [
   <!ENTITY xxe1 SYSTEM "file:////etc/passwd" >
   <!ENTITY xxe2 SYSTEM "file:///etc/resolv.conf" >
   <!ENTITY xxe3 SYSTEM "file:///etc/issue" >]>
<package id="1" uuid="eecb64f8-35b0-412b-acda-3d83edf4ee63">
  <dateCreated id="2">2015-11-06 10:47:19</dateCreated>
  <name>&xxe1;</name>
  <description>&xxe2;</description>
  <openmrsVersion>&xxe3;</openmrsVersion>
  <version>1</version>
</package>'''

Bu payload’a exploit db’de rastladım. Bu örnek üzerinden incelememizi yapalım. İlk olarak taglere göz atalım. Name , description ve openmrsVersion tagleri arasında &xxe1 , &xxe2 , &xxe3 verileri tanımlanmış. Bakıldığında bir tehlike arz etmemektedir. Fakat !ENTITY ile başlayan taglere baktığımızda sistem dosyalarına erişebildiğimiz görülmektedir. Örneğin xxe1 verisi ile /etc/passwd dosyasına erişilmiştir. Bu gibi hassas verilere ulaşmak çok tehlikelidir. Bunun gibi örnekler çoğaltılabilir. Uygulama kısmında bu atak türü daha iyi anlaşılabilir.

XXE Saldırıları Tarihsel Örnekler

Bu kısımda ise hangi önemli sistemler xxe zafiyeti bulundurmuştur incelemeye çalışacağız. Bunların en başında tabii ki devasa bir kuruluş olan Facebook gelmektedir. Rastladığım bir yazıda .docx uzantılı dosyaların sıkıştırılmış xml dosyaları olduğu belirtilmekteydi. Ve saldırgan Facebook/career kısmında cv dosyasını yüklemeye çalıştığında başarılı olduğunu belirtmişti. Ardından cv dosyasını .docx uzantısında bir takım değişiklikler ile yüklemeye çalıştığını belirtmişti. Edindiği bilgide .docx dosyalarının sıkıştırılmış xml dosyaları türünde dosyalar olarak bilindiğini söylemekteydi. Ardından .docx uzantılı cv dosyasını 7zip programıyla açtığını ve içindeki xml dosyalarına eriştiğini belirtmekteydi. Burada bir takım değişiklikler yaparak dosyayı tekrar sisteme yüklediğinde zafiyeti keşfettiğini belirtmiştir. Bunu incelemek isterseniz aşağıda ki linki kontrol edebilirsiniz.

https://www.linkedin.com/pulse/how-i-hacked-facebook-word-document-mohamed-ramadan

Diğer çok önemli olan zafiyet ise Cisco Webex XXE zafiyetidir. Bu önemli zafiyeti sayın Ali Ardıç aşağıdaki linkte ayrıntılı ve Türkçe olarak belirtmektedir.

https://www.slideshare.net/CezeriSGACezeriSiber/cisco-webex-xxe-zafiyeti

Bu örnekler exploit db vb. platformlardan incelenerek çoğaltılabilir. Şimdi uygulamalı örneklere göz atalım.

Test ortamlarında uygulamalı XXE injection attack çözümleri

 Bu kısımda Web For Pentester , bWAPP tarzı test ortamlarında ekran görünrüleriyle XXE injection örneklerine değineceğiz.

 İlk olarak Web For Pentester’daki xml attack kısmındaki 2 örneğin çözümlerini inceleyelim.

Web For Pentester XML attacks Example 1 :

Kaynak Kod analizi :

Example1 örneğinde sayfanın kaynak koduna bakalım. Kaynak kodunu aşağıda verelim ;

<?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.

Aşama 1 :

 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.

Aşama 2 :

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 ;

Aşama 3 :

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.

Çözü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.

Web For Pentester XML attacks Example 2 :

Kaynak Kod analizi :

Example2 örneğinde sayfanın kaynak koduna bakalım. Kaynak kodunu aşağıda verelim ;

<?php require_once("../header.php"); 

  $x = "<data><users><user><name>hacker</name><message>Hello hacker</message><password>pentesterlab</password></user><user><name>admin</name><message>Hello admin</message><password>s3cr3tP4ssw0rd</password></user></users></data>";

  $xml=simplexml_load_string($x);
  $xpath = "users/user/name[.='".$_GET['name']."']/parent::*/message";
  $res = ($xml->xpath($xpath));
  while(list( ,$node) = each($res)) {
  	echo $node;
  } 
?>
<?php require_once("../footer.php"); ?>

Buradaki kaynak kodlarını incelediğimizde ilk olarak x değişkeni ile bir XML haritası oluşturulmuştur. Daha sonra xml değişkenine 1. örnekte olduğu gibi simplexml_load_string modülü ile x değişkeni atanmıştır. xpath değişkeni ile name tagi içerisindeki veri GET isteği ile atanmıştır. While döngüsü ile de xpath değişkeninden gelen parametre ekrana bastırılmaktadır. Kodu analiz ettiğimizde name taginde hacker ver admin verileri bulunmaktadır. Fakat biz diğer hassas verileri çekmemiz gerekmektedir. Örneğin password taginde ki verileri elde etmek gibi. Peki bunu nasıl yapabiliriz  ? Bu sorunun cevabını denemelerimiz ile bulmaya çalışalım.

Aşama 1 :

name kısmında parametre almaktadır. Biz buraya admin veya hacker yazdığımızda sayfa sorunsuz çalışmaktadır. Fakat başka herhangi bir şey yazdığımızda sayfa boş dönmektedir. Bu biraz bize Sql injection çağrıştırmaktadır. name kısmına tırnak attığımızda bize hata döndürmektedir. Invalid predicate bize geçersiz yüklenici hatası vermektedir. Birde çift tırnak atıp deneyelim. Çift tırnak attığımızda sayfa bize boş olarak dönmektedir. İşlemlerimize tek tırnak üzerinden devam edip hata kodunu yok etmeye çalışalım.

 hacker’ or 1=1 — kodunu parametre olarak yollayalım ve sonucu inceleyelim.

Aşama 2 :

Burada bize Unfinished literal bitmemiş yazılı hatası verdi. Demek ki sorguyu  sonlandıramadık. Bunu çözmeyi deneyelim. — yerine %00 verdiğimizde tekrar geçersiz yüklenici hatası vermektedir. %00 ile sonrasında gelenleri yorum satırı yapmadan önce sorguyu sonlandırmayı normal parantez ile deneyelim. Fakat buda bize hata döndürmektedir. Birde süslü parantezle deneyelim. O da aynı sonucu vermektedir. Birde köşeli parantez ile sorguyu sonlandırmayı deneyelim. Ve başarılı bir sonuca ulaşmış olduk . Görelim ;

payload :

hacker' or 1=1 ] %00

Aşama 3 :

Sayfa bize name tagleri içerisindeki verileri getirmiş oldu. Şimdi diğer taglerde tutulan verilere erişmeye çalışalım. Peki bu verilere nasıl erişebiliriz. Bu noktada aklımıza PHP DOM(Document Object Model) yapısı gelmektedir. Bu yapı ile HTML veya XML dosyalarımızda nesnel erişim sağlayarak elementler üzerinde işlem yapabilmekteyiz.  Şimdi payloadımıza geri dönelim.  Sorguyu yaptıktan sonra child::node() ile geçerli düğümün tüm çocuklarını seçelim. Bu bilgiye ise google da XPath Axes anahtar kelimesi ile erişebiliriz. Daha sonrada geçerli düğümün tüm atalarına erişmeyi deneyelim . İlk olarak çocuk düğüme erişebiliyor muyuz deneyelim ;

payload : hacker’ or 1=1 ]/child::node() %00

Çözüm :

Görüldüğü üzere bir hata ile karşılaşmadık. Demek ki çocuk bireyler hacker ve admin verileri. Şimdi ata bireylere erişmeyi deneyelim. Bunu da parent::node() ile deneyelim.

payload : hacker’ or 1=1 ]/parent::node()/child::node() %00

Böylelikle tüm ata bireylere de erişmiş olduk. Peki burada ne anlamıştık. child::node() ile çektiğimiz veriler hacker ve admin verileriydi. Yani bunlar name tagleri ile tutulan verilerdi. name tagini username tagi gibi düşünebiliriz. Bunu url kısmında şu şekilde deneyerek ne olacağını görelim ;

payload:

hacker' or 1=1 ]/parent::node()/name%00

Görüldüğü gibi düşüncemiz doğrulanmış oldu. Yani herhangi bir hata ile karşılaşmadık. Şimdi bu düşüncemize göre password bilgilerini çekmek isteseydik ne olurdu ? Şu şekilde deneyelim ;

payload :

hacker' or 1=1]/parent::node()/password%00

Ve sonuca ulaştık. XML tagleri içerisindeki password bilgilerine eriştik. Böylelikle Web For Pentester içerisindeki XXE injection örneklerini çözmüş olduk.

bWAPP XML External Entity Attacks (XXE) :

Bu kısımda ise çeşitli zafiyetlerin bulunduğu test ortamı olan bWAPP içindeki XXE attacks bölümünü inceleyeceğiz.

İlk olarak inceleyeceğimiz kısımı görelim ;

Görüldüğü üzere sayfamız bu şekildedir. Burada sadece ‘Any bugs?’ butonu bulunmaktadır. Bu butona bastığımızda bir değişiklik olmamaktadır. Peki bu noktada ne yapmalıyız? Burpsuite ile butona bastıktan sonra araya girelim ve hangi veriler gönderilmekte ne gibi istekler yapılmakta bunu inceleyelim.

Any bugs? butonuna tıklayıp burpsuite ile araya girdiğimizde ekran görüntüsündeki gibi paket bilgileri gönderilmektedir. bee kullanıcısı ile giriş sağladığımızdan <login> tagleri arasında bee görmekteyiz. <secret> tagleri arasında ise kullanıcı oluştururken bizden secret stringi istemektedir burada onu görmekteyiz. Burada xml taglerinin farkındayız ve önceki aşamalarda gerçekleştirdiğimiz xxe injection tekniklerini burada uygulamayı deneyelim. Xml ile kendi oluşturduğumuz değişkende robots.txt dosyasını çağırmayı deneyelim. Bunları denerken bilgileri repeater’a atıp değişiklikleri orada deneyelim.

Çözüm :

Görüldüğü üzere robots.txt dosyasına, yazdığımız xml kodları ile ulaşabiliyoruz. Bu kodları daha anlaşılabilir olması bakımından XML kısmında ekledim. Kodu aşağıda verelim.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE deneme [
<!ENTITY canyoupwnme SYSTEM "http://localhost/bWAPP/bWAPP/robots.txt">
]>

Burada canyoupwnme değişkenini belirledik ve bu değişken ile robots.txt dosyasını çağırdık. Robots.txt dosyasının yolunu belirtirken http url’i üzerinden belirttik burada bWAPP sistemimizde nerede kurulu ise o yolu vermeye dikkat edelim.

Ayrıca login taglerinde de oluşturduğumuz canyoupwnme değişkenini belirtelim ;

<login>&canyoupwnme;</login>

Böylelikle robots.txt dosyasına eriştik. Peki bir saldırgan gibi düşünerek /etc/passwd dosyasını okumak istesek başarılı olabilir miydik ? Bunu aşağıdaki kod ile deneyelim ve sonuçları görelim.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE deneme [
<!ENTITY canyoupwnme SYSTEM "file:///etc/passwd">
]>

Bu kodda sadece SYSTEM’den sonra çift tırnak içerisinde http değilde file olarak değiştirdik. Ve /etc/passwd dosyasını bana getir dedik daha sonra &canyoupwnme; ‘yi login tagleri arasında belirttik. Sonucu ekran görüntüsü ile görelim ;

Görüldüğü üzere /etc/passwd dosyasına da xxe injection ile erişmiş olduk. bWAPP’ın bu konudaki challenge’ını böylelikle göstermiş olduk.

Bu aşamada karşılaştığım bir sorunu ve çözümünü de anlatayım. İlk olarak bWAPP ‘ı sistemimde default olarak apache2 sunucusuna kurdum. Daha sonra çözümü denediğimde sürekli bir hata ile karşılaştım. Hatada sonuç olarak ”An error occured” döndürmekteydi. Bu hatayı bir süre aşamadım. Daha sonra araştırdıktan sonra bunun sunucu kaynaklı olduğunu öğrendim. Apache2 sunucusu üzerinden sistemi çalıştırdığım için dosyaları okumak istediğimde hata alıyordum. Bunun sebebinin izinlerden dolayı kaynaklandığını düşünüyorum.

Peki bu sorunu nasıl çözdüm ? Bu noktada devreye XAMPP girdi. Kali sistemine XAMMP kurdum ve mysql,apache ‘yi XAMPP üzerinden çalıştırdım. bWAPP’ı ise XAMPP htdocs içerisine kurdum. Böylelikle sorun çözülmüş oldu. Bunun WAMP server ile de çözülebileceğini düşünüyorum.

Sonuç

Bu yazımızda xxe injection anlatmaya çalıştım. XML’den bahsettik ve daha sonra Web For Pentester xxe örneklerinin çözümünü anlattık. Daha sonra başka bir test ortamı olan bWAPP üzerinde XXE attack challenge’nın çözümünü anlatmış olduk.

About Murat TORAMAN

Süleyman Demirel Üniversitesi Bilgisayar Mühendisliği 4.sınıf öğrencisi

Follow Me