结果一

  首先,我安装了apache 2.x版本,同时以module方式使apache与php结合,测试发现确实存在这样的解析漏洞。

  结果二

  然后,我将apache与php的结合方式修改为fastcgi方式,测试发现爆500错误,不存在这样的解析漏洞。

  错误提示:

  1Bad file descriptor: mod_fcgid: don't know how to spawn child process: f4ck.php.x

  意思就是不知道该如何解析这个文件。

  结果出来了,那么对于影响范围这块,在目前所有的apache版本中均存在此问题,但只适用于以module方式解析php的apache,使用fastcgi方式解析php的apache不受影响,使用cgi方式解析php的apache是否影响未测试。

  下面来简单分享一下测试过程中我发现的一点经验。

  先来看一下apache的主配置文件httpd.conf,搜索“DefaultType”,就可以看到这么一段注释和默认配置:

#
# DefaultType: the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value. If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#10DefaultType text/plain

  DefaultType存在的意义是告诉apache该如何处理未知扩展名的文件,比如f4ck.xxx这样的文件,扩展名是xxx,这肯定不是一个正常的网页或脚本文件,这个参数就是告诉apache该怎么处理这种未知扩展名的文件。

  参数DefaultType的默认值是“text/plain”,也就是遇到未知扩展名的文件,就把它当作普通的txt文本或html文件来处理。

  测试一

  比如我将以下代码保存为f4ck.xxx:

  1F4ckTeam apache test

  访问它,按照默认的apache配置,这个文件是会被浏览器显示出来具体效果的:

  这是对于文件内容为HTML代码的未知扩展名文件来说,文件中的HTML代码会被浏览器执行。

  测试二

  那么,对于文件内容为php代码的未知扩展名文件来说,这些php代码会被解析吗?

  来看测试结果:

  可以看到,这里包含php代码的未知扩展名的文件被当作txt文档处理了。

  但是,如果将文件名改为f4ck.php.xxx,那么就会被以module方式运行php的apache解析,为什么?

  因为Apache认为一个文件可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。Apache认为应该从右到左开始判断解析方法的。如果最右侧的扩展名为不可识别的,就继续往左判断,直到判断到文件名为止。

  官方解释见:http://httpd.apache.org/docs/current/mod/directive-dict.html,搜索“extension”即可看到。

  摘录官方解释:

  extension

  In general, this is the part of the filename which follows the last dot. However, Apache recognizes multiple filename extensions, so if a filename contains more than one dot, each dot-separated part of the filename following the first dot is an extension. For example, the filename file.html.en contains two extensions: .html and .en. For Apache directives, you may specify extensions with or without the leading dot. In addition, extensions are not case sensitive.

  那么,对于“测试一”和“测试二”来说,apache发现这个文件的扩展名是未知的,那么它会先看在扩展名之前是否有其他的可识别的扩展名,但是该案例中的完整文件名为 “f4ck.xxxx”,在扩展名“xxxx”之前没有其他的可识别扩展名了,所以apache就按照httpd.conf中参数DefaultType 的值来决定该文件的处理方式,即作为txt文档处理。

  同样的,对于“结果一”和“结果二”来说,也是按照这样的方式来逐步确定未知扩展名文件的解析方式,首先apache发现这个文件的扩展名是未知的,那么它会先看在扩展名之前是否有其他的可识别的扩展名,在该案例中的完整文件名为 “f4ck.php.x”,那么apache就发现在未知扩展名“x”之前有一个可识别的扩展名是“php”,那么apache就会认为这是一个php文件,就会把这个文件按照解析php文件的方式来解析。

  说到这里,就不得不提一下,apache对于扩展名的定义都是写在conf/mime.types文件中的,看一下图:

  文件mime.types定义了apache处理不同扩展名文件的方法,文件httpd.conf中参数DefaultType的值定义了apache处理未知扩展名文件的方法。

  另外,文件httpd.conf中语句块“”中可以用“AddType”语句来定义apache解析不同扩展名文件的方法。

  处理和解析是完全不同的概念,这就好像对于apache+php结合的网站来说,apache是应用服务器,php是中间件,apache只负责接收/ 响应HTTP请求,php却负责.php文件的解释执行。Php将.php文件解释执行完毕后,将生成的HTML代码发送给apache,再由 apache将HTML代码发送给客户端。

  另外说一下,扩展名rar并没有在文件mime.types中出现,所以如果遇到可以上传rar文件且与php的结合方式为module方式的apache,则可以直接上传类似“f4ck.php.rar”的文件来获得webshell。

  解决方案一

  在httpd.conf或httpd-vhosts.conf中加入以下语句,从而禁止文件名格式为*.php.*的访问权限:

<FilesMatch ".(php.|php3.|php4.|php5.)">
Order Deny,Allow
Deny from all
</FilesMatch>

  解决方案二

  如果需要保留文件名,可以修改程序源代码,替换上传文件名中的“.”为“_”:

$filename = str_replace('.', '_', $filename);

  如果不需要保留文件名,可以修改程序源代码,将上传文件名重命名为时间戳+随机数的格式。

  总结:网上说的“低版本的apache存在未知扩展名解析漏洞”的说法是错误的,正确的说法应该是使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞,使用fastcig模式与php结合的所有版本apache不存在此漏洞。并且,想利用此漏洞必须保证文件扩展名中至少带有一个“.php”,否则将默认被作为txt/html文档处理。

  小编之前也听到一个观点是:低版本的apache的解析才存在这个问题,但实际上这个解析的问题跟apache版本高低无关,与处理拓展名的方法有关。就像iis7的解析漏洞与iis7本身没有关系,而是跟Fast-CGI有关系。

  
  1. apache插件将合法网站变成恶意程序传播平台
  2. apache/apache tomcat目录遍历漏洞的防范
  3. Darkleech木马升级:可能是最精良的apache后门
  4. Apache Struts 2漏洞深度解读
  5. 解析漏洞总结
Copyright © 2014-2024 it689.com (京ICP备12032795号-2) 版权所有 Power by IT689