盲注
有時候,開發人員不會把數據庫報錯信息顯示在前端頁面,這樣就使我們想要通過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。
判定的方法就是根據請求響應的時間來判定,其他操作跟布爾型雷同。