sql盲注講解


盲注

有時候,開發人員不會把數據庫報錯信息顯示在前端頁面,這樣就使我們想要通過union注入或報錯注入的攻擊方式難以實現。

當不顯示報錯信息的時候,我們還可以通過盲注的方式來對數據庫進行注入攻擊。

盲注,顧名思義,就是在頁面沒有提供明顯信息的情況執行的注入方式。

盲注又分為兩種,布爾型盲注和時間型盲注。

布爾型盲注,以sqli-lab第8關為例:

1、輸入id=1正常顯示,輸入id=123456顯示與正常不同,顯示為空,輸入id=1'不報錯,但是顯示也是為空

這里輸入id=1' 的時候,可能是兩種情況。一種就是1’被當做字符串處理,數據庫查詢的就是id="1'",這樣數據庫中沒有這個值,所以查詢為空,跟id=123456相同。

另一種就是單引號被拼接進數據庫語句中,形成注入,然后前端沒有報錯信息顯示,所以返回為空。

2、通過構造sql注入語法來嘗試,發現這里就是存在sql注入。

我們已知的是1=1和1=2顯示不同,沒有其他任何信息。這種情況下就稱為布爾型盲注。

3、布爾型盲注會利用到數據庫中的一些表達式:

length() :字符串長度

substr():截取字符串

ascii():字符串的ascii編碼

4、布爾型盲注的要點就是通過不停發送數據包,對結果進行真假判斷,從而得到正確結果。

a.1' and length(database())=1--+ 對當前數據庫名的字符串長度進行確認,只有當最后的長度為正確長度時候,頁面就會返回id=1時候的正確頁面。類似於1' and 1=1--+

通過burpsuite的fuzz方式得到數據庫長度為8

5、知道長度之后,就需要對字符進行確認,實際上原理都一樣

1' and substr(database(),1,1)='a'--+

通過database()這個表達式表現數據庫名,然后從左起第1位開始截取1個字符,以此類推,直到得到所有結果為止。

6、通過burpsuite的手工方式可以讓大家明白盲注的原理。但是盲注一般不推薦手工,但原理必需明白。只有明白了原理才能寫出盲注的自動化利用腳本。除了自己寫腳本外,也可以使用sqlmap之類的工具幫助你盲注。

時間型盲注

當不管我們如何輸入,頁面信息都沒有任何變化的時候,不提供給攻擊者任何有用的信息,這時候就只能嘗試時間型盲注。

時間型盲注就是在布爾型盲注的基礎上增加了時間的判斷。

時間盲注的關鍵函數是if(),sleep(),通過對布爾型注入的判斷,輔以時間延遲的方法,來最終獲得注入結果。

以第9關為例:

1' and if(length(database())=1,sleep(5),1)%23

if(length(database())>1,sleep(5),1) 如果數據庫名字符長度大於1為真,則mysql休眠5秒,否則查詢1。

判定的方法就是根據請求響應的時間來判定,其他操作跟布爾型雷同。




免責聲明!

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



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