记一次绕过阿里云waf与某不知名waf的双waf上传getshell
字数 1077 2025-08-22 12:23:42
绕过阿里云WAF与某不知名WAF的双WAF上传Getshell技术分析
0x00 前言
本文详细记录了一次成功绕过阿里云WAF与某不知名WAF双重防护的文件上传漏洞利用过程。通过多种技术手段的组合,最终实现了webshell的上传与执行。
0x01 环境分析
目标环境特点:
- 存在后台任意文件上传漏洞
- 部署了阿里云WAF作为第一层防护
- 存在第二层未知WAF防护(在绕过阿里云WAF后触发502错误)
0x02 初始绕过尝试
作者首先尝试了常见的WAF绕过技术,均告失败:
- 大包绕过:数据量过大导致无响应
- 单双引号绕过:失败
- 复写filename:失败
- 换行绕过:失败
- 修改boundary:失败
- 文件名fuzz:失败
0x03 关键绕过技术
3.1 阿里云WAF绕过
初始payload:
Content-Disposition: form-data; name="aaa"; ;filename="a.txt",filename="a.txt",filename="a.txt",...[重复多次]...,filename="a.php"
发现:
- 只有分号后的第一个
filename被有效识别 - 虽然最终上传的是txt文件,但成功绕过了WAF检测
改进payload:
Content-Disposition: form-data; name="aaa";,filename="a.txt";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;...[大量分号]...;;;;;;;;filename="a.php";
- 意图使前面的filename失效,让最后一个filename生效
- 仍被拦截
关键发现:
- 当filename中的文件名被换行分割并在最后一行加入冒号时:
Content-Disposition: form-data; name="head_portrait";filename="a.p hp":- 会将
.p作为文件后缀上传 - 不加冒号则被WAF拦截
- 会将
最终绕过阿里云WAF的payload:
Content-Disposition: form-data; name="aaa";,filename="a.t xt":;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;...[大量分号]...;;;;;;;;filename="a.php";
3.2 第二层WAF绕过
发现:
- 使用php后缀返回502错误
- 使用txt后缀可正常上传,确认存在第二层WAF
绕过方法:
- 增加多个无效的filename参数
Content-Disposition: form-data; name="aaa";,filename="a.t xt":,filename="a.txt",filename="a.txt",...[多个重复]...,filename="a.txt";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;...[大量分号]...;;;;;;;;filename="a.php";
3.3 文件内容绕过
成功绕过双WAF后,发现阿里云WAF还会检测文件内容:
- 尝试使用垃圾字符填充
- 测试多个不同的webshell payload,直到找到可用的
0x04 技术总结
关键绕过点
- filename参数污染:通过大量重复和无效的filename参数混淆WAF检测
- 特殊符号利用:使用冒号和分号改变解析逻辑
- 文件名分割:通过空格分割文件扩展名(如
a.p hp) - 多WAF分层绕过:针对不同WAF层采用不同策略
防御建议
-
服务端应严格校验文件上传的:
- Content-Disposition头部格式
- 文件名合法性(去除多余参数和符号)
- 文件内容类型(结合MIME和扩展名)
-
WAF规则建议:
- 检测异常的重复参数
- 分析完整的请求解析逻辑而非简单模式匹配
- 对特殊符号组合进行防护
0x05 结论
本案例展示了即使面对阿里云等成熟WAF产品,通过深入分析请求解析逻辑和创造性构造payload,仍有可能实现绕过。这强调了纵深防御和安全开发实践的重要性,不能仅依赖WAF作为唯一防护手段。