PHP-FPM 远程代码执行漏洞(CVE-2019-11043)
在长亭科技举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。
在使用一些有错误的Nginx配置的情况下,通过恶意构造的数据包,即可让PHP-FPM执行任意代码。
漏洞分析
首先使用docker搭建漏洞环境,进入bash环境,查看docker下的nginx的配置文件
cat /etc/nginx/conf.d/default.conf
会发现如下配置
当nginx进行如上特殊配置时就会触发该漏洞
nginx配置fastcgi_split_path_info并以^开始以$结尾,这种条件下可以使用换行符%0a来破坏fast_split_path_info中指令中的正则的判断,导致空PATH_INFO。
在nginx层面没有定义对文件的检查比如try_files $uri = 404,如果做了文件检查则请求不会被转发到php-fpm。
漏洞利用
下载工具----https://github.com/neex/phuip-fpizdam
首先需要要安装go语言环境
解压缩移动到/usr/local----mv go /usr/local/
sudo tar -zvxf go1.14.3.linux-amd64.tar.gz -C /usr/local
修改profile文件----leafpad /etc/profile
----最后一行加上export PATH=$PATH:/usr/local/go/bin
使配置的环境变量生效----source /etc/profile
查看版本信息----go version
安装成功效果图
然后就可以使用工具进行漏洞利用了,将工具下载好并解压在终端中打开
这样就执行成功,然后访问网页传入参数实现远程命令执行
这里只有部分PHP-FPM子进程受到了污染,因此请尝试几次以执行该命令。
漏洞修复
-
下载补丁
-
删除引起漏洞的配置
-
添加文件检查相关配置----try_files $uri =404