我的WafBypass之道(Upload篇)
字数 2158 2025-08-29 08:31:42
WAF Bypass 文件上传绕过技术详解
0x00 前言
文件上传WAF绕过技术需要结合实战经验与系统特性,本文总结了文件上传WAF检测的关键点及多种绕过方法。
0x01 WAF检测点分析
WAF通常会检查以下内容:
- 请求的URL
- Boundary边界
- MIME类型
- 文件扩展名
- 文件内容
常见扩展名黑名单
asp|asa|cer|cdx|aspx|ashx|ascx|asax
php|php2|php3|php4|php5|asis|htaccess
htm|html|shtml|pwml|phtml|phtm|js|jsp
vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini
测试前准备工作
- 确认环境信息:
- 语言(PHP/ASP/JSP等)
- 容器(Apache/IIS/Nginx等)
- 系统(Windows/Linux)及版本
- 确认上传限制:
- 允许上传的文件格式
- 是否允许任意类型文件上传
- 确认文件处理方式:
- 是否会被重命名
- 是否进行二次渲染
0x02 容器特性绕过
Apache解析漏洞
- 版本:1.X & 2.X
- 原理:从后向前识别扩展名,直到遇见可识别的扩展名
- 示例:
shell.php.xxx可能被解析为PHP文件
IIS6.0解析漏洞
-
目录解析:
- 目录名包含
.asp、.asa、.cer时,该目录下所有文件按ASP解析 - 示例:
/upload.asp/shell.jpg会被当作ASP执行
- 目录名包含
-
分号截断:
- 文件名包含
.asp;、.asa;、.cer;优先使用ASP解析 - 示例:
shell.asp;.jpg会被当作ASP执行
- 文件名包含
Nginx解析漏洞
-
版本:0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
- 示例:上传
shell.jpg,访问shell.jpg.php
- 示例:上传
-
版本:0.8.41 - 1.5.6
- 示例:上传
shell.jpg,访问shell.jpg%20.php
- 示例:上传
PHP CGI解析漏洞
- 环境:IIS 7.0/7.5或Nginx < 0.8.3
- 条件:
cgi.fix_pathinfo=1 - 方法:上传
shell.jpg,访问shell.jpg/shell.php
多Content-Disposition绕过
- 原理:IIS取第一个Content-Disposition,WAF可能取最后一个
- 示例:
Content-Disposition: form-data; name="file"; filename="shell.asp" Content-Disposition: form-data; name="file"; filename="shell.jpg"
非常规请求格式
- 示例:
Content-Type: application/octet-stream Content-Disposition: form-data; name="file"; filename="shell.asp"
.htaccess利用
- 方法:上传包含以下内容的
.htaccess文件:AddType application/x-httpd-php .jpg
0x03 系统特性绕过
Windows特殊字符
- 方法:使用ASCII > 127的字符
- 示例:
shell.php{%80-%99}
exee扩展名
- 方法:将
.exe改为.exee
NTFS ADS特性
-
点号截断:
- 示例:
shell.php......
- 示例:
-
数据流特性:
- 示例:
shell.php::$DATA
- 示例:
0x04 WAF缺陷利用
边界匹配不严谨
-
添加空格:
Content-Type: multipart/form-data; boundary 4714631421141173021852555099 -
边界不一致:
- 请求头与正文使用不同的boundary
MIME类型修改
- 示例:修改
Content-Type为非标准值
超长数据绕过
-
超长文件名:
- 示例:
shell.asp;王王王...王王王.jpg(大量中文字符)
- 示例:
-
超长Content-Disposition:
- 构造超长的header字段
其他技巧
-
大小写绕过:
- 示例:
.PhP、.aSp
- 示例:
-
特殊位置插入换行:
- 在header字段中插入
\n
- 在header字段中插入
-
双扩展名:
- 示例:
shell.php.jpg
- 示例:
0x05 30种绕过姿势总结
- filename放在content-type下面
- .asp{80-90}
- NTFS ADS利用
- .asp...
- boundary不一致
- IIS6分号截断:asp.asp;asp.jpg
- Apache解析漏洞:php.php.ddd
- boundary和content-disposition间插入换行
- hello.php:a.jpg然后hello.<<<
- filename=php.php
- filename="a.txt";filename="a.php"
- name=\n"file";filename="a.php"
- content-disposition:\n
- .htaccess文件利用
- a.jpg.\nphp
- 去掉content-disposition的form-data字段
- PHP<5.3单双引号截断
- 删除content-disposition: form-data;
- content-disposition\00:
- {char}+content-disposition
- header中content-type后加tab
- header中content-type: multipart/form-DATA(大小写)
- 后缀名大写:.PHP
- Content-Type: multipart/form-data;\n
- .asp空格
- .asp0x00.jpg截断
- 双boundary
- file\nname="php.php"
- header中content-type后加空格
- form-data字段与name字段交换位置
0x06 总结
文件上传WAF绕过关键在于:
- 准确判断WAF拦截点
- 结合后端环境特性(语言/容器/系统版本)
- 灵活运用各种特性组合
- 关注边界条件和非标准实现
实际测试中需要根据具体环境选择合适的绕过方法,并注意观察服务器响应以判断绕过是否成功。