簡介
本文首要存眷SQL注進(jìn),假定讀者已體味一般的SQL注進(jìn)手藝,在我之前的文章中有過介紹,即經(jīng)由過程輸進(jìn)不合的參數(shù),等候辦事器的反應(yīng),以后經(jīng)由過程不合的前綴和后綴(suffix and prefix )注進(jìn)到數(shù)據(jù)庫。本文將更進(jìn)一步,會(huì)商SQL盲注,假定讀者沒有任何相干常識(shí)儲(chǔ)蓄,建議先往wikipedia進(jìn)修一下。在繼續(xù)之前需要提示一下,假定讀者也想要按本文的步調(diào)進(jìn)行,需要在NOWASP Mutillidae環(huán)境搭建好以后先注冊(cè)一個(gè)NOWASP Mutillidae帳號(hào)。

SQL注進(jìn)媒介
本文演示從web界面注進(jìn)SQL號(hào)令的編制,但不會(huì)直接連接到數(shù)據(jù)庫,而是想編制使后端數(shù)據(jù)庫措置法度將我們的查詢語句當(dāng)作SQL號(hào)令往履行。本文先描述一些注進(jìn)根本常識(shí),以后講授盲注的相干內(nèi)容。
Show Time
這里我以用戶名“jonnybravo”和暗碼“momma”登錄,之掉隊(duì)進(jìn)用戶查看頁面,位于OWASP 2013 >A1 SQL Injection >Extract data >User Info。要查看用戶信息,需要輸進(jìn)用戶ID與暗碼登錄,以后便可以看到當(dāng)前用戶的信息了。
如我之前的文章所提到的那樣,這個(gè)頁面包含SQL注進(jìn)縫隙,所以我會(huì)測驗(yàn)測驗(yàn)各類注進(jìn)編制來把持?jǐn)?shù)據(jù)庫,需要利用我之前文章提到的后綴(suffix)與前綴(prefix)的同化。這里我利用的注進(jìn)語句以下:
Username: jonnybravo’ or 1=1; –
該注進(jìn)語句要做的就是從數(shù)據(jù)庫查詢用戶jonnybravo,獲得數(shù)據(jù)后當(dāng)即終止查詢(操縱單引號(hào)),以后緊接著一條OR語句,因?yàn)檫@是一條“if狀況”查詢語句,并且這里給出 “or 1=1”,暗示該查詢永久為真。1=1暗示獲得數(shù)據(jù)庫中的所有記實(shí),以后的;–暗示結(jié)束查詢,奉告數(shù)據(jù)庫當(dāng)前語句后面沒有其它查詢語句了。

圖1 正常編制查看用戶信息
將payload注進(jìn)后,辦事器泄漏了數(shù)據(jù)庫中的所有效戶信息。如圖2所示:

圖2 注進(jìn)payload導(dǎo)致數(shù)據(jù)庫中所稀有據(jù)泄漏
至此,本文向讀者演示了一種根基SQL注進(jìn),下面筆者用BackTrack和Samurai 等滲入測試發(fā)行版中自帶的SQLmap東西向讀者演示。要利用SQLmap,只需要打開終端,輸進(jìn)SQLmap并回車,以下圖所示:

假定讀者初次利用SQLmap,不需要甚么預(yù)先把持。假定已利用過該東西,需要利用—purge-output選項(xiàng)將之前的輸出文件刪除,以下圖所示:
本文會(huì)演示一些比較奇特的把持。凡是人們利用SQLmap時(shí)會(huì)直接指定URL,筆者也是用該東西闡發(fā)要求,但會(huì)先用Burp查看要求并將其保留到一個(gè)文本文件中,以后再用SQLmap東西調(diào)用該文本文件進(jìn)行掃描。以上就是一些預(yù)備工作,下面起首就是先獲得一個(gè)要求,以下所示:
GET /chintan/index.php?page=user-info.php&username=jonnybravo&password=momma&user-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: http://localhost/chintan/index.php?page=user-info.php
Cookie: showhints=0; username=jonnybravo; uid=19; PHPSESSID=f01sonmub2j9aushull1bvh8b5
Connection: keep-alive
將該要求保留到一個(gè)文本文件中,以后發(fā)送到KALI linux中,用以下號(hào)令將該要求頭部傳給SQLmap:
SQLmap –r ~/root/Desktop/header.txt
Self-Critical Evaluation
號(hào)令中-r選項(xiàng)暗示要讀取一個(gè)包含要求的文件,~/root/Desktop/header.txt暗示文件的位置。假定讀者用VMware,例如在Windows上用虛擬機(jī)跑KALI,履行號(hào)令時(shí)可能產(chǎn)生以下圖所示的弊端提示:
這里必需在要求頭中指定一個(gè)IP地址,使KALI linux能與XP正常通信,點(diǎn)竄以下圖所示:
以后號(hào)令就可以正常履行了,顯示成果以下圖所示:

根基上該東西做的就是闡發(fā)要求并肯定要求中的第一個(gè)參數(shù),以后對(duì)該參數(shù)進(jìn)行各類測試,以肯定辦事器上運(yùn)行的數(shù)據(jù)庫類型。對(duì)每個(gè)要求,SQLmap城市對(duì)要求中的第一個(gè)參數(shù)進(jìn)行各類測試。
GET /chintan/index.php?page=user-info.php&username=jonnybravo&password=momma&user-info-php-submit-button=View+Account+Details HTTP/1.1
SQLmap可以檢測多種數(shù)據(jù)庫,如MySQL、Oracle SQL、PostgreSQL、Microsoft SQL Server等。
下圖是筆者系統(tǒng)中SQLmap正在對(duì)指定的要求進(jìn)行檢測時(shí)顯示的數(shù)據(jù)庫列表:
起首它會(huì)肯定給定的參數(shù)是不是可注進(jìn)。按照本文演示的環(huán)境,我們已設(shè)置OWASP mutillidae的安然性為0,是以這里是可注進(jìn)的,同時(shí)SQLmap也檢測到后臺(tái)數(shù)據(jù)庫DBMS可能為MYSQL。
如上圖所示,東西辨認(rèn)后臺(tái)數(shù)據(jù)庫可能為MYSQL,是以提示用戶是不是跳過其它類型數(shù)據(jù)庫的檢測。
“因?yàn)楸疚脑谘菔局耙阎辣粰z測數(shù)據(jù)庫是MYSQL,是以這里選擇跳過對(duì)其它類型數(shù)據(jù)庫的檢測?!?/P>
以后扣問用戶是不是引進(jìn)(include)測試MYSQL相干的所有payload,這里選擇“yes”選項(xiàng):
測試過一些payloads以后,東西已辨認(rèn)出GET參數(shù)上一個(gè)由弊端引發(fā)的注進(jìn)標(biāo)題問題和一個(gè)Boolean類型引發(fā)的盲注標(biāo)題問題。
以后顯示該GET參數(shù)username是一個(gè)基于MYSQL union(union-based)類型的查詢注進(jìn)點(diǎn),是以這里跳過其它測試,深進(jìn)發(fā)掘已找出的縫隙。
至此,東西已辨認(rèn)出應(yīng)當(dāng)深進(jìn)發(fā)掘的可能的注進(jìn)點(diǎn):
接下來,我把參數(shù)username傳遞給SQLmap東西,以對(duì)其進(jìn)行深進(jìn)發(fā)掘。經(jīng)由過程上文描述的所有注進(jìn)點(diǎn)和payloads,我們將對(duì)username參數(shù)利用基于Boolean的SQL盲注手藝,經(jīng)由過程SQLmap中的–technique選項(xiàng)實(shí)現(xiàn)。此當(dāng)選擇以以下表中不合的選項(xiàng)暗示選用不合的手藝:
B : 基于Boolean的盲注(Boolean based blind)
Q : 內(nèi)聯(lián)查詢(Inline queries)
T : 基于時(shí)候的盲注(time based blind)
U : 基于結(jié)合查詢(Union query based)
E : 基于弊端(error based)
S : 棧查詢(stack queries)
本例中也給出了參數(shù)名“username”,是以最后機(jī)關(guān)的號(hào)令以下:
SQLmap –r ~root/Desktop/header.txt – -technique B – -p username – -current-user
這里-p選項(xiàng)暗示要注進(jìn)的參數(shù),“–current-user“選項(xiàng)暗示強(qiáng)迫SQLmap查詢并顯示登錄MYSQL數(shù)據(jù)庫系統(tǒng)的當(dāng)前用戶。號(hào)令獲得輸出以下圖所示:

同時(shí)也能夠看到東西也辨認(rèn)出了把持系統(tǒng)名,DBMS辦事器和法度利用的編程說話。
“”當(dāng)前我們所做的就是向辦事器發(fā)送要求并領(lǐng)受來自辦事器的響應(yīng),近似客戶端-辦事器端模式的交互。我們沒有直接與數(shù)據(jù)庫治理系統(tǒng)DBMS交互,但SQLmap可以仍辨認(rèn)這些后臺(tái)信息。
同時(shí)本次與之前演示的SQL注進(jìn)是不合的。在前一次演示SQL注進(jìn)中,我們利用的是前綴與后綴,本文不再利用這類編制。之前我們往輸進(jìn)框中輸進(jìn)內(nèi)容并等候返回到客戶端的響應(yīng),如許便可以按照這些信息獲得切進(jìn)點(diǎn)。本文我們往輸進(jìn)框輸進(jìn)永久為真的內(nèi)容,經(jīng)由過程它鑒定利用法度的響應(yīng),當(dāng)作法度返回給我們的信息?!?/P>
成果闡發(fā)
我們已給出當(dāng)前的用戶名,位于本機(jī),下面看看它在后臺(tái)做了甚么。前文已說過,后臺(tái)是一個(gè)if鑒定語句,它會(huì)闡發(fā)該if查詢,查抄username為jonnybravo且7333=7333,以后SQLmap用不合的字符串代替7333,新的要求以下:
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è)查詢要求成果為假,另兩個(gè)查詢要求成果為真,因?yàn)楫?dāng)前的username是root@localhost,包含字母l和s,是以這兩次查詢?cè)诓樵冏帜副頃r(shí)會(huì)給出包含這兩個(gè)字母的用戶名。
“這就是用來與web辦事器驗(yàn)證的SQL server用戶名,這類環(huán)境在任何針對(duì)客戶端的報(bào)復(fù)打擊中都不該該呈現(xiàn),但我們讓它產(chǎn)生了。”
往掉落了–current-user選項(xiàng),利用別的兩個(gè)選項(xiàng)-U和–password代替。-U用來指定要查詢的用戶名,–password暗示讓SQLmap往獲得指定用戶名對(duì)應(yīng)的暗碼,獲得最后的號(hào)令以下:
SQLmap -r ~root/Desktop/header.txt --technique B -p username -U root@localhost --passwords
號(hào)令輸出以下圖所示:

Self-Critical Evaluation
有時(shí)可能沒有成功獲得到暗碼,只獲得一個(gè)NULL輸出,那是因?yàn)橄到y(tǒng)治理員可能沒有為指定的用戶設(shè)定認(rèn)證信息。假定用戶是在本機(jī)測試,默許環(huán)境下用戶root@localhost是沒有暗碼的,需要利用者本身為該用戶設(shè)置暗碼,可以在MySQL的user數(shù)據(jù)表中看到用戶的列表,經(jīng)由過程雙擊password區(qū)域來為其添加暗碼?;蚩梢灾苯佑孟聢D所示的號(hào)令直接更新指定用戶的暗碼:
這里將暗碼設(shè)置為“sysadmin“,如許SQLmap便可以獲得到該暗碼了,假定不設(shè)置的話,獲得的就是NULL。
經(jīng)由過程以上編制,我們不直接與數(shù)據(jù)庫辦事器通信,經(jīng)由過程SQL注朝長進(jìn)步得了治理員的登錄認(rèn)證信息。
總結(jié)
本文描述的注進(jìn)編制就是所謂的SQL盲注,這類編制更繁瑣,良多環(huán)境下比較難以檢測和操縱。相信讀者已體味傳統(tǒng)SQL注進(jìn)與SQL盲注的不合。在本文所處的布景下,我們只是輸進(jìn)參數(shù),看其是不是以傳統(tǒng)編制響應(yīng),以后憑命運(yùn)測驗(yàn)測驗(yàn)注進(jìn),與之前演示的注進(jìn)美滿是不合的編制。