注入語(yǔ)句如下:
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),韶山企業(yè)網(wǎng)站建設(shè),韶山品牌網(wǎng)站建設(shè),網(wǎng)站定制,韶山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,韶山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
Username: jonnybravo’ or 1=1; –
該注入語(yǔ)句要做的就是從數(shù)據(jù)庫(kù)查詢(xún)用戶(hù)jonnybravo,獲取數(shù)據(jù)后立刻終止查詢(xún)(利用單引號(hào)),之后緊接著一條OR語(yǔ)句,由于這是一條“if狀態(tài)”查詢(xún)語(yǔ)句,而且這里給出 “or 1=1”,表示該查詢(xún)永遠(yuǎn)為真。1=1表示獲取數(shù)據(jù)庫(kù)中的所有記錄,之后的;–表示結(jié)束查詢(xún),告訴數(shù)據(jù)庫(kù)當(dāng)前語(yǔ)句后面沒(méi)有其它查詢(xún)語(yǔ)句了。
圖1 正常方式查看用戶(hù)信息
將payload注入后,服務(wù)器泄露了數(shù)據(jù)庫(kù)中的所有用戶(hù)信息。如圖2所示:
圖2 注入payload導(dǎo)致數(shù)據(jù)庫(kù)中所有數(shù)據(jù)泄露
至此,本文向讀者演示了一種基本SQL注入,下面筆者用BackTrack和Samurai 等滲透測(cè)試發(fā)行版中自帶的SQLmap工具向讀者演示。要使用SQLmap,只需要打開(kāi)終端,輸入SQLmap并回車(chē),如下圖所示:
如果讀者首次使用SQLmap,不需要什么預(yù)先操作。如果已經(jīng)使用過(guò)該工具,需要使用—purge-output選項(xiàng)將之前的輸出文件刪除,如下圖所示:
圖3 將SQLmap output目錄中的原輸出文件刪除
本文會(huì)演示一些比較獨(dú)特的操作。通常人們使用SQLmap時(shí)會(huì)直接指定URL,筆者也是用該工具分析請(qǐng)求,但會(huì)先用Burp查看請(qǐng)求并將其保存到一個(gè)文本文件中,之后再用SQLmap工具調(diào)用該文本文件進(jìn)行掃描。以上就是一些準(zhǔn)備工作,下面首先就是先獲取一個(gè)請(qǐng)求,如下所示:
GET /chintan/index.php?page=user-info.phpusername=jonnybravopassword=mommauser-info-php-submit-button=View+Account+Details HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer:
Cookie: showhints=0; username=jonnybravo; uid=19; PHPSESSID=f01sonmub2j9aushull1bvh8b5
Connection: keep-alive
將該請(qǐng)求保存到一個(gè)文本文件中,之后發(fā)送到KALI linux中,用如下命令將該請(qǐng)求頭部傳給SQLmap:
SQLmap –r ~/root/Desktop/header.txt
Self-Critical Evaluation
命令中-r選項(xiàng)表示要讀取一個(gè)包含請(qǐng)求的文件,~/root/Desktop/header.txt表示文件的位置。如果讀者用VMware,例如在Windows上用虛擬機(jī)跑KALI,執(zhí)行命令時(shí)可能產(chǎn)生如下圖所示的錯(cuò)誤提示:
這里必須在請(qǐng)求頭中指定一個(gè)IP地址,使KALI linux能與XP正常通信,修改如下圖所示:
之后命令就能正常執(zhí)行了,顯示結(jié)果如下圖所示:
基本上該工具做的就是分析請(qǐng)求并確定請(qǐng)求中的第一個(gè)參數(shù),之后對(duì)該參數(shù)進(jìn)行各種測(cè)試,以確定服務(wù)器上運(yùn)行的數(shù)據(jù)庫(kù)類(lèi)型。對(duì)每個(gè)請(qǐng)求,SQLmap都會(huì)對(duì)請(qǐng)求中的第一個(gè)參數(shù)進(jìn)行各種測(cè)試。
GET /chintan/index.php?page=user-info.phpusername=jonnybravopassword=mommauser-info-php-submit-button=View+Account+Details HTTP/1.1
SQLmap可以檢測(cè)多種數(shù)據(jù)庫(kù),如MySQL、Oracle SQL、PostgreSQL、Microsoft SQL Server等。
下圖是筆者系統(tǒng)中SQLmap正在對(duì)指定的請(qǐng)求進(jìn)行檢測(cè)時(shí)顯示的數(shù)據(jù)庫(kù)列表:
首先它會(huì)確定給定的參數(shù)是否可注入。根據(jù)本文演示的情況,我們已經(jīng)設(shè)置OWASP mutillidae的安全性為0,因此這里是可注入的,同時(shí)SQLmap也檢測(cè)到后臺(tái)數(shù)據(jù)庫(kù)DBMS可能為MYSQL。
如上圖所示,工具識(shí)別后臺(tái)數(shù)據(jù)庫(kù)可能為MYSQL,因此提示用戶(hù)是否跳過(guò)其它類(lèi)型數(shù)據(jù)庫(kù)的檢測(cè)。
“由于本文在演示之前已經(jīng)知道被檢測(cè)數(shù)據(jù)庫(kù)是MYSQL,因此這里選擇跳過(guò)對(duì)其它類(lèi)型數(shù)據(jù)庫(kù)的檢測(cè)?!?/p>
之后詢(xún)問(wèn)用戶(hù)是否引入(include)測(cè)試MYSQL相關(guān)的所有payload,這里選擇“yes”選項(xiàng):
測(cè)試過(guò)一些payloads之后,工具已經(jīng)識(shí)別出GET參數(shù)上一個(gè)由錯(cuò)誤引起的注入問(wèn)題和一個(gè)Boolean類(lèi)型引起的盲注問(wèn)題。
之后顯示該GET參數(shù)username是一個(gè)基于MYSQL union(union-based)類(lèi)型的查詢(xún)注入點(diǎn),因此這里跳過(guò)其它測(cè)試,深入挖掘已經(jīng)找出的漏洞。
至此,工具已經(jīng)識(shí)別出應(yīng)該深入挖掘的可能的注入點(diǎn):
接下來(lái),我把參數(shù)username傳遞給SQLmap工具,以對(duì)其進(jìn)行深入挖掘。通過(guò)上文描述的所有注入點(diǎn)和payloads,我們將對(duì)username參數(shù)使用基于Boolean的SQL盲注技術(shù),通過(guò)SQLmap中的–technique選項(xiàng)實(shí)現(xiàn)。其中選擇如下列表中不同的選項(xiàng)表示選用不同的技術(shù):
B : 基于Boolean的盲注(Boolean based blind)
Q : 內(nèi)聯(lián)查詢(xún)(Inline queries)
T : 基于時(shí)間的盲注(time based blind)
U : 基于聯(lián)合查詢(xún)(Union query based)
E : 基于錯(cuò)誤(error based)
S : 棧查詢(xún)(stack queries)
本例中也給出了參數(shù)名“username”,因此最后構(gòu)造的命令如下:
SQLmap –r ~root/Desktop/header.txt – -technique B – -p username – -current-user
這里-p選項(xiàng)表示要注入的參數(shù),“–current-user“選項(xiàng)表示強(qiáng)制SQLmap查詢(xún)并顯示登錄MYSQL數(shù)據(jù)庫(kù)系統(tǒng)的當(dāng)前用戶(hù)。命令得到輸出如下圖所示:
同時(shí)也可以看到工具也識(shí)別出了操作系統(tǒng)名,DBMS服務(wù)器以及程序使用的編程語(yǔ)言。
“”當(dāng)前我們所做的就是向服務(wù)器發(fā)送請(qǐng)求并接收來(lái)自服務(wù)器的響應(yīng),類(lèi)似客戶(hù)端-服務(wù)器端模式的交互。我們沒(méi)有直接與數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS交互,但SQLmap可以仍識(shí)別這些后臺(tái)信息。
同時(shí)本次與之前演示的SQL注入是不同的。在前一次演示SQL注入中,我們使用的是前綴與后綴,本文不再使用這種方法。之前我們往輸入框中輸入內(nèi)容并等待返回到客戶(hù)端的響應(yīng),這樣就可以根據(jù)這些信息得到切入點(diǎn)。本文我們往輸入框輸入永遠(yuǎn)為真的內(nèi)容,通過(guò)它判斷應(yīng)用程序的響應(yīng),當(dāng)作程序返回給我們的信息?!?/p>
結(jié)果分析
我們已經(jīng)給出當(dāng)前的用戶(hù)名,位于本機(jī),下面看看它在后臺(tái)做了什么。前文已經(jīng)說(shuō)過(guò),后臺(tái)是一個(gè)if判斷語(yǔ)句,它會(huì)分析該if查詢(xún),檢查username為jonnybravo且7333=7333,之后SQLmap用不同的字符串代替7333,新的請(qǐng)求如下:
page=user-info.php?username=’jonnybravo’ AND ‘a(chǎn)’='a’ etc..FALSE
page=user-info.php?username=’jonnybravo’ AND ‘l’='l’ etc..TRUE
page=user-info.php?username=’jonnybravo’ AND ‘s’='s’ etc..TRUE
page=user-info.php?username=’jonnybravo’ AND ‘b’='b’ etc..FALSE
如上所示,第一個(gè)和最后一個(gè)查詢(xún)請(qǐng)求結(jié)果為假,另兩個(gè)查詢(xún)請(qǐng)求結(jié)果為真,因?yàn)楫?dāng)前的username是root@localhost,包含字母l和s,因此這兩次查詢(xún)?cè)诓樵?xún)字母表時(shí)會(huì)給出包含這兩個(gè)字母的用戶(hù)名。
“這就是用來(lái)與web服務(wù)器驗(yàn)證的SQL server用戶(hù)名,這種情況在任何針對(duì)客戶(hù)端的攻擊中都不應(yīng)該出現(xiàn),但我們讓它發(fā)生了?!?/p>
去掉了–current-user選項(xiàng),使用另外兩個(gè)選項(xiàng)-U和–password代替。-U用來(lái)指定要查詢(xún)的用戶(hù)名,–password表示讓SQLmap去獲取指定用戶(hù)名對(duì)應(yīng)的密碼,得到最后的命令如下:
SQLmap -r ~root/Desktop/header.txt --technique B -p username -U root@localhost --passwords
命令輸出如下圖所示:
Self-Critical Evaluation
有時(shí)可能沒(méi)有成功獲取到密碼,只得到一個(gè)NULL輸出,那是因?yàn)橄到y(tǒng)管理員可能沒(méi)有為指定的用戶(hù)設(shè)定認(rèn)證信息。如果用戶(hù)是在本機(jī)測(cè)試,默認(rèn)情況下用戶(hù)root@localhost是沒(méi)有密碼的,需要使用者自己為該用戶(hù)設(shè)置密碼,可以在MySQL的user數(shù)據(jù)表中看到用戶(hù)的列表,通過(guò)雙擊password區(qū)域來(lái)為其添加密碼?;蛘呖梢灾苯佑孟聢D所示的命令直接更新指定用戶(hù)的密碼:
這里將密碼設(shè)置為“sysadmin“,這樣SQLmap就可以獲取到該密碼了,如果不設(shè)置的話,得到的就是NULL。
通過(guò)以上方法,我們不直接與數(shù)據(jù)庫(kù)服務(wù)器通信,通過(guò)SQL注入得到了管理員的登錄認(rèn)證信息。
總結(jié)
本文描述的注入方法就是所謂的SQL盲注,這種方法更繁瑣,很多情況下比較難以檢測(cè)和利用。相信讀者已經(jīng)了解傳統(tǒng)SQL注入與SQL盲注的不同。在本文所處的背景下,我們只是輸入?yún)?shù),看其是否以傳統(tǒng)方式響應(yīng),之后憑運(yùn)氣嘗試注入,與之前演示的注入完全是不同的方式。
防止SQL注入,我們需要注意以下幾個(gè)要點(diǎn):
1.永遠(yuǎn)不要信任用戶(hù)的輸入。對(duì)用戶(hù)的輸入進(jìn)行校驗(yàn),可以通過(guò)正則表達(dá)式,或限制長(zhǎng)度;對(duì)單引號(hào)和 雙"-"進(jìn)行轉(zhuǎn)換等。
2.永遠(yuǎn)不要使用動(dòng)態(tài)拼裝sql,可以使用參數(shù)化的sql或者直接使用存儲(chǔ)過(guò)程進(jìn)行數(shù)據(jù)查詢(xún)存取。
3.永遠(yuǎn)不要使用管理員權(quán)限的數(shù)據(jù)庫(kù)連接,為每個(gè)應(yīng)用使用單獨(dú)的權(quán)限有限的數(shù)據(jù)庫(kù)連接。
4.不要把機(jī)密信息直接存放,加密或者h(yuǎn)ash掉密碼和敏感的信息。
5.應(yīng)用的異常信息應(yīng)該給出盡可能少的提示,最好使用自定義的錯(cuò)誤信息對(duì)原始錯(cuò)誤信息進(jìn)行包裝
6.sql注入的檢測(cè)方法一般采取輔助軟件或網(wǎng)站平臺(tái)來(lái)檢測(cè),軟件一般采用sql注入檢測(cè)工具jsky,網(wǎng)站平臺(tái)就有億思網(wǎng)站安全平臺(tái)檢測(cè)工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻擊等。
WebCruiser Web Vulnerability Scanner是一個(gè)功能不凡的Web應(yīng)用漏洞掃描器,能夠?qū)φ麄€(gè)網(wǎng)站進(jìn)行漏洞掃描,并能夠?qū)Πl(fā)現(xiàn)的漏洞(SQL注入,跨站腳本)進(jìn)行驗(yàn)證;它也可以單獨(dú)進(jìn)行漏洞驗(yàn)證。
網(wǎng)站爬蟲(chóng)(目錄及文件);
漏洞掃描(SQL注入,跨站腳本);
漏洞驗(yàn)證(SQL注入,跨站腳本);
SQL Server明文/字段回顯/盲注;
MySQL字段回顯/盲注;
Oracle字段回顯/盲注;
DB2字段回顯/盲注;
Access字段回顯/盲注;
管理入口查找;
GET/Post/Cookie 注入;
搜索型注入延時(shí);
自動(dòng)從自帶瀏覽器獲取Cookie進(jìn)行認(rèn)證;
自動(dòng)判斷數(shù)據(jù)庫(kù)類(lèi)型;
自動(dòng)獲取關(guān)鍵詞;
多線程;
高級(jí):代理、敏感詞替換/過(guò)濾;
報(bào)告;WebCruiser Web Vulnerability Scanner是一個(gè)功能不凡的Web應(yīng)用漏洞掃描器,能夠?qū)φ麄€(gè)網(wǎng)站進(jìn)行漏洞掃描,并能夠?qū)Πl(fā)現(xiàn)的漏洞(SQL注入,跨站腳本)進(jìn)行驗(yàn)證;它也可以單獨(dú)進(jìn)行漏洞驗(yàn)證。
網(wǎng)站爬蟲(chóng)(目錄及文件);
漏洞掃描(SQL注入,跨站腳本);
漏洞驗(yàn)證(SQL注入,跨站腳本);
SQL Server明文/字段回顯/盲注;
MySQL字段回顯/盲注;
Oracle字段回顯/盲注;
DB2字段回顯/盲注;
Access字段回顯/盲注;
管理入口查找;
GET/Post/Cookie 注入;
搜索型注入延時(shí);
自動(dòng)從自帶瀏覽器獲取Cookie進(jìn)行認(rèn)證;
自動(dòng)判斷數(shù)據(jù)庫(kù)類(lèi)型;
自動(dòng)獲取關(guān)鍵詞;
多線程;
高級(jí):代理、敏感詞替換/過(guò)濾;
報(bào)告;