(转)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 multi
ple 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 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为⼀个⼀个⽂件,它就有两个后缀:.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
图2
图3
解释下:按照前⾯我们看到的关于后缀的定义,我们知道这个⽂件有2个后缀,从后往前分别是.nohack和.php,我们知道Apache从后⾯的那个后缀开始解析,就是开始解析.nohack,但是问题就在这出现了,Apache 不认识.nohack这个后缀,在Apache⾥没有关于怎么来解析.nohack这个后缀的描述,所以开始解析失败;故它接着往前解析,看到另外⼀个后缀.php,这个它是认识的,所以按照PHP⽂件解析,所以显⽰正常,如上⾯的图3显⽰⼀样。
图4
图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'",
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⽂件能上传,别的也是可以这样构造传上去的.是不是很吓⼈!
好了,这次就通过⼀个主动利⽤,⼀个被动利⽤,⼀个国内论坛的缺点和⼀个国外论坛的不⾜分别阐述了关于后缀的利⽤,版⾯有限,其他情况就不⼀⼀举例了,⼤家根据前⾯的分析能抓住问题的本质,就能举⼀反三,多多利⽤了!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。