网络安全实战第18期:盲注极限之 1 bit 也能挖出数据 当页面什么都不显示时数据还能被读走吗盲注的 1 bit 通道网络安全实战 90 天 · Week 3 注入风险 | 难度 ★★★ 进阶 | 关键词盲注 二分法 响应时间 信息泄露 请求频率告警前面讲的招式都建立在「页面会把结果打出来」这个前提上。把前提拿掉——页面只说「存在」或「不存在」——数据还能不能泄露能但速率会被压到一个非常低的水平。理解这个速率上限比记住 payload 更有价值它同时是操作的代价也是防护的抓手。一、前提被拿掉之后剩下的东西把响应里所有内容剥掉能观察的只剩三种状态码、响应体有没有某段固定文字、响应耗时。这三样都是一比特的信息量。盲注的全部技巧就是围绕「怎么把这 1 bit 用满」展开的。可观察量取值范围单次请求承载的信息状态码2xx / 4xx / 5xx约 1 bit固定文字出现与否有 / 无1 bit响应耗时正常 / 明显延迟1 bit噪声较大说明本文全部操作在自建靶场本机 Docker 中的 DVWA完成仅用于理解信息泄露的最小条件。真实环境中的同类验证必须在授权范围内并严格控制请求频率——盲注本身的性质就决定了它会产生大量请求这在任何生产系统上都是可被监测的行为。二、第一步确认到底有几种状态先别急着构造条件。拿两个明显不同的输入去撞一下看页面会不会出现可区分的变化。这一步不成立后面全做不了。靶场的盲注页面里输入 1 会显示一句「用户存在」输入 999 什么都不显示。这就是仅有的两个状态。三、第二步把判断条件接进去确认存在两个状态之后把一个恒真条件和一个恒假条件接上去。能区分开布尔型通道就建立了。bash1 AND 11 -- 1 AND 12 --第一条显示「存在」第二条没有任何输出。两个状态稳定可区分。四、第三步先猜长度再猜字符直接逐字符猜成本极高。先用长度把范围压到一个有限枚举再逐位确定字符总请求数能少一个数量级。bash1 AND LENGTH(database())3 -- 1 AND LENGTH(database())4 -- 1 AND LENGTH(database())5 --只有等于 4 时页面显示「存在」长度确定为 4。五、第四步用二分法把每个字符压到 7 次以内逐字符试是线性成本二分是 log 成本。把字符转成 ASCII 数值用大于 / 小于把区间砍半——可打印字符一共 95 个7 次足够定位一个。bash1 AND SUBSTRING(database(),1,1)d -- 1 AND ASCII(SUBSTRING(database(),1,1))100 -- 1 AND ASCII(SUBSTRING(database(),1,1))100 --首字符 ASCII 为 100对应小写 d同样方法依次得到后续三位拼起来就是一个 4 字符的库名。5.1 这一步真正的收获同样的信息换个问法成本掉一个数量级。这个观察不只属于注入——任何「只能得到是 / 否」的信息通道二分都是标准优化。把这句话反过来读就是防护思路只要单次请求能拿到的信息量足够小读取就必然慢慢就必然留下日志。六、第五步当连两个状态都没有时用时间更严苛的情况是页面在条件成立与不成立时返回完全一致。这时唯一还能观察的就是耗时让数据库在条件成立时停顿几秒。bash1 AND SLEEP(5) -- 1 AND IF(LENGTH(database())4,SLEEP(5),0) -- 1 AND IF(SUBSTRING(database(),1,1)d,SLEEP(5),0) --第一条确认延时函数可用后两条把条件包进分支里条件成立才停顿。信息通道从「页面文字」换到了「响应时间」。6.1 为什么必须先测基线网络本身有抖动2 秒和 5 秒在链路上不好分。做法是先发一个条件恒假的请求测出正常响应耗时作为基线再和延时请求对比阈值拉大到 10 秒以上误判率会明显下降。这一步在真实环境里尤其重要——跨地域访问的抖动可能比延时函数本身还大。七、交给工具但要知道它在干什么手工走这一遍是为了理解原理真实场景不可能一位一位敲。工具可以按技术类型限定检测方式布尔型和时间型分别对应不同的参数。bashsqlmap -u http://127.0.0.1/vulnerabilities/sqli_blind/?id1SubmitSubmit \ --cookiePHPSESSID你的值; securitylow --techniqueB --dbs工具用布尔盲注跑出的库名与手工结果一致。同一件事手工一个多小时工具几分钟——差别只在于它把循环写好了。防护侧记盲注的请求量是它的致命弱点。几十到几百次同源、同参数、几乎等间隔的请求在访问日志里形态非常突出。所以对这类行为基于频率与相似度的告警比基于内容的规则更有效——请求方可以变换 payload但变不了「必须问很多次」这件事。八、踩坑记录坑点症状解决办法两个状态一模一样页面完全无差异改用时间通道或检查是否选错了参数延时函数不生效响应一直几百毫秒被禁用换等价的耗时函数延迟判断不准2 秒和 5 秒分不清阈值加到 10 秒先测一次基线跑在 POST 接口上扫不到工具报无注入改传表单数据参数位置要对手工太慢放弃猜一个字符几十秒改用二分法或限定检测技术交给工具盲注慢是物理限制不是工具写得差。每次请求只带 1 bit这条下限改不了。基线比 payload 重要。不测基线的延时判断全是猜的。手工做一遍的价值在于知道工具报「慢」的时候它在等什么。九、小结盲注的本质是把一次查询拆成很多次是非题速率上限由信息论决定。二分法用同样的信息换来了数量级的效率提升——这是全文最值得带走的一个技巧。时间通道依赖基线测量跳过基线等于放弃可信度。从防护角度看盲注的「必须高频请求」是可检测特征频率与相似度告警比内容规则更稳。下一篇看过滤与拦截当输入里的特殊字符被处理掉之后哪些防线会先失效。