Üçüncü tip SQL enjeksiyon zaafiyeti Zamana-Bağlı(Time-based) SQL enjeksiyonudur. Burada yine bir önceki BLIND SQLi mantığı var. Referans sayfa ile enjeksiyon yapılan sayfa arasında html olarak bir fark olmadığında kullanılır. HTML sayfa içindeki metin yerine enjekte edilen koddaki bekleme süresine (zamana) bakılır. Aşağıdaki örnek koda bakıldığında "pass" ile exception durumu pas geçiliyor:
name = request.get('name')query ="SELECT * FROM haberler WHERE yazar_ismi='"+ name +"'"result =""try: result = db.execute(query)exceptExceptionas e:passif result.size()>0:print"Haber var"else:print"Haber yok"
Aşağıdaki SELECT IF cümleciği sonucunda 5 sn bekleme olacaktır:
Yukardaki Select If cümleciğinde substring(mehmet,1,1) = m ve ascii(m) = 109 > 79 olduğundan sonuç doğru olması ile sleep(5) çalışır. Yani dolaylı yoldan enjeksiyonun çalıştığı görülebilir. Aşağıdaki kod sonucu 5 saniye sonra 0 olarak gözükecektir:
Zaman tabanlı SQL enjeksiyonu olup olmadığını anlamak için kullanılabilecek algoritma aşağıdaki gibidir:
SQL enjeksiyonunu bulmada tespit için yukarıdaki gibi TIME BASED SQLi için SLEEP() MySQL fonksiyonu MySQL sunucu için kesin çalışır. SELECT'de 1=1 de kesin çalışır. Ama ya INSERT varsa?
Union ile blind/boolean arası bir yaklaşım kullanılabilir:
User registration (kullanıcı kaydı) yapılıyor diyelim. Insert saldırı kodu yaptık. Başka sayfada yorumlar varsa, bu sefer 1,2,3,... diye aramıyoruz. Diğer bir sayfada arıyoruz. 2 işlemde bulduk! Aşağıdaki örnek SQL cümleciğine bakalım:
TIMER() ile zamanı ölç ve T1'a ata
SQLi payload'lu kodu çalıştır
TIMER() ile zamanı ölç ve T2'ye ata
T2-T1 zaman farkına bak
Fark payload'deki bekleme süresi ile payload'daki
süreyi karşılaştır
Fark birbirine yakınsa SQLi olabilir
INSERT INTO users(name) values ('' - sleep(5) - '');
INSERT INTO users(name, pass) VALUES
((SELECT table_name from information_schema.tables
WHERE