9月26日,PHP官方发布漏洞通告,提到Nginx与php-fpm服务器上存在的一处高危漏洞,由于Nginx的fastcgi_split_path_info模块在处理带 %0a 的请求时,对换行符 \n 处置不当使得将PATH_INFO值置为空,从而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。目前开源社区已有漏洞Poc公开。
漏洞信息
漏洞名称 PHP-FPM在Nginx特定配置下远程代码执行
CVE编号CVE-2019-11043
CNVD编号 -
影响版本 参考影响范围
威胁等级 高危
公开时间 2019年9月26日
影响范围
Nginx + php-fpm 的服务器,在使用如下配置的情况下,都可能存在远程代码执行漏洞。
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
}
环境下载:
https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
启动环境
mkdir Andrew
cd Andrew
docker-compose up –d
docker ps
进入nginx中,创建文件
Docker exec –it f2e659d78e37 /bin/bash
访问地址http://192.168.157.128:8080/index.php
下载 phuip-fpizdam,编译
https://github.com/neex/phuip-fpizdam
kali安装go教程:https://studygolang.com/articles/11279
漏洞攻击(这里我用的编译好的)
在浏览器中访问:http://192.168.157.128:8080/index.php?a=id
也可进行无害的漏洞检测,命令如下:
phuip-fpizdam http://192.168.157.128:8080/index.php--skip-attack
PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI进程管理器,用于管理PHP 进程池的软件,用于接受web服务器的请求。
nginx与php-fpm结合的处理流程
打开php-fpm.conf文件,我们看到如下配置:
即:php-fpm模块监听127.0.0.1:9000端口,等待请求到来去处理。
处理过程:
漏洞触发点
因为“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配置。在特殊构造的配置生效的情况下可以触发任意代码执行。
此漏洞利用的先决条件:
1. php需要开启FPM模块,该模块在php虽然在PHP5.3.3之后已经加入php核心代码但是的PHP的发行版默认不安装php-fpm模块,所有默认的用户不受影响;要想php支持php-fpm,只需要在编译php源码的时候带上--enable-fpm;
2. 需要修改/nginx/conf/nginx.conf配置;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;