[文章作者:张宴 本文版本: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服务器 | 评论(82) | 引用(0) | 阅读(129712)
阿道夫
2010-5-23 21:52
上地方都是发撒旦发得分士大夫的事发生大幅杀跌反对萨芬士得分士大夫达省份是大法师地方撒旦发得分撒得分士大夫士大夫士大夫萨放大士大夫上的发生大幅士大夫阿斯发
phpbird Email Homepage
2010-5-23 23:47
阅 好文章
myth
2010-5-24 08:22
我的站就中标了,整了一晚上,才恢复
flydragon
2010-5-24 09:45
第2个方法是我写的:
if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}
请教一下,如何会匹配同样会一并干掉类似“/read.php/348.htm”的URI。
张宴 回复于 2010-5-24 11:12
此处是我的错误,对/read.php/348.htm无影响,对以下URL有影响:http://www.domain.com/software/5.0/test.php(5.0为目录),http://www.domain.com/goto.php/phpwind
klgd
2010-5-24 13:05
听说php-fpm 0.6就没有这个漏洞了,我想直接升级,应该怎么做呢?
huliang Homepage
2010-5-24 13:35
其实如果上传组件进行文件类型真实性了判断,这个伪装的Php程序是根本无法上传上来的。这是很好的习惯,而且这个程序对于并不需要复杂的运算也不需要读取全部文件,所以效率也不差。无论有没有样的漏洞,上传组件都应当去过滤这些东西。:-)
参考
PHP通过读取文件头部两个字节判断文件真实类型及其应用示例
rodericliu
2010-5-24 13:58
按照张兄说的,禁止上传目录解释PHP文件,是一个不错的方案!

# disable upload folder php
location    ^~ /bbs/attachments/   {
  location ~* "\.php.*$" {
    return 403;
  }
}
举子
2010-5-24 14:23
张兄     对于这个漏洞把图片单独放置到一台服务器上面这个漏洞就封上了对吧?   那我有2台服务器,一台跑Nginx,一台跑PHP    这样分开后这个漏洞还会存在么 ?
开门 Email
2010-5-24 21:32
php-fpm 0.6???
哪里下载啊?
http://php-fpm.org/download/  上面只有0.5.XXX 没有看到0.6啊。

不好意思。。我自己看到了。。
0.6.x series in Launchpad. It is most likely going to ship with PHP 5.4(consider it experimental!)。。。
还是不升级了。。不要因为一个问题。引起更多的问题。。
ikj
2010-5-24 22:13
用你的办法,那么映射了目录的话(虚拟目录),就没法执行了
kindle Homepage
2010-5-25 01:34
if ($request_filename ~* (.*)\.php) {    set $php_url $1;}if (!-e $php_url.php) {    return 403;}加入fcgi.conf后访问  http://blog.s135.com/demo/0day/phpinfo.php/test是打不开的只有在nginx.conf里才管事
flydragon
2010-5-25 10:35
第2个方法是我写的:
if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}
请教一下,如何会匹配同样会一并干掉类似“/read.php/348.htm”的URI。
张宴 回复于 2010-5-24 11:12
此处是我的错误,对/read.php/348.htm无影响,对以下URL有影响:http://www.domain.com/software/5.0/test.php(5.0为目录),http://www.domain.com/goto.php/phpwind

对,当时也是临时这么写的,因为除了测试情况,这种目录结构或rewrite重写结构很少存在,所以就应用配置了,但同事说还是有被黑的情况,还能发现这个规则有什么问题吗。
仪器 Homepage
2010-5-25 16:47
早想到您该出来了  Nginx的推广少不了你


检测仪器
win7 Homepage
2010-5-25 16:52
真严谨 考虑的很全面
laruence Email Homepage
2010-5-25 23:12
其实就是判断下是否存在文件么, 如果在location下真有个test.php, 那就杯具了.
阿飞 Homepage
2010-5-26 12:59
学习
现在用linux的,自己不用维护
赵冬冬 Homepage
2010-5-27 17:46
好久没来
张兄又有新的分享!
赵冬冬来此领教啦
支持一下新博客!
Akira
2010-5-30 21:40
LZ提供的方案存在漏洞哦. 可能是你没细心的去检查,可以bypass.
daheng99
2010-6-1 16:45
您好!

最新版的 nginx 0.8.39 是否已经修复了这个文件解析的漏洞????

谢谢!
求救
2010-6-2 10:28
如果想让nginx只能响应某些特殊的后缀文件,比如.jpg .png之类的,其他的都返回403.
该如何配置nginx呀。
分页: 2/5 第一页 上页 1 2 3 4 5 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]