PHPCMS整站系统漏洞分析

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PHPCMS整站系统漏洞分析

(原始稿件,已发表于2010年黑客手册第一季)

(廖坚先)Bykid@广东科干

今天要跟大家分享这个漏洞是版本为phpcms2008SP3 _gbk_20100125的整站系统的,这是个包含漏洞。立刻进正题,最后再总结分析;

漏洞还是出现在最容易被忽视的wap模块,打开wap文件夹下的index.php文件,关键代码如下:

第14行也就是“include './include/'.$action.'.inc.php';”,程序员很放心的直接把用户提交的$action变量放进了包含文件的路径中,虽然后缀被限制成“.inc.php”,但是有没有想过管理员的管理模块的文件也是后缀为“.inc.php”的呢?而且很多这些模块文件都是用常量“IN_PHPCMS”作为防止直接访问的标识,同时管理员的管理模块的访问权限的检查是在整站根目录的admin.php文件进行的,那样我也就可以放心的包含了。还有一点值得高兴的是因为是“变异”的包含文件所以有的变量是没有初始化的也就是我们可以控制了。但“杯具”的是很多模块的功能小模块是通过“switch($action)”来运行的,也就是这类型的文件我们只能找“default”语句块来利用了。

经过双手都数不清双击打开文件检查,找到了一个不算完美的利用方法。可以包含的文件是“include/fields/box/field_add.inc.php和field_delete.inc.php”,“fields”下的文件都是对表中的字段操作的文件。这次要进行操作的字段是“phpcms_member_cache”表(PS:这个表是phpcms_member的镜像表,真搞不懂为什么要搞出这个表来)中的“password”字段。为什么我会说不完美呢,因为是操作的是password字段,不是一个记录,但是却可以达到进入管理后台的目的。field_add.inc.php和field_delete.inc.php关键代码如下:

接下来说我的思路,首先是通过“field_delete.inc.php”删掉password字段,然后再通过“field_add.inc.php”添加一个默认值为admin的MD5值的password字段,这样所有的记录的password都是admin了(很郁闷吧),不过最后还是可以把“phpcms_member”重新复制到“phpcms_member_cache”表中的。

实践是检验真理的唯一标准。实践用的是“phpcms2008sp3_gbk_091230”,但打过“phpcms2008_patch_gbk_100125”补丁。实践要用到的文件如图一:

首先运行“drop_cache_password.bat”删掉删掉password字段,相关文件“drop_cache_password.bat”(内容如图二)和“drop.txt”(内容如图三)。

“drop.txt”提交了变量action(包含的文件),tablename(表的名称),field(字段)。执行之后如图四表明成功删除表,:

接下来运行“add_cache_password.bat”,相关文件“add_cache_password.bat”(内容如图五)和“add.txt”(内容如图六)。

“add.txt”增加提交了变量fieldtype(字段的类型),maxlength(类型的最大长度),defaultvalue (默认值),执行之后如图七表明成功。

现在看看表“phpcms_member_cache”有没有被改掉,如图八:

最后上传“recoverCache.php”到phpcms的根目录恢复“phpcms_member_cache”表。如图九运行成功:

再看看“phpcms_member_cache”表如图十:

漏洞的修补,最简单的修补方法是也用switch($action)语句,毕竟wap下要包含的文件就四个;修改后的代码如下(PS:代码没有测试,短短几个语句我觉得是没问题的):

$lang = include './include/lang.inc.php';

if(preg_match('/(mozilla|m3gate|winwap|openwave)/i', $_SERVER['HTTP_USER_AGENT'])) {

header('location:../');

}

wmlHeader($PHPCMS['sitename']);

$action = isset($action) && !empty($action) ? $action : 'index';

switch($action) //修改后代码--开始

{

case 'index':

include './include/index.inc.php';

case 'list':

include './include/list.inc.php';

case 'show_info':

include './include/show_info.inc.php';

case 'show_news':

include './include/show_news.inc.php';

}//修改后代码—结束

$html = CHARSET != 'utf-8' ? iconv(CHARSET, 'utf-8', $html) : $html;

echo str_replace('
', "
\n", $html);

wmlFooter();

?>

最后,大家要是有兴趣可以找更加完美的利用方法。我只是想证明这个漏洞的严重性,所以就不去继续找更好的方法了。

相关文档
最新文档