在9 月 14 日至 18 举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。 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;

        ...

  }

}
漏洞复现 使用 https://github.com/neex/phuip-fpizdam 中给出的工具,发送数据包 漏洞刨析 因为“fpm_main.c”文件的第1150行代码中由于\n(%0a)的传入导致nginx传递给php-fpm的PATH_INFO为空。 https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c#L1150 进而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。 解决方案 方法1:在不影响正常业务的情况下,删除 Nginx 配置文件中的如下配置:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO       $fastcgi_path_info;
方法2:对fastcgi函数增加判断,同时删除fastcgi_param PATH_INFO、$fastcgi_path_info:
……
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if ( !-f $document_root$fastcgi_script_name){
return 404;
}
fastcgi_param HTTP_PROXY "";
……
方法3:修改php.ini的cgi.fix_pathinfo配置为0; Original address:https://blog.moper.net/1369.html
参考
https://mrxn.net/news/640.html
https://www.gdcert.com.cn/index/news_detail/W1paQzEYCh0cDRkcGw