0x00 简介
在长亭科技举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。
在使用一些有错误的Nginx配置的情况下,通过恶意构造的数据包,即可让PHP-FPM执行任意代码。
但由于是配置文件的开放性。还请使用 nginx+php-fpm 的服务管理员/运维人员及时做好自查自检工作。
0x01 漏洞详情
由于 (%0a)的传入导致nginx传递给php-fpm的PATH_INFO为空。
进而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。
注:完全复制Nginx官方给出的php-fpm示例配置的用户受到此漏洞影响
示例配置如下:
location ~ [^/].php(/|$) {
...
fastcgi_split_path_info ^(.+?.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
0x02 漏洞复现
在vulhub上已经更新了相应的靶场环境:
https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
拉取镜像环境:
环境启动后,访问http://your-ip:8080/index.php即可查看到一个默认页面。
使用https://github.com/neex/phuip-fpizdam
中给出的工具,发送数据包:
(前提本机拥有正常的golang环境)
可见,这里已经执行成功。
我们访问http://your-ip:8080/index.php?a=id,即可查看到命令已成功执行:
注意,因为php-fpm会启动多个子进程,在访问/index.php?a=id时需要多访问几次,以访问到被污染的进程。
0x03 修复建议
1.修改 nginx 配配置文件中fastcgi_split_path_info的正则表达式,不允许.php之后传入不可显字符
2.暂停使用 nginx+php-fpm 服务
3.删除如下配置
fastcgi_split_path_info ^(.+?.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
0x04 参考链接
https://www.anquanke.com/post/id/189415
https://github.com/vulhub/vulhub/blob/master/php/CVE-2019-11043/README.zh-cn.md
https://mp.weixin.qq.com/s/XPFIEiNvNorfgQHein_NGw