CVE-2019-11043-PHP远程代码执行漏洞修复方式 2019-10-25 PHP 暂无评论 4777 次阅读 在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; 参考 https://mrxn.net/news/640.html https://www.gdcert.com.cn/index/news_detail/W1paQzEYCh0cDRkcGw 标签: 漏洞, cve 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。