◈ 渗透任务
WAF 多重过滤绕过测试
任务中
你的身份
「暗影安全公司」渗透测试工程师
目标网站
NetGuard 网络管理控制台 (admin.netguard.example.com)
委托方
NetGuard 部署了多重 WAF 规则,同时过滤标签、关键字和括号
任务目标
利用 JS 语法变形绕过 WAF 的多重过滤
- 绕过 <script> 标签过滤
- 绕过 alert 关键字过滤
- 绕过括号 () 过滤
◈ 教程:JS 语法变形绕过
为什么语法变形有效?
WAF(Web 应用防火墙)通常基于正则表达式或关键字黑名单进行过滤。但 JavaScript 语法的灵活性意味着同一个功能可以用多种写法实现。
核心思想:WAF 过滤的是"字面量模式",但执行的是"语义"。只要语义不变,语法可以千变万化。
1. 模板字面量调用函数
ES6 的模板字面量(反引号)可以直接调用函数,无需括号:
// 传统写法
alert(1)
// 模板字面量写法 — 不需要括号
alert`1`
// 等价于 alert.call(undefined, "1")
绕过场景:WAF 过滤了 () 但未过滤反引号 `
2. HTML 实体编码括号
在 HTML 属性上下文中,浏览器会先解码 HTML 实体,再交给 JS 引擎执行:
<!-- 原始写法 -->
<svg onload="alert(1)">
<!-- HTML 实体编码括号 -->
<svg onload="alert(1)">
<!-- 浏览器解码后等价于 -->
<svg onload="alert(1)">
3. WAF 过滤顺序的陷阱
很多 WAF 的正则替换存在顺序问题:
// 单次替换 — 双写绕过
preg_replace("/alert/i", "", $input)
// "aalertlert" → 移除中间的 "alert" → 剩下 "alert"
// 嵌套标签
preg_replace("/