未加星标

nginx文件类型错误解析0day漏洞

字体大小 | |
[web安全 所属分类 web安全 | 发布者 店小二03 | 时间 20100521 | 作者 路人甲 ] 0人收藏点击收藏
漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支php的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。
  漏洞分析: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里取出真正的脚本名。

  那么假设存在一个

  将会得到一个URI

  /80sec.jpg/80sec.php

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

  /scripts/80sec.jpg/80sec.php

  而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为

  /scripts/80sec.jpg

  所以不存在此问题。

  后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为

  /scripts/80sec.jpg和80sec.php

  最后,以/scripts/80sec.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。

  POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

  访问http://www.80sec.com/robots.txt

  HTTP/1.1 200 OK

  Server: nginx/0.6.32

  Date: Thu, 20 May 2010 10:05:30 GMT

  Content-Type: text/plain

  Content-Length: 18

  Last-Modified: Thu, 20 May 2010 06:26:34 GMT

  Connection: keep-alive

  Keep-Alive: timeout=20

  Accept-Ranges: bytes

  访问访问http://www.80sec.com/robots.txt/80sec.php

  HTTP/1.1 200 OK

  Server: nginx/0.6.32

  Date: Thu, 20 May 2010 10:06:49 GMT

  Content-Type: text/html

  Transfer-Encoding: chunked

  Connection: keep-alive

  Keep-Alive: timeout=20

  X-Powered-By: PHP/5.2.6

  其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

  漏洞厂商:http://www.nginx.org

  解决方案:

  我们已经尝试联系官方,但是此前你可以通过以下的方式来减少损失

  关闭cgi.fix_pathinfo为0

  或者

  if ( $fastcgi_script_name ~ ..*/.*php ) {

  return 403;

  }

本文web安全相关术语:黑盒测试方法 黑盒测试和白盒测试 网站安全检测 360网站安全检测 网络安全知识 网络安全技术 网络信息安全 网络安全工程师

tags: 80sec,php,nginx,fastcgi,SCRIPT,FILENAME,jpg,scripts,script,pathinfo,fix,PHP,Content,name
分页:12
转载请注明
本文标题:nginx文件类型错误解析0day漏洞
本站链接:https://www.codesec.net/view/7389.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | web安全 | 评论(0) | 阅读(23)