当前位置: 首页 > 科技观察

Apache解析漏洞详解

时间:2023-03-16 15:33:17 科技观察

很多次听人说起apache的“解析漏洞”。正好今天又有人来问我了,下面就简单科普下这个“解析漏洞”是什么。我们先来看看测试过程和结果的对比。结果1首先,我安装了apacheversion2.x,并以模块方式将apache和php结合起来。测试发现确实存在这样的解析漏洞。结果2然后,我把apache和php的结合改成了fastcgi的方式,测试发现出现了500错误,并没有这个解析漏洞。错误信息:1Badfiledescriptor:mod_fcgid:don'tknowhowtospawnchildprocess:f4ck.php.x意味着我不知道如何解析这个文件。结果出来了,那么对于影响范围来说,这个问题存在于当前所有的Apache版本中,但是只适用于以模块方式解析PHP的Apache,使用fastcgi解析PHP的Apache不受影响,使用cgi去解析php的apache是??否影响还没有测试。我简单分享一下我在测试过程中发现的一点经验。首先看apache的主配置文件httpd.conf,搜索“DefaultType”,可以看到这样一个注释和默认配置:其中之一,例如来自文件扩展名。#如果您的服务器主要包含文本或HTML文档,“text/plain”是#一个不错的值。如果你的大部分内容都是二进制的,比如应用程序#或图像,你可能想使用“application/octet-stream”来#防止浏览器试图显示二进制文件,就好像它们是#text。#10DefaultTypetext/plainDefaultTypeexists是告诉apache如何处理扩展名未知的文件,比如f4ck.xxx文件,扩展名是xxx,这肯定不是正常的网页或者脚本文件,这个参数是告诉apache如何处理这个未知的扩展文件。参数DefaultType的默认值为“text/plain”,即遇到未知扩展名的文件时,将其视为普通的txt文本或html文件。测试一例如我将下面的代码保存为f4ck.xxx:1F4ckTeamapache测试访问它,根据apache默认配置,浏览器会显示这个文件具体效果:这是一个未知的文件扩展名,其内容是HTML代码文件,文件中的HTML代码会被浏览器执行。测试2那么,对于内容为php代码的未知扩展名的文件,这些php代码会被解析吗?看测试结果:可以看到包含php代码的未知扩展名的文件被当做txt文件处理。但是,如果将文件名改为f4ck.php.xxx,则会被apache以模块方式运行php来解析。为什么?因为Apache认为一个文件可以有多个扩展名,即使没有文件名,也可以有多个扩展名。扩大。Apache认为应该从右向左判断解析方式。如果最右边的扩展名无法识别,则继续向左判断,直到判断出文件名。看官方解释:http://httpd.apache.org/docs/current/mod/directive-dict.html,搜索“extension”就可以看到。摘自官方解释:extension一般是文件名中最后一个点后面的部分。但是,Apache识别多个文件扩展名,因此如果一个文件名包含多个点,则文件名中第一个点之后的每个点分隔部分都是一个扩展名。例如,文件名file.html.en包含两个扩展名:.html和.en。对于Apache指令,您可以指定带或不带前导点的扩展。此外,扩展名不区分大小写。然后,对于“测试1”和“测试2”,apache发现这个文件的扩展名是未知的,所以会先检查扩展名前是否还有其他可识别的扩展名,但本例中的完整文件名是“f4ck.xxxx”,而在扩展名“xxxx”之前没有其他可识别的扩展名,所以apache根据httpd.conf中参数DefaultType的值来决定文件的处理方式,即作为txt文件。同样,对于“result1”和“result2”,也采用这种方法来逐步确定未知扩展名文件的解析方式。首先,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代码发送给客户端。另外mime.types文件中没有出现rar这个扩展名,所以如果遇到apache可以上传rar文件并且和php结合成一个模块,可以直接上传类似“f4ck.php.rar”的文件到得到一个网络外壳。解决方案1??在httpd.conf或httpd-vhosts.conf中添加如下语句禁止文件名格式*.php.*的访问权限:OrderDeny,AllowDenyfromall解决方案2如果需要保留文件名,可以修改程序源码,将“.”替换掉。在上传的文件名中加上“_”:$filename=str_replace('.','_',$filename);如果不需要保留文件名,可以修改程序源码,将上传的文件名重命名为时间戳+随机数的格式。总结:网上说“低版本apache存在未知扩展解析漏洞”的说法是错误的。正确的说法应该是所有使用模块模式结合php的apache版本都存在未知的扩展解析漏洞。使用fastcig模式和php结合的所有版本的apache都不存在这个漏洞。而且,如果要利用该漏洞,必须保证文件扩展名至少有一个“.php”,否则默认会被处理为txt/html文档。之前小编也听过一个观点:这个问题只存在于apache低版本的分析中,但其实这个分析问题与apache版本的高低无关,而是与方法有关处理扩展名。就像iis7的解析漏洞与iis7本身无关,而与Fast-CGI有关。