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


    [文章作者:张宴 本文版本:v1.2 最后修改:2010.05.24 转载请注明原文链接:http://blog.s135.com/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.s135.com/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.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 $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.s135.com/demo/0day/PHPinfo.jpg (里面是PHP代码)
      http://blog.s135.com/demo/0day/PHPinfo.jpg/.PHP
      http://blog.s135.com/demo/0day/PHPinfo.jpg/dummy.PHP
      http://blog.s135.com/demo/0day/PHPinfo.jpg/dummy.PHP/?abcd=1

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

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

  • 相关阅读:
    字符串通配
    最短排序
    最长回文子串
    添加回文串
    找零钱
    最优编辑
    01背包
    PHP做分页查询(查询结果也显示为分页)
    PHP 练习3:租房子
    Html5学习3(拖放、Video(视频)、Input类型(color、datetime、email、month 、number 、range 、search、Tel、time、url、week ))
  • 原文地址:https://www.cnblogs.com/myphoebe/p/2230098.html
Copyright © 2020-2023  润新知