发布日期:2013-03-25 13:01 来源:未知 标签: nginx 文件 路径 远程 命令 漏洞
 

漏洞版本:
Igor Sysoev nginx 0.8.x
Igor Sysoev nginx 0.7.x
Igor Sysoev nginx 0.6.x

漏洞描述:nginx是多平台的HTTP服务器和邮件代理服务器。

nginx可以被配置为以CGI的方式支持PHP的运行,nginx在处理PHP脚本文件路径的解析时存在问题。如果网站允许上传文件,而且上传文件路径可得到,远程攻击者可以利用此漏洞上传包含恶意代码的文件并得到执行,实现以Web进程权限执行任意命令。

问题出现在nginx传递访问的URL和后续的脚本路径提取过程中,攻击者可以上传允许上传的文件类型,文件中包含恶意代码,得到上传文件通过Web可访问的URL后,在其后添加任意php后缀的文件名进行访问,存在漏洞的处理过程会把上传的文件作为CGI脚本执行。

nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以

location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量 SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP 的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.80sec.com/80sec.jpg,我们以如下的方式去访问
http://www.80sec.com/80sec.jpg/80sec.php

将会得到一个URI

/80sec.jpg/80sec.php

经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为

/scripts/80sec.jpg/80sec.php<* 参考
http://www.80sec.com/nginx-securit.html
*>
测试方法
本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!
1.访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:
2.
3.访问http://www.80sec.com/robots.txt
4.
5.HTTP/1.1 200 OK6.Server: nginx/0.
6.32
7.Date: Thu, 20 May 2010 10:05:30 GMT
8.Content-Type: text/plain9.Content-Length: 1
810.Last-Modified: Thu, 20 May 2010 06:26:34 GMT
11.Connection: keep-alive
12.Keep-Alive: timeout=20
13.Accept-Ranges: bytes
14.
15.访问访问http://www.80sec.com/robots.txt/80sec.php
16.
17.HTTP/1.1 200 OK
18.Server: nginx/0.6.32
19.Date: Thu, 20 May 2010 10:06:49 GMT
20.Content-Type: text/html
21.Transfer-Encoding: chunked
22.Connection: keep-alive
23.Keep-Alive: timeout=20
24.X-Powered-By: PHP/5.2.6
25.
26.其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

安全建议:临时解决方法:

用户可以采用下面的临时解决方案来避免漏洞的威胁:

* 修改运行配置
 
  修改配置文件PHP的配置文件php.ini,把默认的如下行:
  cgi.fix_pathinfo=1

    修改为:
    cgi.fix_pathinfo=0
   
    重启nginx服务器。

厂商补丁:

Igor Sysoev
-----------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://nginx.net/

相关评论

专题信息
    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。