热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nginx漏洞下传图片可入侵100万服务器nginx+php的注意了

nginx漏洞上传图片可入侵100万服务器nginx+php的注意了国内顶级安全团队80sec于5.20日下午6点发布了一个关于nginx的漏洞通告,由于该漏洞的存在,使用nginx+php组建的网站只要允许上传图片就可能被黑客入侵
nginx漏洞上传图片可入侵100万服务器 nginx+php的注意了
国内顶级安全团队80sec于5.20日下午6点发布了一个关于nginx的漏洞通告,由于该漏洞的存在,使用nginx+php组建的网站只要允 许上传图片就可能被黑客入侵,直到5.21日凌晨,nginx尚未发布补丁修复该漏洞。

  根据Netcraft的统计,直到2010年4月,全球一共有1300万台服务器运行着nginx程序;非常保守的估计,其中至少有600万台服务 器运行着nginx并启用了php支持;继续保守的估计,其中有1/6,也就是100万台服务器允许用户上传图片

由于nginx有漏洞,这100万台服务器可能通过上传图片的方法被黑客轻易的植入木马。植入木马的过程也非常简单,就是把木马改 成图片上传就是了,由于危害非常大,就不说细节了。有兴趣的请访问 http://www.80sec.com/nginx-securit.html

  说了那么多,我想大家对80sec这个顶级安全团队比较好奇吧,素包子简单介绍一下。

  80sec团队由一群年轻、充满活力、充满体力、充满激情、富有创造力的未婚dota男组成,他们均在各大互联网公司从事信息安全工作,他们的口号 是know it then hack it,素包子非常认同这个观点:“我们只要非常熟悉一个事物,就有可能客观的发现它的不足之处,同时我们也能的发现该事物的优点”。

  80sec的意思是“80端口的安全”,也就是“web安全”;同时由于该团队成员都是80后的年轻人,我们也可以理解为“80后安全”;另外由于 sec的发音是se ke,我们还可以理解为“80后色客”、“80后摄客”或“80后S客”,我们对80sec的理解仅受限于想象力。

  下面介绍一下他们的丰功伟绩,他们曾发现IIS、IE、FireFox、Maxthon、世界之窗、PHPWind、DeDeCMS、QQ mail、QuarkMail、EXTMail等软件的漏洞,可见硕果累累。

  既然介绍了80sec,就不得不介绍另外一个非常专注WEB安全的顶级安全团队80vul,该团队同样也是由80后的男童鞋组成(90后表示压力很 大:p),他们也发现了大量WEB APP的安全漏洞,例如IE、Gmail、wordpress、PHPWind、DISCUZ、MYBB等。

  看到这里,想必大家心里都有那么点遗憾,那就是为何没有80后女黑客(我不歧视伪娘,但我必须说明不是伪娘),我也有相同的遗憾。

  最后发一个小道消息,据说黑客已经在行动了;安全人员、系统管理人员、行动起来吧,赶紧修复该漏洞;最好不要有侥幸心理,否则下一个被黑客入侵的可 能就是你的网站。根据80sec安全公告的描述,临时修复方法如下,可3选其一。

  1、设置php.ini的cgi.fix_pathinfo为0,重启php。最方便,但修改设置的影响需要自己评估。

  2、给nginx的vhost配置添加如下内容,重启nginx。vhost较少的情况下也很方便。

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

  return 403;

  }

  3、禁止上传目录解释PHP程序。不需要动webserver,如果vhost和服务器较多,短期内难度急剧上升;建议在vhost和服务器较少的 情况下采用。

作者:Hily 原始链接:http://hily.me/blog/2010/05/nginx-php-configure-security-problem/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处和作者信息及版权声明



漏洞危险等级:毁灭性。
这个漏洞严格上说并不是 Nginx 和 PHP 本身的漏洞造成的,而是由配置造成的。在我之前写的许多配置中,都普遍存在这个漏洞。

简易检测方法:
打开 Nginx + PHP 服务器上的任意一张图片,如:

如果在图片链接后加一串 /xxx.php (xxx为任意字符)后,如:

图片还能访问的话,说明你的配置存在漏洞。

漏洞分析:
下面通过分析一个很常见的 Nginx 配置来解释下漏洞的成因:
server {
     listen       80;
     server_name  test.local;

     access_log  /work/www/logs/test.access.log  main;
     error_log  /work/www/logs/test.error.log;

     location / {
         root   /work/www/test;
         index  index.html index.htm index.php;
     }

     location ~ \.php$ {
         root           /work/www/test;
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
         include        fastcgi_params;
         fastcgi_pass   unix:/tmp/php-fpm.sock;
     }
}

我们在 /work/www/test/ 目录下新建一个文件 test.png,内容如下:
那么访问  时,输出为文本内容:
但是当在后面加上 /xxx.php 时,即 http://test.local/test.png/xxx.php,可怕的事情发生了:
Array
(
     [HOSTNAME] =>
     [PATH] => /usr/local/bin:/usr/bin:/bin
     [TMP] => /tmp
     [TMPDIR] => /tmp
     [TEMP] => /tmp
     [OSTYPE] =>
     [MACHTYPE] =>
     [MALLOC_CHECK_] => 2
     [USER] => www
     [HOME] => /home/www
     [FCGI_ROLE] => RESPONDER
     [SCRIPT_FILENAME] => /work/www/test/test.png
     [QUERY_STRING] =>
     [REQUEST_METHOD] => GET
     [CONTENT_TYPE] =>
     [CONTENT_LENGTH] =>
     [SCRIPT_NAME] => /test.png/xxx.php
     [REQUEST_URI] => /test.png/xxx.php
     [DOCUMENT_URI] => /test.png/xxx.php
     [DOCUMENT_ROOT] => /work/www/test
     [SERVER_PROTOCOL] => HTTP/1.1
     [GATEWAY_INTERFACE] => CGI/1.1
     [SERVER_SOFTWARE] => nginx/0.7.62
     [REMOTE_ADDR] => 192.168.1.163
     [REMOTE_PORT] => 4080
     [SERVER_ADDR] => 192.168.1.12
     [SERVER_PORT] => 80
     [SERVER_NAME] => test.local
     [REDIRECT_STATUS] => 200
     [HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/QVOD, application/QVOD, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
     [HTTP_ACCEPT_LANGUAGE] => zh-cn
     [HTTP_ACCEPT_ENCODING] => gzip, deflate
     [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQPinyin 689; QQDownload 627; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; TheWorld)
     [HTTP_HOST] => test.local
     [HTTP_CONNECTION] => Keep-Alive
     [ORIG_SCRIPT_FILENAME] => /work/www/test/test.png/xxx.php
     [PATH_TRANSLATED] => /work/www/test
     [PHP_SELF] => /test.png/xxx.php
     [REQUEST_TIME] => 1274125615
)
环境变量中,SCRIPT_FILENAME 是 Nginx 传过来的:
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
$fastcgi_script_name 变量说明请参考:
http://wiki.nginx.org/NginxHttpFcgiModule

Nginx 传给 PHP 的值为 /work/www/test/test.png/xxx.php,即 $_SERVER 中 ORIG_SCRIPT_FILENAME 的值,但是 $_SERVER 中 SCRIPT_FILENAME 却是 /work/www/test/test.png。
原因是,/work/www/test/test.png/xxx.php 并不存在,对于这些不存在的路径,PHP 会检查路径中存在的文件,并将多余的部分当作 PATH_INFO。
这里,/work/www/test/test.png 被 PHP 解析为 SCRIPT_FILENAME,/xxx.php 被 PHP 解析为 PATH_INFO 后被丢弃,因此并没有在 $_SERVER 中出现。

解决方法:
解决这个漏洞的方法很显然:关闭上面所述的解析即可。
这个解析可以在 PHP 的配置文件中设置,默认为开启。在这里我们需要将它关闭:
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0
其中 cgi.fix_pathinfo=0 为新增的配置行,表示关闭 PHP 的自动 PATH_INFO 检测。关闭后,该配置漏洞即可消除。

更好的解决方案?
以上方案并不是最完美的,如果你先前有用到 cgi.fix_pathinfo 这个特性,影响会很大,比如关闭后,我的 Blog(Wordpress)文章的 URL 目录形式就得用 rewrite 来实现了。
如果可以将 PHP 设置成只解析 .php 为扩展名的文件,那么这个问题解决起来会更合理。
不过我没找到相关的设置项,或许今后应该出现在 php-fpm 的配置文件中?

总结:
这类问题基本上是无法预料的,但是如果架构设计良好的话,即使存在这个问题,也不会影响安全性。这里给出架构上的安全建议:
* 尽可能使动静内容分离,所有的静态内容存在于静态内容服务器,静态内容服务器上不解析PHP,这样静态文件就永远不能被解析了。
推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
果儿2702937807
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有