一、漏洞原理
BENCHMARK(count, expr) 是 MySQL 内置函数,用于重复执行表达式 expr 共 count 次。它本是性能测试工具,但被攻击者利用做时间盲注(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 防护方案(基于截图)

截图中展示的是百度云 Web 应用防火墙(WAF) 的防护配置界面,可以看到直接相关的规则:
对应规则
| 规则名称 | 规则 ID | 风险等级 | 说明 |
|---|---|---|---|
Injection.mysql_delay_inject.A | 4199 | 中风险 | 检测 MySQL 延时注入攻击(即 BENCHMARK/SLEEP 盲注) |
Injection.mysql_delay_inject.A | 4200 | 中风险 | 延时注入检测补充规则 |
Injection.oracle_delay_inject.A | 4205 | 中风险 | 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 外的防御建议
- 参数化查询(最根本):使用 Prepared Statements,彻底杜绝注入
- 最小权限原则:数据库账号禁用 SUPER 权限,限制执行复杂函数
- 网络层:限制数据库只对应用服务器开放,不暴露公网
- 监控告警:对慢查询、异常高 CPU 进行告警(百度云 WAF 支持日志投递和告警设置,截图中也可看到)
- 响应时间异常检测:如果单个请求耗时异常长,可能是延时注入正在进行


