POC详情: 7187a88735e2e11fd514c322063d434d49783cdb

来源
关联漏洞
标题: 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付费,感谢您的支持。