CVE-2019-11043 PHP远程代码执行漏洞

漏洞描述

CVE-2019-11043 是一个远程代码执行漏洞,使用某些特定配置的 Nginx + PHP-FPM 的服务器存在漏洞,可允许攻击者远程执行代码。
Nginx + PHP-FPM的服务器 URL发送 %0a 时,服务器返回异常。
该漏洞需要在nginx.conf中进行特定配置才能触发。具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
location ~ [^/]\.php(/|$) {



...



fastcgi_split_path_info ^(.+?\.php)(/.*)$;



fastcgi_param PATH_INFO $fastcgi_path_info;



fastcgi_pass php:9000;



...



}

对于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
2
sudo apt-get install docker docker-compose
sudo apt-get install golang-go

搭建漏洞环境

1
2
git clone https://github.com/vulhub/vulhub.git
cd vulhub/php/CVE-2019-11043 && sudo docker-compose up -d

启动环境之后,就可以看到漏洞环境的默认页面。在此为 http://127.0.0.1:8080/index.php
在虚拟机下搭建环境时,需要把IP地址换为虚拟机对应IP,我这里为192.168.26.129
index.php文件内容很简单

1
2
<?php
echo "hello world";

test

由此可见,这题主要是nginx解析URL时产生的问题,不管php后端代码如何,都可以利用此漏洞(感觉说了句废话)

安装漏洞利用工具

1
2
3
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go get && go build

test

漏洞利用

我脚本放在虚拟机里,所以这边的url还是127.0.0.1
在漏洞利用工具目录下执行此命令go run . "http://127.0.0.1/index.php"
test
至此,我们就可以在index.php GET传递a变量进行shell操作
中间重启了虚拟机,因此IP地址发生变化
test
攻击成功

漏洞分析

直接放创宇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)分析