基于时间延迟注入(Time-based)- 时间盲注
利用sleep()或benchmark()等函数让mysql执行时间变长,通过页面的响应时间来判断条件是否正确。经常与if(expr1,expr2,expr3)语句结合使用,if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。
通俗讲就是当页面不返回查询结果或者是返回空无法判断注入的语句是否成功时,通过注入特定的SQL语句,根据也面对请求的时间反馈来判断是否注入成功。
时间盲注原理介绍
--后端SQL语句写法
select * from tables where id ='?'
--构造输入完成注入后的SQL,输入为:1' and sleep(3) --
select *from tables where id = '1' and sleep(3) --'
--注入作用说明:
--1、当id='1' 条件为真时,注入请求就会等待3秒钟
--2、当id='1' 条件为假时,注入请求就会立即返回
时间盲注经常搭配的数据库函数
substr(a,b,c):从b位置开始截取a字符串的C长度
count():统计总数
ascii():返回字符的ASCII码
length():返回字符串的长度
left(a,b):从左往右截取字符串a的前b个字符
sleep(x):SQL语句执行程序睡眠x秒
。。。。
时间盲注过程演示
分析:该查询接口并不会返回查询结果也没有报错信息,因此无法使用前几篇文章演示的在输入中添加'符号分析返回错误信息判断该接口是否存在注入漏洞,可行的方案是通过时间盲注的方式。
猜测后端的SQL查询语句
从上图可以看出这是一个通过输入电影名称查询电影信息功能,由此可以推测后端可能的SQL查询语句如下
--模糊查询(从业务分析大概率是支持模糊查询)
select *from movie_table where movie like '%?%'
--精确查询
select *from movie_table where movie = '?'
构造输入验证
构造输入的内容为:t%' and sleep(5) --
select *from movie_table where movie like '%t%' and sleep(5)
正常查询
从上述执行验证过程中的接口响应时间可以看出sleep函数是被执行的,这就说明此处存在注入漏洞。
漏洞利用
利用该漏洞获取数据库名称长度信息演示过程
使用hackbar工具辅助进行测试,输入:World War Z' and length(database())<5 and sleep(4) --
用于判断数据库的名称长度是否小于5,如果为真则请求将阻塞4秒,否则请求立即完成。
通过测试可确定数据库的长度是大于等于5的
请求耗时
修改输入:World War Z' and length(database())=5 and sleep(4) --
因为前一步已经知道数据库名称长度是大于等于5的,则判断数据库名称长度是否等于5
通过请求耗时可以确定数据库名称长度就是等于5(正常情况下需要进行多次重复这个过程才能找出数据库的名称长度)
请求耗时
通过上述分析我们使用length函数我们得出了数据库的名称长度为5,我们也可以通过substr函数获取数据库的真实名称,过程如下:
判断数据库名称的第一个字母是否为a,通过测试数据库名称第一个字母不为a
请求耗时
判断数据库名称的第一个字母是否为b,通过测试数据库名称第一个字母就为b。(实际分析过程可能需要对比多次才能找到匹配的字母,一次遍历每一个字最后得出完整数据名称)
请求耗时
思考题
从上述注入过程中我们不但获取了数据库的名称长度和真实数据库名称,通过结合其他函数以及自动化脚本的帮助我们就可以对数据库、表、表字段、表中的数据进行分析最终获取到数据库所有信息。
欢迎大家关注我的订阅号,会定期分享一些关于测试相关的文章,有问题也欢迎一起讨论学习!