很多次听到人说apache的“解析漏洞”了,正好今天又有人问,那就简单科普一下这个“解析漏洞”是何物。

先来看测试过程和结果的对比吧。

结果一

首先,我安装了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解析漏洞详解的更多相关文章

  1. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  2. Apache Rewrite 规则详解

    在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...

  3. org.apache.log4j.Logger详解

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...

  4. Apache POI使用详解

    Apache POI使用详解 1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案 ...

  5. HiveSQL解析过程详解 | 学步园

    HiveSQL解析过程详解 | 学步园   http://www.xuebuyuan.com/2210261.html

  6. org.apache.common.io-FileUtils详解

    org.apache.common.io---FileUtils详解 getTempDirectoryPath():返回临时目录路径; public static String getTempDire ...

  7. org.apache.log4j.Logger 详解

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景    在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计 ...

  8. 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)

    简介 从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本 ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个 ...

  9. 利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单

    转载自:https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html 目标环境: 比如,目标存在一个上 ...

随机推荐

  1. linux 下远程连接windows

    安装软件 sudo apt-get install rdesktop 连接windows 然后进入windows登陆界面 输入应户名密码后就进入windows了 注意的是 参数-f是全屏的意思  然后 ...

  2. bzoj 1001

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  3. Torch7的安装

    Torch7 是一个科学计算框架,支持机器学习算法.易用而且提供高效的算法实现,得益于 LuaJIT 和一个底层的 C 实现. 提供: 一个强大的 N 维数组 提供大量索引.切片和置换的程序 通过 L ...

  4. 写出3种遍历一个list的方法,(使用for循环)

    for(String s : list){ System.out.print(s+"/t"); } for(int i = 0;i<list.size();i++){ Sys ...

  5. eclipse各版本代号

    从2006年起,Eclipse基金会每年都会安排同步发布(simultaneous release).同步发布主要在6月进行,并且会在接下来的9月及2月释放出SR1及SR2版本.如下图所示的版本历史: ...

  6. CodeForces 51F Caterpillar

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. ubantu eclipe

    sudo tar zxvf '/tmp/eclipse-inst-linux64.tar.gz' -C/usr/lib 4.在终端输入: $ sudo gedit /usr/share/applica ...

  8. RabbitMQ 通过记日志来看routingkey

    RoutingKey 每个项目都需要记录日志,日志则一般会分为多种级别,常见的是 Info.debug.warn.Error 对于前三种日志,在项目运行中会产生大量的消息,但是一般多数情况下是不会用到 ...

  9. English Snippets

    There is no Zen master to prod you with a stick, but I have some questions for you. Your answers wil ...

  10. POJ 1236 Network of Schools(强连通分量/Tarjan缩点)

    传送门 Description A number of schools are connected to a computer network. Agreements have been develo ...