欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP远程代码执行漏洞分析(CVE2019-11043)

程序员文章站 2022-07-15 13:42:47
...

PHP远程代码执行漏洞分析(CVE2019-11043)

近日,美创安全实验室监测到PHP官方披露了Nginx + php-fpm部分配置下存在的远程代码执行高危漏洞(CVE2019-11043),攻击者可利用该漏洞对目标网站进行远程代码执行攻击。虽然此漏洞的影响面有限,但由于配置文件的开放性,还请使用niginx + php-fpm的运维人员及时做好自检自查工作。

0x00漏洞时间线

9月14日 至18日,国外安全研究员Andrew Danau在参加Real World CTF中发现,向目标服务器URL发送 %0a 符号时,服务返回异常,疑似存在漏洞。
9月26日,PHP官方发布漏洞通告,其中指出:使用Nginx + php-fpm的服务器,在部分配置下,存在远程代码执行漏洞,并且该配置已被广泛使用危害较大。
10月21日至22日,PHP官方发布漏洞更新,该漏洞POC公开。
10月24日 美创第59号实验室发布漏洞预警。

0x01漏洞描述

Nginx上fastcgi_split_path_info在处理带有%0a的请求时,会因为遇到换行符\n导致PATH_INFO为空。而php-fpm在处理PATH_INFO为空的情况下,存在逻辑缺陷。攻击者通过精心构造和利用的PAYLOAD,可以导致远程代码执行。但Nginx使用的这个fastcgi配置,并非Nginx默认配置。

0x02受影响的版本

使用Nginx + php-fpm配置的服务器,并且在nginx/conf/nginx.confg配置文件中采用如下配置的时候,都会出现RCE漏洞

Location ~[^/]\.php(/|$){
  ...
  fastcgi_split_path_info  ^(.+?\.php)(/.*)$;
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_pass   php:9000;
  ...
}

fastcgi_split_path_info字段配置为 ^(.+?.php)(/.*)$;时,攻击者可以通过精心构造的payload,触发远程代码执行漏洞,GitHub公开的POC代码是写入一个Webshell到网站目录下,从而开启后门创建。虽然在PHP >= 5.3.3以后,php-fpm并入php核心,但采用以上配置的服务器依然有被攻击的危险。

0x03漏洞原理

服务器端的配置如下:
PHP远程代码执行漏洞分析(CVE2019-11043)
传送给服务端的POC为fpm_main.c连接如下:
https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c

此次漏洞主要由于 PHP-FPM 中 sapi/ fpm/ fpm/ fpm_main.c 文件内的 env_path_info 下溢导致,在“fpm_main.c“文件的第1150行代码中由于\n(%0a)的传入导致nginx传递给php-fpm的PATH_INFO为空。进而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。
PHP远程代码执行漏洞分析(CVE2019-11043)

0x04漏洞复现

利用vulhub环境,复现CVE2019-11043漏洞。
在vulub/php/CVE-2019-11043的路径下执行docker-compose up -d生成漏洞环境
PHP远程代码执行漏洞分析(CVE2019-11043)
在vulhub/php/CVE-2019-11043目录下查看服务器配置信息default.conf
PHP远程代码执行漏洞分析(CVE2019-11043)
利用phuip-fpizdam工具进行漏洞利用。
访问wget https://github.com/neex/phuip-fpizdam,解压进入目录后执行go build生成phuip-fpizdam(此工具将根据OS自动生成对应的OS版本)
PHP远程代码执行漏洞分析(CVE2019-11043)
使用刚刚生成的工具phuip-fpizdam发送数据包
PHP远程代码执行漏洞分析(CVE2019-11043)
可见,这里已经执行成功,接下来访问http://localhost:8080/index.php并带上参数a,其中a就是可以执行命令注入的注入点,利用/bin/sh±c ‘PAYLOAD’&,向其中注入命令代码如id或者whoami,可以发现有返回结果证明利用成功。
PHP远程代码执行漏洞分析(CVE2019-11043)
PHP远程代码执行漏洞分析(CVE2019-11043)
这里有个地方需要注意,因为php-fpm会启动多个子进程所以在进行命令注入的时候需要多次访问,直至访问到被污染的进程

0x05应急缓解措施

高危:目前漏洞细节和测试代码已经公开,建议及时升级安全更新补丁或启用官方推荐的配置示例,或是部署WAF等安全防护设备监控漏洞利用情况。

威胁推演:此漏洞为远程代码执行漏洞,基于全球使用该产品用户的数量,恶意攻击者可能会开发针对该漏洞的自动化攻击程序,实现漏洞利用成功后自动植入后门程序,并进一步释放矿工程序或是DDOS僵尸木马等恶意程序达到蠕虫传播,从而影响到Web服务的正常提供。

安全开发建议:PHP家族产品历史上报过多次安全漏洞,建议使用该产品的企业通过安全开发代码加固其用户输入过滤和随时关注安全更新公告。

0x06修复防御方法

  1. 修改Nginx配置文件中fastcgi_split_path_info的正则表达式,不允许.php之后传入不可显字符
  2. 如果情况允许,请暂停使用 Nginx + php-fpm 服务
  3. 根据自己实际生产环境的业务需求,将以下配置删除
    fastcgi_split_path_info ^(.+?.php)(/.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;