- 漏洞简介
- 漏洞描述
Nginx + php-fpm部分配置下存在的远程代码执行高危漏洞,攻击者可利用该漏洞对目标网站进行远程代码执行攻击
-
- 影响范围
漏洞影响的版本:
PHP 5.6-7.x,Nginx>=0.7.31
-
- 漏洞原理
Nginx与 php-fpm 服务器上存在远程代码执行漏洞,由于Nginx的fastcgi_split_path_info模块在处理带%0a的请求时,对换行符 \n 处置不当使得将 PATH_INFO 值置为空,从而导致 php-fpm 在处理 PATH_INFO 时存在漏洞,攻击者通过精心的构造和利用,可以导致远程代码执行
-
- 环境搭建
利用docker生成漏洞环境
在vulub/php/CVE-2019-11043的路径下执行docker-compose up -d生成漏洞环境
然后,在浏览器中打开http://ip:8080/index.php,就可以看到如下图所示,环境搭建成功。
当url路径中存在%0a时会将URL截断:http://ip/index.php/123%0atest.php,并且Nginx处理url的正则有个bug,在解析的时候会把path_info置空;
这种结果会导致PATH_INFO为空——>env_path_info为空——>pilen为0且slen可控——>path_info下溢漏洞验证;
在path_info下溢之后,执行了path_info[0] = 0;,向下溢的地址写了一字节的0,这就造成了可控地址写0的能力;
接下来,通过这一字节写0能够达到写环境变量的目的,需要将一字节写0的应用到能够修改fcgi_data_seg的低位,达到向fcgi_hash_buckets写环境变量的进一步操作,可以通过覆盖写入与PHP_VALUE相同HASH的另一个键:HTTP_EBUT;
然后使用环境变量写入链输出内容到日志文件,然后包含日志文件进行代码执行,最终个RCE。
-
- 基础知识
PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,对于PHP 5.3.3之前的php来说,是一个补丁包 [1] ,旨在将FastCGI进程管理整合进PHP包中。
-
- 开始验证
执行php-frm的exp脚本,输入URL,然后浏览器中输入构造的URL地址,就会执行相对应的命令:
复现成功
总结:
利用该漏洞,恶意攻击者可以构造攻击请求进行远程代码执行
防御方案:
如果配置文件有fastcgi_split_path_info,就加上if(!-f $document_root$fastcgi_script_name){return 404;},
如果没有,则无需修改