官术网_书友最值得收藏!

3.2 SQL注入

SQL注入曾在幾年前就流行于世,而如今,SQL注入仍是最流行的攻擊手段之一,開(kāi)發(fā)者們對(duì)其傷透了腦筋。當(dāng)然,主要是由于注入攻擊的靈活性,一個(gè)目的,多個(gè)語(yǔ)句,多個(gè)寫(xiě)法。

SQL注入可以分為工具和手工兩類(lèi),工具因?yàn)樽詣?dòng)化,常常會(huì)比手工高效很多,但因?yàn)槠洳⒉皇怯嗅槍?duì)性地進(jìn)行注入,相比手工注入就局限了很多。

3.2.1 注入的挖掘

一切輸入都可能有危害,有參數(shù)的地方皆有可能存在SQL注入。而由于瀏覽器的局限性,常常會(huì)忽略一些隱藏鏈接、API調(diào)用、http頭中的參數(shù)。那如何進(jìn)行全面的SQL注入挖掘呢?

這里需要用到工具Burp。

由圖3-7可以看到操作時(shí)向Web站點(diǎn)發(fā)送的每個(gè)http數(shù)據(jù)包。數(shù)據(jù)包中包含了http頭和傳遞的參數(shù),而注入常常就發(fā)生在這些參數(shù)中,圖3-8簡(jiǎn)單分析了http數(shù)據(jù)包的結(jié)構(gòu)(大方框?yàn)閔ttp頭,小方框?yàn)閰?shù)) 。

圖3-7 對(duì)站點(diǎn)操作時(shí)的數(shù)據(jù)包

圖3-8 分析了http數(shù)據(jù)包的結(jié)構(gòu)

大致了解了數(shù)據(jù)包結(jié)構(gòu)以后,便可以開(kāi)始進(jìn)行注入的挖掘了。所謂挖掘,就是判斷某個(gè)參數(shù)是否可以進(jìn)行注入。下面來(lái)探討一下常見(jiàn)的判斷方法。

1.報(bào)錯(cuò)注入

一般情況下,大部分編程語(yǔ)言為了方便開(kāi)發(fā)人員可以靈活地調(diào)試和修復(fù)其應(yīng)用程序,會(huì)使用一些內(nèi)置的錯(cuò)誤處理庫(kù),從而簡(jiǎn)化調(diào)試程序的時(shí)間。而報(bào)錯(cuò)注入就是輸入一些特殊字符使語(yǔ)法產(chǎn)生錯(cuò)誤,從而判斷是否存在注入,常見(jiàn)的特殊字符如下。

(1)'

(2)\

(3);

(4)%00

(5))

(6)(

(7)#

(8)"

在提交參數(shù)時(shí)加上這些特殊字符,如果報(bào)錯(cuò),那么極有可能是一個(gè)注入點(diǎn),如圖3-9所示。

圖3-9 單引號(hào)報(bào)錯(cuò)實(shí)例

2.盲注

何為盲注?其實(shí)盲注和報(bào)錯(cuò)注入是相對(duì)的,報(bào)錯(cuò)注入會(huì)返回一些數(shù)據(jù)庫(kù)的具體信息,而盲注只會(huì)返回true與false兩種值,從而對(duì)想得到的信息進(jìn)行猜解;因此相比報(bào)錯(cuò)注入,盲注的效率較為低下。常見(jiàn)的盲注分為兩種,布爾型盲注和基于時(shí)間的盲注。這兩者的區(qū)別在于判斷注入的條件不同。布爾型盲注是對(duì)頁(yè)面響應(yīng)的信息進(jìn)行判斷,而基于時(shí)間的盲注也就是常說(shuō)的延遲注入,是對(duì)頁(yè)面響應(yīng)的時(shí)間進(jìn)行判斷。

對(duì)于布爾型盲注,在網(wǎng)站默認(rèn)關(guān)閉錯(cuò)誤信息時(shí),如果這時(shí)并沒(méi)有做其他處理,可以通過(guò)邏輯表達(dá)式來(lái)進(jìn)行盲注。大概的原理是:如果筆者的邏輯表達(dá)式是正確的,整個(gè)SQL查詢(xún)語(yǔ)句一定會(huì)返回結(jié)果,那么網(wǎng)站顯示了正確的內(nèi)容。基于這個(gè)原理,可以通過(guò)注入依次獲取每個(gè)字符。常見(jiàn)的判斷方法中最經(jīng)典的便是and 1=1;and 1=2了,當(dāng)提交and 1=1時(shí)頁(yè)面正常,and 1=2時(shí)頁(yè)面不正常,則存在注入。不過(guò),這種判斷方法是針對(duì)數(shù)字型參數(shù)的,與其類(lèi)似的還有or 2>1;or 1>2;xor 1=1;xor 1=2等。但對(duì)于字符型參數(shù),常用的語(yǔ)句是' and '1' = 1 ; ' and '1' = 2,其判斷方法和數(shù)字型相同。

對(duì)于基于時(shí)間的盲注,一般是在條件更為苛刻的情況下(例如最終進(jìn)行了跳轉(zhuǎn))使用的一種注入的方式。以MySQL為例,對(duì)其的判斷方法主要涉及sleep和benchmark兩個(gè)函數(shù),這里以benchmark函數(shù)為例進(jìn)行介紹。

     BENCHMARK(count,expr)

其作用是重復(fù)count次執(zhí)行表達(dá)式expr,提交后根據(jù)其響應(yīng)時(shí)間來(lái)判斷表達(dá)式正確與否,是否存在注入。當(dāng)然,延遲注入一般都交給工具或腳本去分析,能大大提高準(zhǔn)確性和效率。

3.2.2 工具注入

隨著注入攻擊的流行,市場(chǎng)上工具的種類(lèi)也較為繁多。常見(jiàn)的有sqlmap、Havij等,其中sqlmap因?yàn)槊赓M(fèi)、開(kāi)源、功能強(qiáng)大等特點(diǎn),受到了廣大使用者的推崇。本節(jié)便來(lái)詳細(xì)講解Windows系統(tǒng)下sqlmap的使用。

1.sqlmap的安裝

(1)sqlmap需要在Python環(huán)境下才能運(yùn)行,因此在安裝sqlmap之前需要安裝Python。在Windows下,下載并運(yùn)行Python的安裝包,Python由于2.x版本與3.x版本性能上有一定差異,所以我們使用2.7.2版本(Python的版本問(wèn)題是個(gè)很有趣的話題,各位如果感興趣可以自己查找資料進(jìn)行了解),如圖3-10所示。

(2)安裝完成后,需要添加環(huán)境變量。安裝路徑是D:\python,執(zhí)行“我的電腦”→“屬性”命令,打開(kāi)“高級(jí)”選項(xiàng)卡,如圖3-11所示。

圖3-10 Windows環(huán)境下安裝Python

圖3-11 配置運(yùn)行環(huán)境

(3)單擊“環(huán)境變量”按鈕,在path中添加D:\python(安裝路徑)并保存,如圖3-12所示。

(4)Python安裝配置完畢后,下載sqlmap的壓縮包并解壓,解壓路徑是D:\python\sqlmap\。打開(kāi)命令提示符,用cd命令切換到sqlmap解壓路徑,試著運(yùn)行一下sqlmap.py,檢查其是否安裝成功,如圖3-13所示。

圖3-12 設(shè)置環(huán)境變量

圖3-13 檢查是否安裝成功

2.sqlmap的使用

sqlmap是一款半自動(dòng)化工具,需要手動(dòng)輸入命令進(jìn)行注入。常見(jiàn)的命令如下(這里假設(shè)目標(biāo)URL為http://url/news?id=1)。

3.對(duì)WAF的繞過(guò)

在實(shí)際注入測(cè)試中,遇到WAF(Web Application Firewall,網(wǎng)站應(yīng)用級(jí)入侵防御系統(tǒng))是常有的事,我們可以繞過(guò)WAF繼續(xù)進(jìn)行注入檢測(cè),本節(jié)討論sqlmap對(duì)WAF的繞過(guò)。

在sqlmap中,用-tamper命令可以調(diào)用內(nèi)置的繞過(guò)腳本,具體語(yǔ)法格式如sqlmap.py -u"url" -v 1 --dbs -tamper "腳本名"。表3-1是常用的腳本名及作用。

表3-1 sqlmap常用腳本名及其作用

3.2.3 手工注入

在滲透測(cè)試中,再?gòu)?qiáng)大的注入工具也會(huì)有局限性,而手工注入恰恰能解決這一弱點(diǎn)。當(dāng)然,手工注入需要滲透者對(duì)其針對(duì)的數(shù)據(jù)庫(kù)語(yǔ)法有一定了解。不過(guò),因?yàn)镾QL注入的靈活性與多樣性,如果詳細(xì)深入地講,恐怕能單獨(dú)寫(xiě)成一本書(shū)。在這里,筆者就選取最具代表性的例子給大家示范。

(1)對(duì)滲透目標(biāo)進(jìn)行注入的挖掘,這里對(duì)挖掘的過(guò)程就不再贅述了。確定了注入點(diǎn),便可以開(kāi)始進(jìn)行注入測(cè)試了,如圖3-14所示。

圖3-14 MySQL查詢(xún)語(yǔ)句示例

注意:這里用到了Burp的repeater功能。

由圖3-14可以看到POST下的參數(shù)topic_title存在報(bào)錯(cuò)注入,這里提交了單引號(hào),返回了錯(cuò)誤信息。

錯(cuò)誤信息中返回了出錯(cuò)的查詢(xún)語(yǔ)句如下:

     SELECT 'aws_topic'.* FROM 'aws_topic' WHERE ( topic_title = ''') ORDER
     BY 'topic_id' ASC

(2)這是一條MySQL查詢(xún)語(yǔ)句。再來(lái)看看提交的數(shù)據(jù)位于語(yǔ)句的什么位置,提交xx',可以看到查詢(xún)語(yǔ)句如下:

     SELECT 'aws_topic'.* FROM 'aws_topic' WHERE ( topic_title = 'xx'')
     ORDER BY 'topic_id' ASC

(3)確定了提交的數(shù)據(jù)所處位置,便可以用閉合語(yǔ)句試試。假設(shè)這里提交的是xx')#,于是查詢(xún)語(yǔ)句就變成了:

     SELECT 'aws_topic'.* FROM 'aws_topic' WHERE ( topic_title = 'xx') #')
     ORDER BY 'topic_id' ASC

而#在MySQL中是注釋符,所以實(shí)際上查詢(xún)語(yǔ)句變成了:

     SELECT 'aws_topic'.* FROM 'aws_topic' WHERE ( topic_title ='xx')

(4)成功閉合。因此構(gòu)造的語(yǔ)句格式應(yīng)該是:

     ')注入語(yǔ)句 #

(5)知道注入語(yǔ)句的格式了,再來(lái)看看查詢(xún)語(yǔ)句本身,因?yàn)槭窃赪HERE后面,所以只能用聯(lián)合查詢(xún)或者盲注進(jìn)行注入。先用ORDER BY進(jìn)行猜解,可以看到ORDER BY 16時(shí)正常返回,而ORDER BY 17時(shí)報(bào)錯(cuò)。因此可以構(gòu)造:

     ')  UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16  #

如圖3-15所示,提交后正常返回,因此可以判斷是支持聯(lián)合查詢(xún)的。

圖3-15 聯(lián)合查詢(xún)

(6)用user()、database()等函數(shù)代進(jìn)去查詢(xún)?cè)囋嚒?/p>

     ')  UNION SELECT user(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16  #

提交后,結(jié)果如圖3-16所示。

圖3-16 查詢(xún)數(shù)據(jù)庫(kù)用戶(hù)名

可以看到user為ask@*.*.61.105,再將user()替換成database()試試。

如圖3-17所示,這里可以看到數(shù)據(jù)庫(kù)為ask,接下來(lái)繼續(xù)爆破表名。構(gòu)造:

     ') union select group_concat(distinct table_name),2,3,4,5,6,7,8,9,10,
     11,12,13,14,15,16 from information_schema.tables where table_schema=database() #

圖3-17 查詢(xún)數(shù)據(jù)庫(kù)名

提交后,如圖3-18所示,可以看到表名已經(jīng)在返回的信息中了。

圖3-18 成功返回表名

將表名整理出來(lái),可以清楚地看到表結(jié)構(gòu),如圖3-19所示。

圖3-19 表結(jié)構(gòu)示意圖

選一個(gè)表進(jìn)行爆破字段,這里選的是aws_edm_userdata,其hex值為0x6177735f65646d 5f7573657264617461,因此構(gòu)造如下語(yǔ)句:

     ')+union+select+1,group_concat(distinct+column_name),3,4,
     5,6,7,8,9,10,11,12,13,14,15,16+from+information_schema.
     columns+where+table_name=0x6177735f65646d5f7573657264617461 #

結(jié)果如圖3-20所示。

圖3-20 返回字段

從結(jié)果中可以看到存在id、usergroup、email三個(gè)字段,這里只暴露出email字段的數(shù)據(jù),提交如下語(yǔ)句:

     ')+union+select+1,group_concat(email,0x2B),3,4,5,6,7,8,9,
     10,11,12,13,14,15,16 +from+aws_edm_userdata #

結(jié)果如圖3-21所示。

圖3-21 注入結(jié)果

3.2.4 注入延伸

在注入中經(jīng)常會(huì)碰到的一種情況就是:注入得到的加密過(guò)的密文卻解不開(kāi)。對(duì)于此問(wèn)題,在這里講解幾種可行的辦法。

(1)利用國(guó)外的搜索引擎,往往會(huì)有意想不到的收獲,最常見(jiàn)的是Google。

(2)用Whois查出管理員郵箱,然后發(fā)一份郵件通知管理員,讓其更改密碼。郵件內(nèi)容無(wú)非類(lèi)似于“我們是×××檢測(cè)中心,您的網(wǎng)站存在風(fēng)險(xiǎn),請(qǐng)立即修改管理員密碼……”。

(3)分析Cookie。有時(shí)加密過(guò)的密文會(huì)出現(xiàn)在Cookie里,對(duì)于這種情況,直接用管理員的密文替換原來(lái)Cookie中的密文即可。

(4)在特定的注入環(huán)境下,有時(shí)候可以用新密文替換掉原來(lái)的密文。當(dāng)然,這種方法的執(zhí)行條件比較苛刻,在實(shí)際中較少碰見(jiàn)。

(5)利用找回密碼功能。常見(jiàn)的是利用密保問(wèn)題找回密碼,對(duì)于這種情況,可以將密保問(wèn)題答案注入出來(lái),然后利用找回密碼功能成功登錄目標(biāo)賬戶(hù)。

(6)邏輯缺陷。例如有些登錄功能、修改找回密碼功能,在數(shù)據(jù)包中直接用密文傳輸。這時(shí),就可以用得到的密文進(jìn)行替換,從而進(jìn)行登錄、更改密碼等操作。

主站蜘蛛池模板: 黎平县| 正宁县| 祁门县| 无锡市| 呼伦贝尔市| 二连浩特市| 呈贡县| 丹江口市| 新兴县| 黄骅市| 旅游| 越西县| 城口县| 天等县| 桃园市| 昆明市| 钟山县| 昔阳县| 许昌市| 绥阳县| 宾阳县| 从江县| 鹤山市| 曲阳县| 通榆县| 盐池县| 昌邑市| 鹤峰县| 二连浩特市| 潜山县| 镇雄县| 河曲县| 仁寿县| 鄂尔多斯市| 西盟| 苏尼特右旗| 香港 | 登封市| 杨浦区| 额济纳旗| 林州市|