第三章:WAF检测机制分析

大家好,我是老周。今天咱们聊聊WAF到底是怎么发现SQL注入的。说实话,很多人觉得WAF很神秘,其实拆开来看,无非就是那几招。我在项目里见过太多人一遇到WAF就慌了,其实你只要摸清它的底牌,绕过就变得有章可循。

3.1 基于签名的检测——最古老也最直接

签名检测,说白了就是“黑名单”思路。WAF维护一个特征库,里面存着各种已知的攻击payload。比如你传了个 1' OR '1'='1,WAF一看,嗯,这个字符串我认识,直接拦下。

我早年做渗透测试时,遇到过一家银行的WAF,它的签名库特别老。我试了试 UNION SELECT 被拦了,但改成 UNION/**/SELECT 就过去了。为什么?因为它的签名只匹配了空格分隔的写法。

签名检测的特点:

  • 速度快,几乎不消耗计算资源
  • 误报率低,但漏报率高
  • 对变种攻击基本无效

你想想看,签名检测就像小区门口的保安,只认黑名单上的人。换个马甲,换个发型,他就认不出来了。

3.2 基于正则的检测——更灵活但更费劲

正则检测比签名高级一点。它不匹配具体字符串,而是匹配模式。比如检测 (\bunion\b.*\bselect\b) 这种模式,不管你怎么加注释、换大小写,只要出现了union和select的组合,就触发告警。

我记得有一次,客户的内网系统被注入了,但WAF日志里什么都没记录。后来我一看,原来WAF的正则写得太死了,只匹配了 union select 中间带一个空格的情况。攻击者用了 union%0aselect,换行符绕过了。

小技巧:正则检测虽然灵活,但写正则的人往往考虑不周全。你可以试试用注释、换行、特殊编码来绕过。我习惯先扔一个简单的payload,看看WAF的反应,再逐步调整。

正则检测的弱点在于:它只能匹配已知的模式。你换个思路,比如用 UNION DISTINCT SELECT,很多正则就傻眼了。

3.3 基于行为分析的检测——看你的“动作”

行为分析不看你传了什么,而是看你“怎么传”。比如一个普通用户,正常登录时只会传用户名和密码。但攻击者可能会在短时间内发送大量带特殊字符的请求,或者请求的URL参数突然变长了很多。

我在一个电商项目中遇到过这种情况。WAF的行为分析模块发现,某个IP在3秒内发了50个请求,而且每个请求的 id 参数都带单引号。系统直接把这个IP拉黑了。嗯,这里要注意,行为分析对慢速注入效果很差。你一天只发一个请求,它根本发现不了。

避坑指南:我曾经在测试一个政府网站时,用了代理池轮换IP,以为能绕过行为分析。结果WAF检测的是会话级别的行为,不是IP级别的。我换了IP但session没变,照样被拦。后来我每次请求都新建session,才搞定。

3.4 基于机器学习的检测——新时代的“黑科技”

机器学习检测,说白了就是让WAF自己学什么是正常流量,什么是异常流量。它不需要你写规则,只需要喂数据。比如你给WAF看100万条正常请求,再给它看1万条攻击请求,它自己就能总结出规律。

我去年帮一家金融公司做安全评估,他们的WAF就是基于ML的。我试了各种绕过技巧,什么大小写、注释、编码,全被拦了。后来我发现,它的模型对 sleep(5) 这种时间盲注特别敏感,但对 benchmark(10000000,md5(1)) 这种就识别不了。为什么?因为训练数据里没有这种样本。

ML检测的局限性:

  • 依赖训练数据的质量,数据不全就漏报
  • 对零日攻击(没见过的新攻击)基本无效
  • 计算资源消耗大,可能影响正常业务

你想想看,ML模型就像一个学生,你教过它的它都会,没教过的它就不会。所以对付ML WAF,最好的办法就是用一些冷门的、不常见的注入手法。

3.5 四种检测机制的对比

为了方便你理解,我整理了一个表格。这四种机制在实际WAF中往往是组合使用的,很少有WAF只用一种。

检测机制 检测原理 优点 缺点 绕过思路
签名检测 匹配已知攻击字符串 速度快、误报低 漏报高、无法应对变种 变形、编码、注释
正则检测 匹配攻击模式 比签名灵活 正则写不好就漏 换思路、用冷门语法
行为分析 检测请求频率、参数变化 能发现未知攻击 对慢速攻击无效 慢速、分布式
机器学习 基于历史数据建模 自适应、能发现变种 依赖训练数据、资源消耗大 用冷门手法、对抗样本

3.6 核心逻辑框架图

下面这张图展示了WAF检测SQL注入的完整流程。从请求进入,到层层过滤,最后决定放行还是拦截。我画这张图时,特意把四种机制的关系理清楚了。

WAF检测SQL注入核心逻辑框架 HTTP请求 第一层:签名检测 匹配已知攻击字符串 命中 拦截 未命中 第二层:正则检测 匹配攻击模式 命中 拦截 未命中 第三层:行为分析 检测请求频率、参数变化 放行 图例: 拦截 放行

从这张图你可以看到,WAF的检测是层层递进的。签名和正则属于“静态检测”,行为分析属于“动态检测”。至于机器学习,它其实可以嵌入到任何一层,也可以单独作为一个模块。我个人的习惯是,先摸清WAF用了哪几层,再针对性地设计绕过方案。

实战建议:测试WAF时,不要一上来就用复杂payload。先发一个简单的 ',看看WAF的反应。如果被拦了,说明签名层或正则层生效了。如果没被拦,再逐步增加复杂度。这样你就能摸清WAF的检测深度。

好了,关于WAF的检测机制,今天就聊到这里。记住一句话:WAF再强,也是人写的。只要是人写的,就有漏洞。下一章我会带你实战,看看怎么用SQLMap绕过这些检测机制。

专注资料整理