一、文件上传漏洞基础
1.1 什么是文件上传漏洞
文件上传漏洞是指攻击者通过上传恶意文件(如WebShell)到服务器,从而获取服务器控制权的漏洞。
危害:
- 上传WebShell获取服务器权限
- 上传恶意脚本执行任意代码
- 上传病毒文件传播恶意软件
1.2 文件上传流程
用户选择文件 → 客户端验证 → 服务端验证 → 文件存储 → 文件访问
常见验证方式:
| 验证位置 | 验证内容 | 安全性 |
|---|---|---|
| 客户端JS | 文件扩展名、大小 | 低(可绕过) |
| 服务端 | 文件扩展名、MIME类型、文件内容 | 中 |
| 服务器配置 | 文件解析规则 | 高 |
二、文件上传闯关实战
2.1 Pass-1:JS前端验证绕过
思路: 前端验证可以被绕过
步骤:
-
准备PHP木马文件
shell.php -
修改文件扩展名为
.jpg -
上传(前端验证通过)
-
用Burp Suite拦截请求,修改扩展名为
.php -
发送请求,上传成功
2.2 Pass-2:Content-Type验证绕过
思路: 修改Content-Type头
步骤:
# 原始请求
Content-Type: image/jpeg
# 修改为
Content-Type: application/x-php
2.3 Pass-3:黑名单绕过(.htaccess)
思路: 通过.htaccess配置让服务器解析特定扩展名
步骤:
-
上传
.htaccess文件:<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
-
上传
shell.jpg(包含PHP代码) -
访问
shell.jpg执行PHP代码
2.4 Pass-4:白名单绕过(图片木马)
思路: 图片中嵌入PHP代码
步骤:
# 制作图片木马(Linux)
cat shell.php >> image.jpg
# 制作图片木马(Windows)
copy /b image.jpg + shell.php shell.jpg
2.5 Pass-5:二次渲染绕过
思路: 绕过服务器对图片的二次处理
步骤:
-
上传正常图片
test.jpg -
下载服务器处理后的图片
-
对比原始图片和处理后的图片
-
在相同位置插入PHP代码
-
重新上传修改后的图片
2.6 Pass-6:条件竞争绕过
思路: 利用服务器处理时间差
步骤:
-
快速上传大量请求
-
在服务器删除文件前访问文件
-
执行恶意代码
三、容器解析漏洞
3.1 Tomcat解析漏洞
原理: Tomcat对特定扩展名的解析存在漏洞
步骤:
# 上传文件
shell.jsp%00.jpg
# 访问执行
http://target.com/shell.jsp%00.jpg
3.2 Nginx解析漏洞
原理: Nginx对.php文件的解析存在漏洞
步骤:
# 上传图片木马
shell.jpg
# 通过特定URL访问执行
http://target.com/shell.jpg/.php
3.3 Apache解析漏洞
原理: Apache按从右到左的顺序解析扩展名
步骤:
# 上传文件
shell.php.abc.def
# Apache会解析为PHP文件执行
四、编辑器漏洞(FCKEditor)
4.1 搭建环境
# 下载FCKEditor
git clone https://github.com/fckeditor/fckeditor.git
# 修改配置文件
vim config.php
4.2 漏洞利用
步骤:
-
访问FCKEditor编辑器
-
在文件管理中新建PHP文件
-
写入WebShell代码
-
访问执行
五、文件上传防御
5.1 服务端验证
<?php
// 获取文件扩展名
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
// 白名单验证
$allowed_ext = ['jpg', 'png', 'gif'];
if (!in_array(strtolower($ext), $allowed_ext)) {
die('不允许的文件类型');
}
// 文件内容验证
$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['file']['tmp_name']);
if (!in_array($mime, ['image/jpeg', 'image/png', 'image/gif'])) {
die('文件内容不符合要求');
}
// 随机重命名
$new_name = uniqid() . '.' . $ext;
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $new_name);
?>
5.2 安全配置
| 措施 | 说明 |
|---|---|
| **禁用脚本执行** | 在上传目录禁止PHP执行 |
| **随机文件名** | 防止文件覆盖和猜测 |
| **限制文件大小** | 防止DoS攻击 |
| **使用CDN** | 将静态文件托管到CDN |
| **定期审计** | 检查上传目录的异常文件 |
5.3 服务器配置示例
Nginx配置(禁止PHP执行):
location /uploads/ {
location ~ \.php$ {
deny all;
}
}
Apache配置:
<Directory "/var/www/uploads">
php_flag engine off
</Directory>
六、总结
文件上传要点
| 类型 | 说明 |
|---|---|
| **原理** | 上传恶意文件到服务器 |
| **危害** | 获取服务器权限、执行任意代码 |
| **防御** | 白名单验证、文件内容检测、安全配置 |
学习建议
-
练习靶场: Upload-labs、Pikachu
-
掌握工具: Burp Suite、dirsearch
-
理解原理: 容器解析机制、文件处理流程
-
防御意识: 服务端验证的重要性
**安全提醒:** 本文仅供学习研究,请勿用于非法用途!