İçeriğe geç

BLIND SQL INJECTION

SQL INJECTION BLİND-BOOLEAN BASED

Bu yöntem diğer yöntemlerden daha uzun ve tahmin gerektiren bir yöntemdir. Bir web uygulamasında istek gönderildiğinde, kullanıcıya sadece “false” veya “true” dönüyorsa, sql injection yaparak, veri tabanı, tablo adı, kullanıcı adı veya şifre gibi bilgilerin tek tek karakterlerini, kelime uzunluklarını tahmin edip veri tabanından bize bir cevap dönmesini bekleriz. Örnek olarak ilk sıradaki veri tabanı adının 1. Harfi a mı? Ya da kelime uzunluğu 5 mi? gibi sorgularla hedefimize ulaşırız.
Bir film araması yapmak istiyoruz. Yaptığımız aramada sistem bize “Bu film veri tabanımızda bulunuyor” veya “Bu film veri tabanımızda bulunmuyor” değerlerini döndürecek.

Böyle bir sistemde yapılması gereken, tek tek bütün veri tabanını tahmine dayalı bir şekilde, karakter, katar uzunluğu veya ASCII kodları gibi gerekli olan bilgileri deneme yanılma yöntemiyle bularak amacımız olan datalara ulaşmaktır.

İlk denememizi hangi veri tabanlarının kullanıldığını öğrenmek için yapalım.

Bu sorguda amaç veri tabanı adının 1. Karakterinin a olup olmadığını öğrenmektir. Bizim ilk veri tabanımız bWAPP olduğundan dolayı bu sorgunun cevabı “false” dönecektir.

Cevap doğru dönene kadar denemelerimize devam ediyoruz ve en sonunda bilgiye erişiyoruz.

Bu sorgularda bize dönen cevap “true” olacaktır.

Şimdi ise bulduğumuz veri tabanının içerdiği tablolara ulaşalım.

Bu sorguda demek istediğimiz, veri tabanında 1. Sıradaki tablo adının 1. Karakteri ‘a’ mı? A olmadığı için sistem “false” döndürecek. Tek tek bütün tabloları bu şekilde bulalım.

Birinci tablonun adının harfleri tek tek deneyerek “blog” olduğunu öğrendik. Diğer tablo adlarını elde etmeye çalışalım. Bunun için “limit” değerinde ufak bir değişiklik gerekecektir. 2. tablo adını bulmak için “limit 0,1” yazmak yerine “limit 1,1”, 3. Tablo için “limit 2,1” şeklinde sırayla devam edecek. Biz 4. tablo adı için “limit 3,1” yani 3. indis ten 1 indis uzaklıktaki değer için araştırma yapalım.

Bu sorgular için veri tabanının bize döndürdüğü değer true olacaktır.

Bir değerin ne kadar uzunlukta olduğunu bulmak için, harf denemesi yerine boş string denemesi yaparız. Eğer bize boş string değeri için sırayla yaptığımız sorgu bir yerde doğru dönerse, o zaman katar uzunluğu oraya kadardır diyebiliriz. Daha açık olması açısından ;

Yukarıda gerçekleştirdiğimiz sorguları “6. indis boş stringe eşit mi?” ifadesi için de denersek, veri tabanı bize “true” döndürecektir. Bundan sonraki indisler de boş string için doğru dönecektir. Bu sebeple biz 4. tablo adı katar uzunluğunun “5 karakter uzunluğunda” olduğunu söyleyebiliriz.
Uzunluk için başka SQL sorguları da kullanılabilir. Bunlardan bir tanesi “length” komutunu kullanmaktır. Ayrıca ASCII kodları için de araştırma yapılabilir. Örnek olarak içinde büyük harf barındırıp barındırmadığına dair bir cevap arıyoruz. ASCII kodlarında büyük harf “65” sayısından sonra, küçük harf ise “97” sayısından sonra gelir. Bunları kullanarak bir sorgu gerçekleştirelim.

Bu sorguda cevap false dönecektir. Çünkü ilk tablo adı “blog”olup hepsi küçük harflidir.

Harfleri baştan sona tek tek denemek yerine ASCII kodu denemeleri yaparak işimizi pratikleştirebiliriz. Hangi ASCII kod aralığında olduğunu birkaç deneme ile bulup, nokta atışı yaparak karakter tahmini yapmak, diğer sorgulara göre daha kolay olacaktır.
Bu bilgileri edindikten sonra artık kullanıcı adı ve şifreye de ulaşmak mümkün. Kullanıcı adı öğrenmek için aşağıdaki sorguyu kullanalım.

Sorguda, “kullanıcılar sütunundaki 2. login isminin 1. karakteri b mi?” sorusunun cevabını almak istiyoruz. Sırasıyla aynı işlemler gerçekleştirildiğinde kullanıcı adının “bee” olduğu bilgisine ulaşırız.
Aşağıdaki sorguyu kullanarak şifre bilgisini elde edebiliriz.

Sırasıyla aynı işlemler tekrar edildiğinde istenilen bilgiye ulaşılır. Şifre hashlenmiş bir şekilde veri tabanında bulunduğundan, denemelerimizi ona göre yaparız. Daha sonra bu şifreler bazı toollar kullanılarak çözülebilir.

 

SQL INJECTION (Blind-Time-Based)

Boolean Based yönteminden tek farkı alacağımız cevap doğru ise, sayfanın bize geç yanıt vermesini sağlamaktır. Örnek olarak aşağıdaki sorguyu kullanalım.

Bu ifadede basitçe “Login i “bee” olan kullanıcı adı şifresinin 1. Karakteri “6” ise, 15 saniye beklet.” demek istiyoruz. Bu cevap “true” döneceğinden, sayfa bize 15 saniye sonra cevap verecektir. Bu şekilde sorgular çoğaltılabilir ve istenilen bilgiye ulaşılabilir.

 

SQL INJECTION ATAKLARINDAN NASIL KORUNURUZ?

Sql İnjection açıklarından korunmak için birçok yöntem vardır. Bunlardan bazıları web geliştiricisinin yapacağı doğrulama, filtreleme, SQL parametresi kullanma, kullanıcı yetkilerini kısıtlama ve önemli verileri şifreleme gibi hareketlerdir.

Doğrulama yaparak, sql injectionda kullanılan tehlikeli karakterlerin kullanılmasının engellenmesi gerekmektedir.
Filtreleme yaparak sorgulamaya alınacak girdilerin kısıtlanması önemlidir.

Sorguları parametre alacak şekilde hazırlanması ve daha sonra parametreyi bağlayarak sorgunun çalıştırılması da etkili yöntemlerdendir.(Prepare-Execute)

Kullanıcı yetkilerini kısıtlamak, banka hesapları veya bunun gibi önemli verileri şifrelemek ve yazılan web uygulamasının güvenliğini test etmek alınacak önlemler arasındadır.

Tarih:Sql Injection
Created by Feride Ünlü