漏洞描述
Nginx默认以CGI的方式支持PHP解析,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。
当访问 http://192.168.1.103/phpinfo.jpg/1.php 这个URL时,$fastcgi_script_name
会被设置为 phpinfo.jpg/1.php ,然后构造成SCRIPT_FILENAME 传递给 PHP CGI。如果 PHP 中开启了 fix_pathinfo 选项,PHP 会认为 SCRIPT_FILENAME 是 phpinfo.jpg,而 1.php 是 PATH_INFO,所以就会将 phpinfo.jpg 作为 PHP 文件来解析。
漏洞危害
利用该漏洞,攻击者可以将任意文件类型作为PHP文件解析,攻击者通常利用该漏洞来获取到一个WebShell。
修复方案
方案一(适用于Nginx和IIS用户)
修改 php.ini 文件,将 cgi.fix_pathinfo
的值设置为 0。完成后重启 PHP 和 Nginx(IIS)。
方案二(适用于Nginx用户)
在 Nginx 配置文件中添加以下代码,当匹配到类似 test.jpg/a.php 的URL时,将返回403错误代码:
if ( $fastcgi_script_name ~ ..\/.php )
{
return 403;
}
修改完成后请重启 Nginx。