(转)Apache对文件后缀解析的分析利用

现在的网站越来越多的采用了PHP作为其主要的脚本来构造网页,一来因为PHP功能强大且容易使用;再者则为其后台支持用到的是Apache作为服务器,而Apache是免费的,也许正是因为这样那样的原因,现在的PHP也越来越流行。另外一个方面是大家普遍认为PHP比起ASP要安全的多,很多人提到IIS就摇头,甚至有人毫不夸张的说一台没有人工配置的IIS服务器可以不花10分钟就能进入,这个方面比起Apache真的要差的多,由于种种原因,知道的。不知道的,反正现在PHP大行其道。

然而PHP真的很安全么,在越来越多人的关注下,其越来越多的不足和弱点都逐渐暴露在我们面前,注射,读源代码等等系列漏洞都展现在世人的面前,然而这些明显的漏洞发现以后,我们又把目光转向了其后台的支持者Apache,我们今天就来看看这个号称足够安全的服务是否真的一切都处理的很好呢?

一、追其根究其底

事情很偶然,只是忽然心血来潮,跑去看Apache手册,在apache手册上看到关于后缀的一段描述是这样的:

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.

大概的翻译过来意思就是:

extension (后缀)
一般是指filename中最后一个"."号后面的部分。 但是,Apache可以辨隙喔鑫募笞海绻鹒ilename含有多个".", 则第一个"."后面由每个"."分隔开的部分都是此文件的后缀。 比如filename为file.html.en一个一个文件,它就有两个后缀:.html和.en. 在Apache指令中指定extension时,可以有也可以没有前导的".",而且不区分大小写。

都明白是什么意思么?我再解释一下吧,按照上面的翻译可以这样来理解:一般来说apache把最后一个“.“后面的作为后缀来解析的,但是注意的是如果这个后缀不是合法的,那就没办法解析了, 下面做写测试看看,写个画图象的文件,名为extension_test.php, 
代码如下: (由于这篇文章不是教你PHP语法的,所以一些PHP的知识我就在代码注释了简单说下,更多资料请参考其他PHP资料)

<?php      //这个是PHP文件的标志,后面要有?>结束)
//注意,在此之前不能向浏览器输出任何信息,要注意是否设置了 auto_prepend_file. 
header ("Content-type: image/png");   //创建一个PNG图象
$im = @imagecreate (200, 50)          //画图的面板大小,这里是200X50
  or die ("无法创建图像"); 
$online="NoHack,This is working--";    //上面写的字
$background_color = imagecolorallocate ($im, 0,0,0);  //背景颜色
$text_color = imagecolorallocate ($im, 230, 140, 150);  //字体颜色
imagestring ($im, 100, 10, 15, "$online", $text_color);  //在画布上的起始点
imagepng ($im);                   //按照前面的设置创建这个图象
?>    //文件结束

执行这个文件,就回按照我们前面的设置创建一个图,如下图1:

图1

NO.1>>>  
OK,测试开始,先正常运行我们上面的这个文件,在IE的输入地址,如下显示一个正常的和我们构想一样的这个图:如下图2:
http://127.0.0.1/test/extension_test.php

图2

NO.2>>>
修改我们上面的那个文件名为extension_test.php.nohack,再做测试如下: 在IE地址栏输入http://127.0.0.1/test/extension_test.php.nohack,看到下面显示,图3

图3

解释下:按照前面我们看到的关于后缀的定义,我们知道这个文件有2个后缀,从后往前分别是.nohack和.php,我们知道Apache从后面的那个后缀开始解析,就是开始解析.nohack,但是问题就在这出现了,Apache 不认识.nohack这个后缀,在Apache里没有关于怎么来解析.nohack这个后缀的描述,所以开始解析失败;故它接着往前解析,看到另外一个后缀.php,这个它是认识的,所以按照PHP文件解析,所以显示正常,如上面的图3显示一样。

http://127.0.0.1/test/extension_test.php.bak

NO.3>>>
再来,修改文件名为extension_test.php.nohack.iceskysl ,大家可以看到有三个后缀,但是最后面两个都不是合法的,所以按照前面讲的思路,它最后还是解吸PHP文件,所以显示也是正常,为下图4:
执行:http://127.0.0.1/test/extension_test.php.nohack.iceskysl 

图4

NO.4>>>
好了,我们再来看另外一种可能,修改文件名为extension_test.php.lock.txt,结果会怎么样呢?大家看到的是.txt、.lock和php三个后缀,从后面解析TXT,是可以解析的,所以它就会按照TXT文件进行解析,如下显示结果,图5:
执行:http://127.0.0.1/test/extension_test.php.lock.txt

图5

结论:

由上面的测试和分析大家不难看出,正如Apach文档中对后缀的描述:Apache对于多后缀文件,是从文件名后面开始检查后缀,检查其合法性,并且按照最后一个合法的后缀去执行文件执行。

二、特性利用分析举例:

忙了半天看文档、做测试可不能白忙哈,我们来看看关于这个特性,或者说弱点来说说利用。

(一) 可怜的被动利用:抓住疏忽

不晓得大家还记不记得前段时间蓝色魔法(BMForum)的一个漏洞,大家到知道去执行一个install.php.lock的文件来添加网站管理员,但是却很少有人出来说明白到底是怎么回事:

这个文件是哪里来的;为什么可以执行;为什么能添加管理员等等问题!很多新手朋友也就跟在别人后面在BAIDU上寻找这样的论坛,然后添加管理员再黑了人家论坛还在上面炫耀一番,说自己是多么多么厉害!呵呵~技术没有提高,知识也没长进。
还是静下心来看看到底是怎么搞的:结合我们今天讲的东西看就很简单了:起因就是由于该论坛在安装后把引导安装文件install.php自动改为install.php.lock以避免被别人再次利用,想法是好的,但是做法出现疏忽。他忽略了.lock后缀在Apache中是无法解析的,也正是这里出了问题,按照这个前面我们的分析,我们就可以利用这个install.php.lock来执行install.php文件的功能,而其中就有添加管理员的功能,利用者正是利用这个来直接添加管理员,进而登陆后台写入WEBSHELL而导致网站被黑(具体利用方法我不再重述,不了解的请参看以前杂志文章) 
我们上面说到的是利用别人的疏忽(一是代码编写者错误的把文件改为install.php.lock;二是代码使用者没有注意把这个文件删除),但是一旦别人注意到这个问题的存在,你就没有什么利用的余地了。


(二) 可怕的主动利用:上传突破

上面我们分析了一种利用情况,大家也看到其利用的局限性,主要原因是利用者处于一种被动状态,那么现在我们再说一种利用者处于主动状态的情况:
大家都知道,现在最流行的攻击方法应该算是注入了,对一些本身没有缺陷的主机,大家最喜欢的进攻方式就是从网站上找漏洞,在直接上传WEBSHELL失效的今天,很多人便钟情与SQL注射:找能注射的页面,用手工或者工具自动猜解后台管理员密码,找后台登陆页面登陆,修改上传文件类型,上传WEBSHELL,折腾半天还是想办法传WEBSHELL上去,进而提权限,放木马,按后门,这样的一次入侵才能结束。这其中能不能传WEBSHELL上去成了最关键的一步,传不上去,一切都是惘然。
如上 所说的方法是个很长的步骤,其中任何一步骤出现的问题突破不了都是白搭,再加上PHP站本身的安全性就比较好,SQL注射也不是都能很顺利,怎么办,我们自然是寻找另外的一个突破口:
让我们把目光拉回来,利用最直接最如意的方式就是能直接传一个网页木马,但是网站现在都限制了ASP、CER、PHP、JSP等敏感的文件上传了,于是大家就想办法去突破后缀,大家还记得动易 的突破就是在ASP 后面加一空格 再用十六制编辑器把这个空格改成00%来截断来突破后缀限制的。

我们这里拿国外的一个网站的代码来举例子,class-1 Forum Software 什一个基于PHP/MySQL 的论坛程序,它的实用也是很广泛的,安全性也是大家普遍承认的,但是它有个问题就是出在对于后缀的处理上,然而很多的PHP网站的后处理都和这个类似的,我们来看看具体的代码:

...
   // 取文件后缀
   $tokens = explode(".", $upload_filename);
   $image = 0;
//[!!!]   
   $extension = $tokens[count($tokens) - 1]; 

   // 取的文件大小
   $filesize = $_FILES['filename']['size'];
   // 检查文件是否已经存在
   if (file_exists("$upload_folder/$upload_filename")) {
   echo "<tr><td class=\"otherfields\" colspan=\"2\">The attachment already exists in the upload folder.</td></tr>";
   $upload_file = 0;
   $upload_filename = "";
   } 
    // 检查文件后缀是否合格
//[!!!!] 
$result = forum_exec_query("SELECT * FROM $extensions_table WHERE extension='$extension' AND file_type='Image'", $link);
    if (mysql_num_rows($result)) $image = 1;
...

我再大概的解释下这段代码的意思和作用:  

NO.1>>
$tokens = explode(".", $upload_filename); 把传上来的文件名按照其中"."来分割,把分割后的几段放在$tokens这个数组中.

NO.2>>
   $extension = $tokens[count($tokens) - 1];注意啦!看它是怎么取的后缀,首先count($tokens) 取数组的中元素的个数,然后取$tokens[count($tokens) - 1];这个,也就是最后一个"."后面的作为后缀.NO.3>>
接下来取的文件大小和检查文件是否已经存在,这个不是在重点,我们继续往下看,是检查后缀是否合格的,我们来看看是怎么些的:
$result = forum_exec_query("SELECT * FROM $extensions_table WHERE extension='$extension' AND file_type='Image'", $link);
这里$extensions_table是已经定义好的一个关于上传文件后缀的表单,这句的意思就是再$extensions_table表单中查找文件类型是'Image'且后缀是我们上面代码去的取的的后缀,如果表里存在这样的对应,就返回真,然后就传上去了.

好了,大概的流程就是这样的,比如我上传一个图片文件nohack.gif,那么就是先取后缀gif,再检查大小和是否已存在,最后按照gif Image这样的关系来判断!也就是 
$result = forum_exec_query("SELECT * FROM $extensions_table WHERE extension='gif' AND file_type='Image'", $link);这样如果表里有extension='gif' ;file_type='Image'的对应关系存在,拿就可以上传了.

看上去是不是都很正常啊,没有什么奇怪的嘛!是把?如果上传图片时你上传的时PHP文件,那么在表$extensions_table里没有extension='php' ;file_type='Image',那么就上传不了.很正常嘛!

但是看好了,如果我些一个PHP木马文件并修改它的文件的名字是shell.phpshell.php.' or 'a' ='a再来上传它,我们看看会出现什么现象.开始取后缀,按照它3的定义取得的是最后一个"."后面的,也就是 "' or 'a' ='a";接下来判断文件大小和是否已上传,最后做后缀检查,我们把这个后缀放到它的语句里就是:
SELECT * FROM [extensions table name] WHERE extension='' or 'a' ='a' AND file_type='Image'.怎么样?会不会通过呢?肯定过啦!WHERE语句中extension='' or 'a' ='a' AND file_type='Image' 有个'a' ='a' 是肯定对的,这样就返回真,最后就通过这个检测传了上去了.

传上去了,我们接着怎么利用呢?还记得我说我是把一个PHP木马文件的后缀修改成上面的样子传上去的么?这样我的木马就传上去了,接着怎么运行呢?相信能耐心看到这里的朋友都明白了,我们上传上去的文件就是shell.phpshell.php.' or 'a' ='a,这个文件有两个后缀,从后往前以此是.' or 'a' ='a和.php,我们直接运行这个文件,Apache不晓得最后的那个.' or 'a' ='a后缀怎么解析,就往前解析.php,这样的话,我们的PHP木马就顺利运行了!

自然这里也有一些理想的情况,其中之一就是它是按照你上传时的文件名保存文件的,如果它把除掉后缀外的文件名重新按照自己的算法定义,也就消除了我们的通过多个文件后缀来利用的可能,但是直接保存的还时占了很大一部分的,只要大家善于发现,有很多利用的场合!
通过上面的分析,你明白了么?这里我们不是被动的利用别人的疏忽而是主动的去修改后缀,人为的满足它的条件检测,最后达到我们上传的目的.再这里不光PHP文件能上传,别的也是可以这样构造传上去的.是不是很吓人!

好了,这次就通过一个主动利用,一个被动利用,一个国内论坛的缺点和一个国外论坛的不足分别阐述了关于后缀的利用,版面有限,其他情况就不一一举例了,大家根据前面的分析能抓住问题的本质,就能举一反三,多多利用了!

原文地址:https://www.cnblogs.com/saw2012/p/3093583.html