bool型盲注有區別與之前的基於時間的盲注,bool型盲注的頁面輸入會影響輸出。
我們來看操作理解一下:
語句結構id=1 ,我們去做判斷的時候是id=1 and 1=1,and 1=1的本質是返回一個true,true可以用1來代替,正常回顯。我們很多時候就會去接and=0,0類似於1=2返回是false, false類似於0的作用。
最後會影響到查詢結果的是後面的0和1。
比如說觸發查詢數據,if觸達的sleep執行成功返回SLEEP,執行失敗返回0,
如果映射到bool型盲注這裏不再是sleep,返回的結果變成1和0,如果if語句成功執行,它返回結果就是1和1,它不能成功執行返回的就是1和0。可以根據頁面的返回內容來判斷出到底語句查詢是成功還是失敗。bool型盲注的邏輯和基於時間的盲注是類似的,只不過判斷的方法上是略微有點區別。理解了基於時間的盲注後再回過頭來理解bool型盲注其實還應該是比較容易的。
先分享一些場景下截取相關的函數作爲知識補充,然後分享一道題。
(說起截取函數在第三節內容中提到過SUBSTRING函數,它是支持這種結構的,)
mid函數 、ORD()函數 、ASCII()函數
題目分享:
連接數據庫操作,查詢user id是否存在,如果存在這個值,查詢出數據是一條就會進入到下面的一個邏輯中去。我們剛纔返回的是“ error password”,出現這個結果是因爲下面邏輯沒有滿足:
針對bool型注入,是不是隻要你能夠有一個true and fasle,就可以了,可以針對下面這個語句進行注入:
如果數據中存在id就會走到上面的if else 邏輯裏面去,因爲我們不知道密碼,最終返回的是error password。如果id是不存在的,它返回來就不會是一條是零條,所以它返回的就是一個error user id。
驗證一下,我們將user id 改成0
返回的是 error userid,說明,當userid 是0或1的時候對輸出產生了影響,基於這裏,我們就已經可以對它做一個盲注。我們來寫一下腳本,和之前的邏輯一樣引入一個庫:
寫腳本思路:
對它做一個分割和分離,分離的時候我們要看他的過濾機制到底是哪一些。
- 空格不能用,但可以用內聯註釋
- 不能引號就用阿斯克碼來代替
小於127,返回error password,
大於127,返回 error userid。
做盲注的時候可以將大於號變成等號,用二分法更快一點。
再舉一個放字母的栗子:
直接複製下鏈接:
請求發出去之後對它做一個判斷,定義一個變量,操作如圖:
可以隨便設time,out,但不能設太低,會直接報錯。這個請求發出去後會有一個response返回來,如果我們去檢測response中的內容,
我們想要的是error password,(content就是response中的頁面的信息),針對頁面信息我們去做個匹配,使用find進行匹配,找不到就返回-1,找到了就要做個添加,操作如圖:
找到後對返回值做添加:
繼續等待返回結果:
以上內容參考安全牛課堂《CTF從入門到提升》
課程地址:https://www.aqniukt.com/my/course/8954