现在的位置: 首页 > IT运维 > 正文

Nginx 0day漏洞—却原来是php漏洞

2010年05月25日 IT运维 ⁄ 共 1864字 评论数 2 ⁄ 被围观 1+

2010年5月21日,我正在外地开会,突然接到报告说Nginx有重大0day漏洞,需要马上修补,可是身边没有电脑和网络,就转交给同事修补并检测服务器是否存在被入侵的痕迹。当时没有任何反馈。本来认为这个Nginx的0day漏洞不会很严重,但是回来后发现服务器被入侵了,检查之下发现确实是采用所谓的Nginx文件类型错误解析漏洞进行的攻击,但奇怪的是发生的时间是在修补之后:(

为什么会这样?

再次深层次的修补漏洞,清理完所有的后门之后,从网上找了不少参考资料,分析了一下,大约看出些端倪。
主要参照80sec的《Nginx文件类型解析漏洞》和张宴大师的《再提供一种解决Nginx文件类型错误解析漏洞的方法》。通过张宴大师的深入分析,特别是看了80sec的这篇文章《IIS源码泄露及文件类型解析错误》之后,我们会发现这个漏洞的罪魁祸首并非完全是Nginx,而是php+FastCGI的错,bug报告原文请点开这个链接查看,从这篇bug报告我们看到,实际上这个漏洞早在2010年1月27日就已被报告并提供了修复方法。

漏洞测试方法:

#通过Linux+php环境可以直接执行伪装图片内的php代码
http://www.domains.com/phpinfo.jpg  (里面是PHP代码,例如写个<?php phpinfo();?>函数进去)
http://www.domains.com/phpinfo.jpg/.php
http://www.domains.com/phpinfo.jpg/s.php (s.php可以使任意名字,例如aa.php,只要是这个结构就可以)
http://www.domains.com/phpinfo.jpg/s.php/?abcd=1
#较高版本的IIS环境如果支持了php,源码就可能被下载泄漏
http://www.domains.com/robots.txt/1.php
http://www.domains.com/some.asp/2.php

修补方法:

1、修改 php.ini ,设置 cgi.fix_pathinfo = 0; 然后重启php-cgi。这个方法是最有效的,但可能会造成目录名中包含.php的链接,例如 http://www.domains.com/1111.php/2222.htm 这样的链接如法访问。(该方法较彻底,修改比较简单)

2、:在Nginx虚拟主机配置文件中增加如下rewrite规则(IIS思路类似,IIS增加rewrite规则的方法见《IIS ISAPI_Rewrite防盗链》),以阻止上述非法构造的url进行访问。但这样会影响类似 http://www.domains.com/1.0/222.php(1.0 为目录),http://www.domains.com/1111.php/2222 的URL访问。(该方法较一般,可能被绕过)

if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}

3、在Nginx配置文件中对每个虚拟主机配置的php解析部分增加如下rewrite规则(IIS思路类似)。(该方法较好,但修改繁琐)

      if ($request_filename ~* (.*)\.php) {
            set $php_url $1;
      }
      if (!-e $php_url.php) {
            return 403;
      }

4、如果你是将fastcgi配置保存为公共配置文件,用nginx配置文件去包含的话,那么在fcgi.conf顶部添加如下代码,就不必每个虚拟主机配置都去修改了(该方法较好,修改简单)
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}

5、这个方法也是比较有效的。按照 http://bugs.php.net/bug.php?id=50852&edit=1 提供的方法将php源码打补丁(补丁文件下载地址:http://patch.joeysmith.com/crypt_new_constant.patch)后重新编译php以修补该漏洞。(该方法较彻底)

漏洞的来龙去脉清楚了,再来看上面的疑问。回想整个处理过程,再查看系统日志,被入侵的这台服务器当时使用的是第2种方法进行的修补,修补完应该会有效果才对,但没产生效果,其他服务器却生效了,分析之下,只能怀疑这台服务器在修改完配置之后,没有正确重启Nginx。。。

目前有 2 条留言 其中:访客:1 条, 博主:1 条

  1. 黑孩儿 : 2010年08月30日14:27:49  -49楼

    怎么感觉 http://patch.joeysmith.com/crypt_new_constant.patch 这个补丁不对啊?!


    • 管理员
      聖騎天下 : 2010年08月30日15:41:41  地下1层

      现在不需要打这个补丁了,Nginx新版本已经解决了该Bug...

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#