sql盲注讲解
盲注
有時候,開發(fā)人員不會把數(shù)據(jù)庫報錯信息顯示在前端頁面,這樣就使我們想要通過union注入或報錯注入的攻擊方式難以實現(xiàn)。
當(dāng)不顯示報錯信息的時候,我們還可以通過盲注的方式來對數(shù)據(jù)庫進行注入攻擊。
盲注,顧名思義,就是在頁面沒有提供明顯信息的情況執(zhí)行的注入方式。
盲注又分為兩種,布爾型盲注和時間型盲注。
布爾型盲注,以sqli-lab第8關(guān)為例:
1、輸入id=1正常顯示,輸入id=123456顯示與正常不同,顯示為空,輸入id=1'不報錯,但是顯示也是為空
這里輸入id=1' 的時候,可能是兩種情況。一種就是1’被當(dāng)做字符串處理,數(shù)據(jù)庫查詢的就是id="1'",這樣數(shù)據(jù)庫中沒有這個值,所以查詢?yōu)榭眨鷌d=123456相同。
另一種就是單引號被拼接進數(shù)據(jù)庫語句中,形成注入,然后前端沒有報錯信息顯示,所以返回為空。
2、通過構(gòu)造sql注入語法來嘗試,發(fā)現(xiàn)這里就是存在sql注入。
我們已知的是1=1和1=2顯示不同,沒有其他任何信息。這種情況下就稱為布爾型盲注。
3、布爾型盲注會利用到數(shù)據(jù)庫中的一些表達式:
length() :字符串長度
substr():截取字符串
ascii():字符串的ascii編碼
4、布爾型盲注的要點就是通過不停發(fā)送數(shù)據(jù)包,對結(jié)果進行真假判斷,從而得到正確結(jié)果。
a.1' and length(database())=1--+ 對當(dāng)前數(shù)據(jù)庫名的字符串長度進行確認,只有當(dāng)最后的長度為正確長度時候,頁面就會返回id=1時候的正確頁面。類似于1' and 1=1--+
通過burpsuite的fuzz方式得到數(shù)據(jù)庫長度為8
5、知道長度之后,就需要對字符進行確認,實際上原理都一樣
1' and substr(database(),1,1)='a'--+
通過database()這個表達式表現(xiàn)數(shù)據(jù)庫名,然后從左起第1位開始截取1個字符,以此類推,直到得到所有結(jié)果為止。
6、通過burpsuite的手工方式可以讓大家明白盲注的原理。但是盲注一般不推薦手工,但原理必需明白。只有明白了原理才能寫出盲注的自動化利用腳本。除了自己寫腳本外,也可以使用sqlmap之類的工具幫助你盲注。
時間型盲注
當(dāng)不管我們?nèi)绾屋斎耄撁嫘畔⒍紱]有任何變化的時候,不提供給攻擊者任何有用的信息,這時候就只能嘗試時間型盲注。
時間型盲注就是在布爾型盲注的基礎(chǔ)上增加了時間的判斷。
時間盲注的關(guān)鍵函數(shù)是if(),sleep(),通過對布爾型注入的判斷,輔以時間延遲的方法,來最終獲得注入結(jié)果。
以第9關(guān)為例:
1' and if(length(database())=1,sleep(5),1)%23
if(length(database())>1,sleep(5),1) 如果數(shù)據(jù)庫名字符長度大于1為真,則mysql休眠5秒,否則查詢1。
判定的方法就是根據(jù)請求響應(yīng)的時間來判定,其他操作跟布爾型雷同。
總結(jié)
- 上一篇: iOS8.1系统优化图文教程
- 下一篇: docin com豆丁网(免费文档资料下