漏洞描述:
Nginx上fastcgi_split_path_info在处理带有%0a的请求时,会因为遇到换行符\n导致PATH_INFO为空。而php-fpm在处理PATH_INFO为空的情况下,存在逻辑缺陷。攻击者通过精心构造和利用的PAYLOAD,可以导致远程代码执行。但Nginx使用的这个fastcgi配置,并非Nginx默认配置
受影响的版本:
使用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核心,但采用以上配置的服务器依然有被攻击的危险。
漏洞原理:
此次漏洞主要由于 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配置。在特殊构造的配置生效的情况下可以触发任意代码执行。
准备漏洞复现
输入:docker-compose up -d
sudo docker-compose up -d
输入kali密码后成功启动
在vulhub/php/CVE-2019-11043目录下查看服务器配置信息default.conf
利用phuip-fpizdam工具进行漏洞利用。
访问wget https://github.com/neex/phuip-fpizdam,解压进入目录后执行go build生成phuip-fpizdam(此工具将根据OS自动生成对应的OS版本)
使用刚刚生成的工具phuip-fpizdam发送数据包
可见,这里已经执行成功,接下来访问http://192.168.221.128:8080/index.php并带上参数a,其中a就是可以执行命令注入的注入点,利用/bin/sh±c ‘PAYLOAD’&,向其中注入命令代码如id或者whoami,可以发现有返回结果证明利用成功。