[文章作者:张宴 本文版本:v1.2 最后修改:2010.05.24 转载请注明原文链接:http://blog.zyan.cc/nginx_0day/]

  注:2010年5月23日14:00前阅读本文的朋友,请按目前v1.1版本的最新配置进行设置。

  昨日,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.zyan.cc/read.php/348.htm 就不能访问了。

  方法②、在nginx的配置文件添加如下内容后重启:if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}。该匹配会影响类似 http://www.domain.com/software/5.0/test.php(5.0为目录),http://www.domain.com/goto.php/phpwind 的URL访问。

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



  本人再提供一种修改nginx.conf配置文件的临时解决方法,兼容“http://blog.zyan.cc/demo/0day/phpinfo.php/test”的PATH_INFO伪静态,拒绝“http://blog.zyan.cc/demo/0day/phpinfo.jpg/test.php”的漏洞攻击:
location ~* .*\.php($|/)
{
      if ($request_filename ~* (.*)\.php) {
            set $php_url $1;
      }
      if (!-e $php_url.php) {
            return 403;
      }

      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
}


  也可将以下内容写在fcgi.conf文件中,便于多个虚拟主机引用:
if ($request_filename ~* (.*)\.php) {
    set $php_url $1;
}
if (!-e $php_url.php) {
    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;




  附:文章修改历史

  ● [2010年05月21日] [Version 1.0] 新建

  ● [2010年05月23日] [Version 1.1] 针对网友michael提出的“如果构造一个形如/..trojan.jpg/dummy.php/?abcd=1,似乎可以绕过防范的nginx配置”,进行了配置修改,防范了此类情况发生。提供测试的URL如下,拒绝漏洞访问:
  http://blog.zyan.cc/demo/0day/phpinfo.jpg (里面是PHP代码)
  http://blog.zyan.cc/demo/0day/phpinfo.jpg/.php
  http://blog.zyan.cc/demo/0day/phpinfo.jpg/dummy.php
  http://blog.zyan.cc/demo/0day/phpinfo.jpg/dummy.php/?abcd=1

  同时兼容正常的PATH_INFO伪静态请求,测试URL如下:
  http://blog.zyan.cc/demo/0day/phpinfo.php (这是正常的PHP文件)
  http://blog.zyan.cc/demo/0day/phpinfo.php/test
  http://blog.zyan.cc/demo/0day/phpinfo.php/news123.html
  http://blog.zyan.cc/read.php/348.htm

  ● [2010年05月24日] [Version 1.2] 修正文字描述错误。


Tags: , ,
技术大类 » Web服务器 | 评论(78) | 引用(0) | 阅读(89221)
boss
2010-5-21 19:24
grincool
pahud
2010-5-21 19:56
其實就等於這樣對吧   location ~ .*\.(php|php5)?$   {     if (!-f $request_filename) { return 404; break; }   }
张宴 回复于 2010-5-21 20:08
不等于。单纯这句是不支持类似 http://blog.s135.com/read.php/348.htm 的PATH_INFO URL访问的,跟方法①、方法②无区别。因为/read.php才是真正存在的文件,而/348.htm是伪静态的参数。是不存在/read.php/348.htm这个文件的。
啊空 Homepage
2010-5-21 19:59
向高人学习!我是陈啊空!!!
reus
2010-5-21 20:53
只要把方法二放到fastcgi匹配的那个if block里面就行,像你说的那个URI,不是以php结尾,是不会被pass的
小陈
2010-5-21 21:44
这是一条隐藏评论或留言。您需要以合适的身份登入后才能看到。
爱月 Email Homepage
2010-5-21 22:25
爱月从新疆局域网回归中国广域网,向老朋友问候一下~

听说张大出书啦?~改天去买本儿~
大碗茶 Email
2010-5-22 00:32
这个漏洞在 php-fpm 0.6版本中已经不存在了吧,而且php-fpm 0.6也发布了好长时间了,建议作者更新php-fpm
qwe
2010-5-22 00:43
第2种方法加入后重其提示
[emerg]: "if" directive is not allowed here in /usr/local/webserver/nginx/conf/nginx.conf:75
75句也就是if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}这句,
你提供的方法也出现同样提示

location ~* .*\.php($|/)
{
这句是77句

[emerg]: "location" directive is not allowed here in /usr/local/webserver/nginx/conf/nginx.conf:77
暗黑游侠 Email Homepage
2010-5-22 02:20
张老师果然是对nginx有深入的研究啊,让我自愧不如
shy
bsd
2010-5-22 09:23
set $fn $fastcgi_script_name;
set $cF 'cF';

if ($fn ~ "^([^.]+?\.php)")
{
        set $cF $1;
}

if ($cF = 'cF')
{
        return 444;
}

这种方式是否可行?
aa
2010-5-22 09:32
php-fpm的老漏洞,今年1月就有人发现了
吕滔 Email Homepage
2010-5-22 10:13
大哥比我大一岁,在技术方面却比我高出不知道多少层,实在是佩服。

刚接触linux 以后还请多多指教
风往北吹 Homepage
2010-5-22 11:25
php-fpm-0.6没有这个漏洞
michael
2010-5-22 14:01
问一下,如果构造一个形如/..trojan.jpg/dummy.php/?abcd=1,似乎可以绕过防范的nginx配置。站长你觉得呢?
张宴 回复于 2010-5-23 14:05
感谢您提出的问题,本文已进行了配置修改,防范了此类情况发生。
daniel.lin Email
2010-5-22 15:44
楼上的说的没错,最最彻底的还是

location ~ \/upload_folder\/.*\.php.* {
return 403
}
gavin2u
2010-5-22 19:14
我的dz站点最近有几次被上传到服务器上phpspy和nsTView两个 php webshell文件,是不是也是因为这个?
comboyzq
2010-5-23 02:14
大神帮小弟个忙吧,我在Nginx这样写了个rewrite 希望能以301跳转 也就是希望地址栏显示输入的原始地址 但不知为什么总显示跳转之后的地址 问了几个地方都没得到解决 希望能在大神这里 求~答~案~ 我是参考大神的教程配的环境
                location /
                {
                  if ( -d $request_filename )
                  {
                    rewrite "^/(.*)([^/])$" http://$host/$1$2/ permanent;
                  }
                }
                location /work/
                {
                  rewrite ^/work(.*)$ http://$host/work/index.php$1 permanent;
                }
               location ~ ^(.+\.php)(.*)
                {
                    include fcgi.conf;
                    fastcgi_pass  127.0.0.1:9000;
                    fastcgi_index index.php;
                  }
bbdu540 Email
2010-5-23 04:22
希望张大侠能做一个..在linux 下 一键安装Nginx+mysql+php的程序包,就像lnmp 那种的,,感觉不错..比较方便快捷...
bbdu540 Email
2010-5-23 04:23
参考,http#//lnmp.org/install.html
我不是给他做广告,,我只是建议一下..呵呵
店铺 Email
2010-5-23 09:06
张兄 我要做一个网站,有些技术上的事情 想请教你一下,希望你能给点建议。

能否交个朋友 ,联系一下?

sqren99@gmail.com

另 发了一封邮件到你的net@s135.com中,请查收一下。
分页: 1/4 第一页 1 2 3 4 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]