Blind/Booelan-based SQLi

Kör SQLi

Blind/Boolean SQL enjeksiyonu adından anlaşılabileceği gibi yapılan etkinin sonucunun mantıksal bir iterasyon sonucu anlaşılabildiği bir zaafiyet türüdür diyebiliriz.

Aşağıdaki SQL cümleciğine bakalım:

SELECT * FROM haberler WHERE yazar_ismi = 'mehmet' AND '1'='1'

Yukardaki kodun çalıştığını gördükten sonra, olayı anlamak adına, SQL cümleciğini biraz daha geliştiriyoruz:

SELECT * FROM haberler WHERE yazar_ismi = 'mehmet' AND
                                SELECT 1 = (SELECT 1)

Yukardaki SQL cümleciklerinde AND'den sonra gelen ifadeler Booleanarrow-up-right True (Doğru) sonucu vereceğinde sonucu değiştirmiyor. Yani referans sayfanın verdiğimiz bu girdi ile değişmesini istemedik. Referans/orijinal sayfa ile bu sorgu sonucu çıkan sayfa aynıysa burda sömürülesi bir SQL açıklığı vardır diyebiliriz. Bundan sonra artık yine sonucu doğru olan farklı sorgular eklemeye çalışacağız.

SELECT * FROM haberler WHERE yazar_ismi = 'mehmet' AND substring(
   SELECT table_name FROM information_schema.tables
    WHERE schema_name = database() LIMIT 1
  ), 1, 1) = 'u';

Son sorgu sonucundaki tablo adımız users ise orjinal sayfa yine gelecek; çünkü AND'den sonrası kısım TRUE verecek. Bundan sonrası artık iteratif olarak ve verimli (efficient) algoritmalar kullanarak en az denemede tablo adını vb. diğer verileri bulmak olacaktır. Substring fonksiyonuarrow-up-right metin değerin belli bir parçasını almaya yarıyor. Yukarda 'u' yerine ASCII fonksiyonuarrow-up-right kullanılabilir. Yani ASCI('a') ile sayı kontrolü yapabiliriz. Bir sonraki karakter için de offset LIMIT 1, 1 yapıyoruz. ASCII tablosuarrow-up-rightnda da 65'den 122'ye kadar olan karakterleri kör (blind) ama akıllıca arayabiliriz.

ascii(
 substring(
  (SELECT table_name from information_schema.tables
   WHERE table_schema = database()
   LIMIT 0,1), 1,1
 )
) > 94
  

Yukardaki kod parçasında tablonun adındaki karakterin ASCII değeri 94'den büyük müdür kontrolü var. Sonucun doğru olup olmayacağını da referans/orijinal web sitesi içerisindeki bir kelimenin olup olmadığı kontrol edilebilir.

Daha verimli arama için ikili arama (binary-searcharrow-up-right) algoritması kullanılabilir. Python ile yazılan payload koduna githubarrow-up-right'dan ulaşılabilir. Tabii gerçek penetrasyon testinde SQLMAP gibi araçları kullanmakta yarar var; çünkü zaman sınırlı penetrasyon testlerinde en az çaba ile en hızlı bir şekilde açıklığı bulmak hedeftir. Blind/Boolean SQLi bu kadar...

Last updated