[转]再提供一种解决Nginx文件类型错误解析漏洞的方法

本文转自:http://blog.s135.com/nginx_0day/

昨日,80Sec 爆出Nginx具有严重的0day漏洞 ,详见《Nginx文件类型 错误解析漏洞 》。只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。

其实此漏洞 并不是Nginx的漏 洞,而是PHP PATH_INFO的漏洞 ,详见:http://bugs.php.net/bug.php?id=50852&edit=1

例如用户上传了一张照片,访问地址为http://www.domain.com/images/test.jpg ,而test.jpg文件内的内 容实际上是PHP代码时,通过http://www.domain.com/images/test.jpg/abc.php 就能够执行该文 件内的PHP代码。

网上提供的临时解决方法有:

方法①、修改php.ini,设置 cgi.fix_pathinfo = 0;然后重启php-cgi。此修改会影响到使用PATH_INFO伪静态的应用,例如我以前博文的URL:http://blog.s135.com/read.php/348.htm 就不能访问了。

方法②、在nginx 的配置文件添加如下内容后重启:if ( $fastcgi_script_name ~ /..*//.*php ) {return 403;}。该匹配同样会一并干掉类似“/read.php/348.htm”的URI。

方法③、对于存储图片的location{…},或虚拟主机server{…},只允许纯静态访问,不配置PHP访问。例如在金山逍遥网论坛、 SNS上传的图片、附件,会传送到专门的图片、附件存储服务器集群上(pic.xoyo.com),这组服务器提供纯静态服务,无任何动态PHP配置。各 大网站几乎全部进行了图片服务器分离,因此Nginx的此次漏洞 对大型网站影响不大。


本人再提供一种修改nginx .conf配置文件的临时解决方法,兼容“http://blog.s135.com/demo/0day/phpinfo.php/test ” 的PATH_INFO伪静态,拒绝“http://blog.s135.com/demo/0day/phpinfo.jpg/test.php ” 的漏洞 攻击:

location ~* .*/.php($|/)
{
if ($request_filename ~* .*/.php$) {
set $is_path_info '0';
}
if (-e $request_filename) {
set $is_path_info '1';
}
if ($is_path_info ~ '0') {
return 403;
}
 
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}

也可将以下内容写在fcgi.conf文件中,便于多个虚拟主机引用:

if
 (
$request_filename
 ~*
 .*
/.
(
php|
php5)
$)
 {

set $is_path_info '0' ;
}
if ( - e $request_filename ) {
set $is_path_info '1' ;
}
if ( $is_path_info ~ '0' ) {
return 403 ;
}
 
fastcgi_param GATEWAY_INTERFACE CGI/ 1.1 ;
fastcgi_param SERVER_SOFTWARE nginx;
 
fastcgi_param QUERY_STRING $query_string ;
fastcgi_param REQUEST_METHOD $request_method ;
fastcgi_param CONTENT_TYPE $content_type ;
fastcgi_param CONTENT_LENGTH $content_length ;
 
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ;
fastcgi_param SCRIPT_NAME $uri ;
fastcgi_param REQUEST_URI $request_uri ;
fastcgi_param DOCUMENT_URI $document_uri ;
fastcgi_param DOCUMENT_ROOT $document_root ;
fastcgi_param SERVER_PROTOCOL $server_protocol ;
 
fastcgi_param REMOTE_ADDR $remote_addr ;
fastcgi_param REMOTE_PORT $remote_port ;
fastcgi_param SERVER_ADDR $server_addr ;
fastcgi_param SERVER_PORT $server_port ;
fastcgi_param SERVER_NAME $server_name ;
 
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值