关联漏洞
标题:
PHP 缓冲区错误漏洞
(CVE-2019-11043)
描述:PHP(PHP:Hypertext Preprocessor,PHP:超文本预处理器)是PHPGroup和开放源代码社区的共同维护的一种开源的通用计算机脚本语言。该语言主要用于Web开发,支持多种数据库及操作系统。 PHP中存在缓冲区错误漏洞。该漏洞源于网络系统或产品在内存上执行操作时,未正确验证数据边界,导致向关联的其他内存位置上执行了错误的读写操作。攻击者可利用该漏洞导致缓冲区溢出或堆溢出等。以下产品及版本受到影响:PHP 7.1.33之前版本的7.1.x版本,7.2.24之前版本的7.2.x版本,7
描述
CVE-2019-11043 PHP远程代码执行
介绍
## PHP 远程代码执行漏洞 (CVE-2019-11043)
### 1. 背景
9 月 26 日,PHP 官方发布漏洞通告,其中指出:使用 Nginx + php-fpm 的服务器,在部分配置下,存在远程代码执行漏洞。并且该配置已被广泛使用,危害较大。
漏洞 PoC 在 10 月 22 日公开,国内安全媒体及时发布了预警。
### 2. 漏洞描述
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;
...
}
### 3. 解决方案
在不影响正常业务的情况下,删除 Nginx 配置文件中的如下配置:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
### 4. github公开的POC
github: [https://github.com/neex/phuip-fpizdam](https://github.com/neex/phuip-fpizdam)
该POC利用了FastCGI变量_fcgi_data_seg中的优化,该优化仅在PHP7中,所以公开的exploit仅在php7下有效,PHP5环境下需要另外的exploit才能生效。
### 5. 漏洞复现
#### 1. 配置NGINX+PHP-FPM(php7)
配置环境,搭建nginx + php-fpm,验证工作有效。
1. 下载php7,解压进入目录
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
2. 安装压缩、ssl等相关依赖包
yum install -y libxml2*
yum install -y openssl*
yum install -y libcurl*
yum install -y libjpeg*
yum install -y libpng*
yum install -y freetype*
yum install -y libmcrypt*
3. configure 编译源代码
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-simplexml --enable-xml --disable-rpath --enable-bcmath --enable-soap --enable-zip --with-curl --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mbstring --enable-sockets --with-gd --with-openssl --with-mhash --enable-opcache --disable-fileinfo
make & make install
4. 配置php-fpm,如果配置多个PHP,可以修改端口9000为9001
修改php-fpm配置文件:
$ cd /usr/local/php/etc
$ cp php-fpm.conf.default php-fpm.conf
$ vi php-fpm.conf
去掉 pid = run/php-fpm.pid 前面的分号
$ cd php-fpm.d
$ cp www.conf.default www.conf (修改端口)
$ vi www.conf
修改user和group的用户为非root用户
5. ./php-fpm
#### 2. 配置存在漏洞的PHP解析
nginx.cof中添加如下配置:
location ~ [^/]\.php(/|$) {
root /opt/apache/www;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9001;
include fastcgi_params;
}
重启nginx
6. 安装go,编译POC代码
go get github.com/neex/phuip-fpizdam(文件下载在go的src目录下)
go build github.com/neex/phuip-fpizdam(全路径,会在当前目录生成运行文件)
7. 运行POC
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[很不幸,配置环境不知哪的问题,验证失败]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
#### 4. docker集成验证环境
原链接:[https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043](https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043)
1. 下载该docker项目文件
2. docker-compose up -d 运行docker容器
<img src="https://github.com/shadow-horse/VulnerabilityAnalysis/blob/master/php/cve-2019-11043/id.png"/>
3. 运行程序,显示执行成功 ,利用漏洞回显执行命令"id"
<img src="https://github.com/shadow-horse/VulnerabilityAnalysis/blob/master/php/cve-2019-11043/dockerls.png"/>
<img src="https://github.com/shadow-horse/VulnerabilityAnalysis/blob/master/php/cve-2019-11043/id.png" />
4. 关闭docker服务
docker ps
docker stop id
文件快照
[4.0K] /data/pocs/7187a88735e2e11fd514c322063d434d49783cdb
├── [4.0K] phuip-fpizdam
│ ├── [1.5K] attack.go
│ ├── [ 340] consts.go
│ ├── [5.5K] detect.go
│ ├── [ 675] detect_methods.go
│ ├── [ 85] go.mod
│ ├── [3.0K] go.sum
│ ├── [4.0K] main.go
│ ├── [ 947] phpini.go
│ ├── [4.6K] README.md
│ ├── [4.0K] reproducer
│ │ ├── [ 657] Dockerfile
│ │ ├── [ 58] entrypoint
│ │ ├── [ 555] nginx.server.conf
│ │ ├── [ 186] php-fpm.conf
│ │ └── [ 0] script.php
│ └── [2.6K] requester.go
├── [9.3M] phuip-fpizdam.go
└── [4.4K] README.md
2 directories, 17 files
备注
1. 建议优先通过来源进行访问。
2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。