注入全方位之盲注
本文內容:
~盲注介紹
~盲注需要掌握的幾個函數
~延時注入(時間注入)做法
~我的理解
每日一句:
谷歌和百度是我們最好的老師
一、盲注介紹
1,注入攻擊的本質:
把用戶輸入的數據當作代碼去執行
2,條件:
~用戶可以控制輸入
~原本程序要執行的代碼,拼接了用戶輸入的內容,然後執行
3,定義:
盲注所對應的就是顯錯注入,顯錯注入我們之前講過,但是很多時候,
web服務器關閉了錯誤回顯,這時候就沒有辦法實行sql注入了嗎?
非也!
盲注就是在服務器沒有錯誤回顯的時候完成注入攻擊,由於沒有錯誤回顯,
對於攻擊者來說缺少了非常重要的“調試信息”
4,分類:
~布爾盲注[true,false]
根據注入信息返回true和false,也就沒有了之前的報錯信息
~時間盲注
界面返回值只有一種true,無論輸入任何值 返回情況都會按正常的來處理。
加入特定的時間函數,通過查看web頁面返回的時間差來判斷注入的語句是否正常
二、盲注需要掌握的幾個函數
1,length() 返回字符串的長度
應用:select length(database()); //獲取當前數據庫名的長度
應該:url id=1 and length(database())=12 //判斷當前數據庫名的長度是否是12位
2,substr() 截取字符串
用法:substr(操作的字符串,第幾位開始,分割幾位)
應用:select substr(database(),1,1) //截取當前數據庫名的第一位
3,ascii() 返回字符的ascii碼,在這的目的是將字符變成數字
用法:select ascii('n') //返回110,這是n的ascii編碼數
應用:where id=1 and ascii(substr(database(),1,1))>120
//判斷當前數據庫名的第一個字符的ascii碼是否大於120
//利用二分法,很快就可以判斷出當前數據庫名的第一個字符是什麼
補充:手工很累,可以利用burp的爆破功能,很快就可以爆出當前當前數據庫的名稱
這就是盲注的原理,後邊基本都一樣
sqlmap跑盲注如果沒跑出來,可能是等級的問題,提高測試等級試試:
sqlmap -u "url" --level 3
如果知道格式,可以手動幫助閉合,
sqlmap -u "url" " //這個額外的 " 出錯可以換成url編碼試試(%22)
直接補充 " 貌似會因爲無法閉合而造成問題,應該這樣:
如sqlmap -u url%22 或者 sqlmap -u "url"%22
額外提一句,如何清理sqlmap的緩存,--flush-session
三、延時注入(時間注入)做法
0,前言:
有的頁面,輸入and 1=1正常,輸入and 1=2也正常。這種情況下是不是沒有注入了呢,可能沒有,
也可能存在延時注入!
補充:
1,註釋問題:
錨點,即錨鏈接,超鏈接的一種。做sql注入要避免錨點帶來的影響。
建議一般註釋的時候,避免# 改爲%23
或者-- SuiBian,這的“-- ”是註釋的意思,但是空格往往被忽略,所以在空格後邊隨便補充點東西
反正會被註釋掉,所以加什麼都行
2,函數:
sleep(n) //n爲秒數,
應用:id=1 and sleep(10) -- suibian //如果頁面停止10秒,在正常返回,即存在延時注入
提示:不要sleep(幾千,幾萬)有風險!
if(句式一,句式二,句式三) //第一個是判斷語句,如果第一個正確就執行第二個,否則第三個
用法:
select if(1=1,5,'a') //返回5
select if(1=2,5,'a') //返回a
應用:
select if(ascii(substr(database(),1,1))==50,sleep(5),'a')
//接下來就正常操作
補充:這種延時注入是最不願意乾的,關於注入,能簡單就不要用麻煩的
四、我的理解:
顯錯注入與盲注是兩大類。
之前的post與get與head都是顯錯注入的一種,區別就是注入地方不同或者傳參方式不同。
本質上是,利用服務器的回顯(輸出點),不斷測試。
而盲注則相當於顯注麻煩了一些。
本期關鍵字:
顯錯注入:關閉回顯
布爾型: true false
函數:
substr(字符串,第幾位開始,取幾個字符)
利用burp的爆破加上substr()函數 爆出數據庫
ascill碼的含義
if(條件,成立返回,不成立返回)