Time-based SQLi
Zaman tabanlı SQLi
Üçü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)
except Exception as e:
pass
if result.size() > 0:
print "Haber var"
else:
print "Haber yok"
Aşağıdaki SELECT IF cümleciği sonucunda 5 sn bekleme olacaktır:
SELECT IF(1=1, sleep(5), null);
Blind'daki mantık kullanılırsa yine,
SELECT IF(ASCII(SUBSTRING((
SELECT 'mehmet'), 1,1)) > 79,
sleep(5),null);
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:
SELECT 'mehmet' - sleep(5) - ''
Zaman tabanlı SQL enjeksiyonu olup olmadığını anlamak için kullanılabilecek algoritma aşağıdaki gibidir:
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
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?
INSERT INTO users(name) values ('' - sleep(5) - '');
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:
TODO: aşağıdaki SQL tamamlanacak.
INSERT INTO users(name, pass) VALUES
((SELECT table_name from information_schema.tables
WHERE
Last updated
Was this helpful?