直接启用 aws waf 内置的 owasp core rule set 即可拦截绝大多数 sql 注入流量,因其已预置 url 解码、大小写归一化等处理逻辑,覆盖 union select、or 1=1、sleep() 等高频载荷,且动作须设为 block 才能真正阻断。

直接启用 AWS WAF 内置的 OWASP Core Rule Set (CRS) 就能拦截绝大多数 SQL 注入流量,不建议从零手写正则规则——误配率高、绕过风险大、维护成本陡增。
用 AWS WAF 规则组直接启用 OWASP CRS
OWASP CRS 是经过长期实战验证的开源规则集,AWS 已将其封装为托管规则组(Managed Rule Group),名称通常是 AWSManagedRulesCommonRuleSet 或带 OWASP 字样的官方规则组。它默认覆盖:union select、or 1=1、sleep()、information_schema、load_file、@@version 等高频载荷,还包含 URL 解码、大小写归一化、空格/制表符/换行符归一等预处理逻辑。
实操要点:
- 在 AWS WAF 控制台 → 创建 Web ACL → “Add rules” → 选择 “Managed rule groups” → 搜索并启用
AWSManagedRulesCommonRuleSet - 动作设为
Block,不要选Count或Challenge—— 后两者无法真正阻断注入请求 - 确保规则组绑定到正确域名或路径前缀(如
/api/、/admin/) - 若业务含大量合法动态 SQL(如 BI 报表导出),可对特定路径临时设为
Count,再根据日志白名单放行真实载荷
自定义规则只用于补充场景,不是主力防线
只有当 OWASP CRS 漏拦了你业务特有的变形载荷(比如用 Unicode 编码绕过、或嵌套在 JSON body 深层字段里),才考虑加一条自定义规则。此时必须用 RegexPatternSet + RuleStatement 组合,不能只靠字符串匹配。
常见错误做法:
- 直接在规则里写
"union select"字符串匹配 → 完全无效,攻击者改写成UNION/**/SELECT或unIOn%20selEct就绕过 - 在
Body上做正则但没开启TextTransformation→ AWS WAF 默认不对 body 做 URL/HTML/Base64 解码,原始 payload 可能是编码后的 - 正则写太宽泛,比如
.*[;--\/\*].*→ 会误杀正常 SQL 日志、JSON 注释、甚至前端代码片段
正确写法示例(针对 JSON body 中的 query 字段):
RuleStatement: {
RegexPatternSetReferenceStatement: {
ARN: "arn:aws:wafv2:us-east-1:123456789012:regional/regexpatternset/my-sql-patterns",
FieldToMatch: { JsonBody: { MatchScope: "ALL", InvalidFallbackBehavior: "MATCH" } },
TextTransformations: [
{ Priority: 0, Type: "URL_DECODE" },
{ Priority: 1, Type: "LOWERCASE" }
]
}
}
对应 RegexPatternSet 中只需保留核心特征,例如:
\bunion\s+\bselect\b\b(?:exec|execute|xp_cmdshell)\b-
(?:--|\#|\/\*)(仅限出现在 query 字段值末尾时)
上线前必须用真实载荷验证拦截效果
WAF 控制台显示“规则已启用”不等于生效。很多团队卡在测试环节:用 curl 发请求后没返回 403,就以为规则失效,其实是没发对位置或没触发匹配条件。
验证步骤要严格按顺序执行:
- 发起真实 HTTP 请求,目标路径必须和规则绑定的路径一致(比如规则绑了
/login,就别测/api/login) - 载荷必须放在规则实际检查的字段里:URL 参数 →
QueryString;Header →Headers;JSON body →JsonBody;Form data →Body - 必测载荷包括:
' OR 1=1 --、1' UNION SELECT username,password FROM users--、id=1 AND SLEEP(3) - 查日志时看
Action字段是否为BLOCK,且RuleId明确指向你启用的规则名,不是默认的Default_Action
如果某条载荷没被拦,优先检查:规则是否启用、Web ACL 是否已关联到 ALB/API Gateway、TextTransformation 是否配置、日志采样率是否太低导致漏记。
最常被忽略的是:WAF 不解析应用层语义,它只做模式匹配。哪怕你写了完美的正则,只要攻击者把 select 拆成 se%6Cect 并配合多层编码,而你没配够 TextTransformation 链,照样漏。所以 OWASP CRS 的价值不在规则本身,而在它预置的完整解码+归一化流水线。











