漏洞描述
CVE-2019-11043 是一个远程代码执行漏洞,使用某些特定配置的 Nginx + PHP-FPM 的服务器存在漏洞,可允许攻击者远程执行代码。
向Nginx + PHP-FPM
的服务器 URL发送 %0a
时,服务器返回异常。
该漏洞需要在nginx.conf
中进行特定配置才能触发。具体配置如下:
1 | location ~ [^/]\.php(/|$) { |
对于nginx的配置信息不太懂的可以看这两篇博客Nginx的配置文件详解(超详细)、Nginx 与 PHP 的正确使用姿势 ( 以及 PATH_INFO )
看了这两篇博客后,我们可以了解到这种特定的配置一般出现在基于PATH_INFO
运行的程序,并且使用了nginx的fastcgi_split_path_info
功能。
攻击者可以使用换行符(%0a)来破坏fastcgi_split_path_info指令中的Regexp。Regexp被损坏导致PATH_INFO为空,从而触发该漏洞。
影响范围
在 Nginx + PHP-FPM 环境下,当启用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影响,另外,PHP 5.6版本也受此漏洞影响,但目前只能 Crash,不可以远程代码执行:
- PHP 7.0 版本
- PHP 7.1 版本
- PHP 7.2 版本
- PHP 7.3 版本
漏洞复现
使用 p 神的 docker 环境进行复现:
PHP-FPM 远程代码执行漏洞(CVE-2019-11043)
https://github.com/vulhub/vulhub/blob/master/php/CVE-2019-11043/README.zh-cn.md
准备工作:安装 docker、golang 环境
1 | sudo apt-get install docker docker-compose |
搭建漏洞环境
1 | git clone https://github.com/vulhub/vulhub.git |
启动环境之后,就可以看到漏洞环境的默认页面。在此为 http://127.0.0.1:8080/index.php
。
在虚拟机下搭建环境时,需要把IP地址换为虚拟机对应IP,我这里为192.168.26.129
。index.php
文件内容很简单
1 |
|
由此可见,这题主要是nginx解析URL时产生的问题,不管php后端代码如何,都可以利用此漏洞(感觉说了句废话)
安装漏洞利用工具
1 | git clone https://github.com/neex/phuip-fpizdam.git |
漏洞利用
我脚本放在虚拟机里,所以这边的url还是127.0.0.1
在漏洞利用工具目录下执行此命令go run . "http://127.0.0.1/index.php"
至此,我们就可以在index.php GET传递a变量进行shell操作
中间重启了虚拟机,因此IP地址发生变化
攻击成功
漏洞分析
直接放创宇404实验室的文章吧(PHP-fpm 远程代码执行漏洞(CVE-2019-11043)分析)[https://paper.seebug.org/1063/]
参考资料
http://blog.leanote.com/post/snowming/9da184ef24bd
PHP远程代码执行漏洞复现(CVE-2019-11043)【反弹shell成功】
PHP-fpm 远程代码执行漏洞(CVE-2019-11043)分析