SQL 注入验证是什么
SQL 注入(CWE-89)指应用把外部输入拼进 SQL 语句交给数据库执行:单引号、注释符、逻辑条件等输入可以改变原语句的结构与语义,从而读取或篡改数据,甚至触发更严重的后果。验证的核心不是打出结果,而是判断用户输入的边界是否被正确隔离——参数被当作数据,还是被当成语句的一部分。可用三类信号判断:报错回显(数据库把语法错误暴露给前端)、布尔差异(真假条件导致响应不同)、时间差(条件触发数据库延迟)。任何一类稳定成立都足以说明风险,验证到疑似即可停止记录。
基本信息
| 风险类型 | 注入类,CWE-89 |
|---|---|
| 关注入口 | 进入数据库查询的参数、请求头、Cookie、排序与分页字段 |
| 验证原则 | 最小化探测、不提取业务数据、单点验证为主 |
| 典型信号 | 数据库报错、真假条件响应差异、响应时间异常 |
| 修复方向 | 参数化查询(预编译)为主,白名单映射为辅 |
典型使用场景
- 表单与查询参数:搜索、筛选、排序、分页等直接拼 SQL 的功能
- API 接口:id、name 等参数进入数据库查询的 REST 与 JSON 接口
- 请求头与 Cookie:部分框架读取头信息参与查询,常被忽略
- 分页与排序:ORDER BY、LIMIT 等无法参数化的位置,转向白名单核查
- 修复后复测:验证参数化改造是否覆盖全部查询路径
验证步骤(教学示意)
验证步骤(教学示意)
1. 选数字型参数(如 ?id=1001),建立基准请求并记录响应
2. 追加一个单引号,观察是否出现数据库报错或异常状态码
3. 对比等价但逻辑不同的两个请求的响应差异(布尔信号)
4. 无回显时改用时间差采样,每类信号至少 3 次
5. 记录 URL、参数、现象与脱敏后的响应片段
6. 疑似成立即停止,转入修复建议与复测环节三类信号读法
| 信号 | 观察点 | 误判来源 | 采信条件 |
|---|---|---|---|
| 报错回显 | 是否出现数据库语法错误信息 | 通用错误页与拦截页也含错误字样 | 错误信息能对应到 SQL 语法结构 |
| 布尔差异 | 真假条件响应内容或长度不同 | 页面本身动态内容、A/B 分流 | 差异可稳定复现且与参数相关 |
| 时间差 | 条件触发数据库延迟 | 网络抖动、慢查询、缓存 | 多次采样取中位数,差异远大于抖动 |
| 状态码 | 异常状态码或跳转 | 反向代理与服务端默认行为 | 结合响应体内容判断,而非只看状态码 |
不要在业务高峰对生产库做批量注入探测。验证到疑似可注入即可暂停并上报,避免影响可用性;确需进一步确认,先与客户约定窗口。
修复视角:参数化查询让数据与语句结构分离,是根治手段;无法参数化的位置(表名、列名、排序方向)必须用白名单映射,而不是字符串拼接。