MySQL BENCHMARK 延时盲注漏洞详解 & 百度云 WAF 防护


一、漏洞原理

BENCHMARK(count, expr) 是 MySQL 内置函数,用于重复执行表达式 exprcount 次。它本是性能测试工具,但被攻击者利用做时间盲注(Time-Based Blind SQL Injection)

核心思想

当攻击者无法从页面回显中直接获取数据(联合查询被过滤、错误信息被屏蔽),但能通过响应时间差异判断条件真假时,就可以利用延时函数逐位猜解数据。

攻击 Payload 示例

-- 如果第一个字符是 'a',服务器会"卡"约 5 秒
' AND IF(SUBSTRING(database(),1,1)='a', BENCHMARK(5000000,SHA1('test')), 0) -- 

-- 猜解管理员密码
' AND IF(SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='e', BENCHMARK(10000000,ENCODE('msg','by 5 seconds')),0) --

攻击流程

1. 攻击者构造带 BENCHMARK 的注入语句
2. 条件为真 → BENCHMARK 执行大量计算 → 响应延迟数秒
3. 条件为假 → 立即返回(无延迟)
4. 通过时间差异逐字符猜解:库名 → 表名 → 字段名 → 数据
5. ASCII 范围只需 ~7 次二分/线性探测即可确定一个字符

完整猜解一个 32 位 MD5 密码,大约需要 32 × 7 = 224 次请求


二、与 SLEEP() 的区别

特性BENCHMARK()SLEEP()
延迟方式CPU 密集计算消耗时间直接暂停线程
可预测性受服务器性能影响大延迟精确可控
检测难度更隐蔽(看起来像慢查询)更容易被发现
MySQL 版本全版本5.0.12+

三、危害

  • 数据泄露:逐位猜解出数据库中的任意数据(密码、隐私信息等)
  • 无需回显:即使页面不返回查询结果也能攻击
  • 绕过简单过滤:不依赖 UNION/错误回显,很多基础防御无效
  • 资源消耗:大量 BENCHMARK 调用会消耗 CPU,可间接造成 DoS

四、百度云 WAF 防护方案(基于截图)

MySQL BENCHMARK 延时盲注漏洞详解 & 百度云 WAF 防护

截图中展示的是百度云 Web 应用防火墙(WAF) 的防护配置界面,可以看到直接相关的规则:

对应规则

规则名称规则 ID风险等级说明
Injection.mysql_delay_inject.A4199中风险检测 MySQL 延时注入攻击(即 BENCHMARK/SLEEP 盲注)
Injection.mysql_delay_inject.A4200中风险延时注入检测补充规则
Injection.oracle_delay_inject.A4205中风险Oracle 延时盲注(WAITFOR DELAY 等)

防护机制

百度云 WAF 采用多层策略集体系:

├── 低级策略集(宽松)   → 允许更多流量,少误杀
├── 中级策略集(默认)   → 平衡安全与可用性
├── 高级策略集(严格)   → 截图当前选中的级别,规则最全
└── 主机防护规则         → 系统级防护

当前使用的是 高级策略集(严格),共 973 条内置规则,其中包含针对延时盲注的专项检测。

检测逻辑(WAF 层面)

WAF 在 HTTP 请求到达后端之前进行正则/语义匹配,拦截含有以下特征的请求:

# 关键词匹配
BENCHMARK\s*\(\s*\d+
SLEEP\s*\(\s*\d+
WAITFOR\s+DELAY
IF\s*\(\s*SUBSTRING\s*\(
# 结合 SQL 注入上下文判断

同时结合语义分析降低误报——单纯在论坛讨论中提到 “BENCHMARK” 不会触发,但在参数值中出现函数调用模式则会被拦截。


五、除 WAF 外的防御建议

  1. 参数化查询(最根本):使用 Prepared Statements,彻底杜绝注入
  2. 最小权限原则:数据库账号禁用 SUPER 权限,限制执行复杂函数
  3. 网络层:限制数据库只对应用服务器开放,不暴露公网
  4. 监控告警:对慢查询、异常高 CPU 进行告警(百度云 WAF 支持日志投递和告警设置,截图中也可看到)
  5. 响应时间异常检测:如果单个请求耗时异常长,可能是延时注入正在进行

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧