在PHP中使用FastCGI解析漏洞及修复方案

漏洞描述:

Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问http://192.168.1.102/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文件来解析了。


漏洞危害:

WebServer Fastcgi配置不当,会造成其他文件(例如css,js,jpg等静态文件)被当成php脚本解析执行。当用户将恶意脚本webshell改为静态文件上传到webserver传递给后端php解析执行后,会让攻击者获得服务器的操作权限。


修复方案:

至今解决方案配置webserver关闭cgi.fix_pathinfo为0 或者 配置webserver过滤特殊的php文件路径例如:

if ( $fastcgi_script_name ~ ..*/.*php )

{

return 403;

}

一般来说网上多是nginx用户有此漏洞,此处客户的环境是windows server 2008R2的IIS,这里我在‘处理程序映射’里找到php的双击进入此界面

 

在PHP中使用FastCGI解析漏洞及修复方案_第1张图片

 

进入‘请求限制’

 

在PHP中使用FastCGI解析漏洞及修复方案_第2张图片

 

确定后就可以了。

测试:

在服务器上根目录新建一个phpinfo()的JPG文件test.jpg,访问http://www.xxx.com/test.jpg/1.php(test.jpg后面的php名字随便写),如果有漏洞则可以看到phpinfo()的信息,反之会返回404错误。

后记:

nginx里面处理此问题,网上的解决方法是写入

try_files $fastcgi_script_name =404;

到fastcgi.conf里面,然后在location中引用

location ~ \.php$ {

fastcgi_pass unix:/tmp/phpfpm/php-fpm.sock;

include fastcgi.conf;

}


你可能感兴趣的:(PHP)