Blind SQL injection Nedir ve Nasıl Istismar Edilir

SQL injection web sitelerinde veya kullanıcı etkileşimli olan uygulamalarda veritabanı bağlantısında araya SQL ifadelerini yerleştirebilme sanatıdır. Bunun nedeni artan kullanıcı etkileşimi ile sürekli olarak son kullanıcı ile input - output döngüsü yaşanmasıdır. Bu kadar etkileşimli uygulamalar yazarken yazılımcıların gözünden kaçan bazı 'input control' işlemleri olabilir. Hemen SQL injection'u deneyerek görelim.

SQL injection genel Dork taramalarda "?id=" şeklinde çok rastlarsınız bunun yanında POST methoduyla gönderilen parametrelere tek tırnak koyarak yaptığınız request işlemini kontrol ettiğinizde bir SQL hata kodu ekrana gelebilir, gelebilir diyyorum çünkü bazı sunucularda default olarak hata kodlarının ekrana basılması güvenlik dolayısıyla kapalı tutulmaktadır. Ama siz yine de sql injection taraması yapmak için deneyebilirsiniz bunu daha hızlı denemesi için tüm request bekleyen sayfaların parametrelerine tek tırnak göndererek kontrol eden bir curl script yazabilirsiniz mesela.


En basit örneği vermek gerekirse kullanıcı girişi işlemlerinde çoğu site ve uygulamanın kullandığı klasik SQL kodları şu şekildedir ;

SELECT kullani_adi,kullanici_pass FROM users WHERE kullanici_adi = '$gelenkadi' AND kullanici_pass='$gelenpass'

Kodu inceleyelim :

SELECT kullani_adi,kullanici_pass FROM users WHERE kullanici_adi = 'ahmet' AND kullanici_pass='12345a'
TRUE AND TRUE giriş sağlanır

Peki, kullanıcı şifresini y’ or ‘y’=’y gibi bir şey gönderirse :

SELECT kullani_adi,kullanici_pass FROM users WHERE kullanici_adi ='$gelenkadi' AND kullanici_pass='y' or 'y'='y' 

burda şartlı giriş kontrol işlemimiz şu hali alıyor : kullanıcı_adı gelen_kullanıcı ya eşit ise ve kullanıcı_pass gelenpass a eşit ise veya y == y ise giriş yap dolayısıyla giriş işlemi başarılı olacaktır.



Bu kadar basit mi ? hemen başka bir örnek verelim (MySQL):

ahmetylmz.net/sayfa.php?id=1

Şeklinde id ile get parametresi alan bir sayfamız olsun. Dolayısıyla eğer bu id verisi doğru şekilde input control işlemine sokulmadıysa şu şekilde istismar edilebilir :

 ahmetylmz.net/sayfa.php?id=1’ UNION SELECT table_schema,NULL FROM information_schema.tables'

Sorgumuz şu şekli alıyor :

SELECT sayfaid,sayfadi FROM sayfalar WHERE sayfaid ='1' UNION SELECT table_schema,NULL FROM information_schema.tables'

ile sayfa id veritabanından çekilen bir yazılımda tüm veritabanı tablolarınız bu şekilde çekilebilir veya şifreler alınabilir yeni kayıtlar eklenebilrir ve hatta tablo eklenip silinebilir. bkz ; DROP/**/ TABLE users;--



Tabi çeşitli WAF(Web Application Firewall) kurallarını atlatmak için Charencode, randomCase, space2comments, equaltolike vb tekniklerle request’imizi encode etmemiz gerekebilir. Mesela url encode mantığıyla bir charencode işlemi gösterelim :

X%27%20or%20%27x%27%3D%27

Biraz encode işlemi yaparsak, mesela sunucu wafı ‘OR’ requestını engellediğini düşünürsek

X%27%20o/**/r%20%27x%27%3D%27

Yetmedi ! biraz daha yapalım o halde :

X%27%20CHR(111)/**/CHR(82)%20%27x%27%3D%27

Biraz daha…

x%27%2F**%2FCHR(111)%2F**%2FCHR(82)%2F**%2F%27x%2F**%2F%27%2F**%2F%3D%27x

 aslında biz x’= ‘x’=’x requesti’ni göndermiş olduk.


Bu ve buna benzer teknikler ile güncel WAF kuralları çok rahat bypass edilip sql injection saldırısı ile sonuçlanabiliyor..
Bu konuda şahsen güvenlik araçlarına değil direk olarak yazılıma güvenilmesi ve bu alanda yazılımın güvenlik kısmının geliştirilmesi taraftarıyım.


Burada tüm olay yazılan kodlar ile sizin uyumunuz ve hayal gücünüze kalmıştır. Eğer bir SQL injection testi yapacaksanız öncelikle otomasyon toolları kullanabilirsiniz sizin için önereceğim Açık kaynak uygulama sqlmap olacaktır. Bu tool ile cookie gerektiren yerler dahil WAF bypass işlemleri için tamper scriptleri işinizi fazlasıyla görecektir.


Nasıl Korunabiliriz :
Kullanıcıdan gelen her parametre ve info kesinlikle input-control işlemine sokulmalıdır. Zararlı olabilecek karakterler doğru şekilde escape edilip, regex and replace işlemi uygulanmalıdır. Veritabanı sorgularında php için PDO kütüphanesini öneriyorum burda prepare statement şu an için oldukça güvenli durmaktadır. Ama ileriye doğru bir zafiyet çıkmayacağı anlamına gelmemekte siz yinede input-control işlemlerinizi aksatmayın.



Yararlı olması dileğiyle…

 

Bu yazım 3769 kez okundu
Eklendi : 2017-07-28

Bu Yazıma Yapılan Yorumlar :

Yusuf AVCI - 29.07.2017

Teşekkür Ahmet Bey bilgilendirmeleriniz için.

Ahmet Yılmaz - 30.07.2017

Rica ederim efenim :)

Yorum Yap :

captcha
74