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

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

缺陷编号:wooyun-2015-0135180

漏洞标题:metinfo 一处设计不当(可重置管理员密码)

相关厂商:MetInfo

漏洞作者: 淡蓝色の忧伤

提交时间:2015-08-19 11:23

修复时间:2015-11-17 11:30

公开时间:2015-11-17 11:30

漏洞类型:设计缺陷/逻辑错误

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

其实有点鸡肋的但是确实可以改

详细说明:

\admin\admin\getpassword.php 第42行 找回密码步骤2

case 'next2':
//此处省略x+y 字 O(∩_∩)O哈!
}
if($admin_list){
$met_fd_usename=$met_fd_usename;
$met_fd_fromname=$met_fd_fromname;
$met_fd_password=$met_fd_password;
$met_fd_smtp=$met_fd_smtp;
$met_webname=$met_webname;
$met_weburl=$met_weburl;
$adminfile=$url_array[count($url_array)-2];
$from=$met_fd_usename;
$fromname=$met_fd_fromname;
$to=$admin_list['admin_email'];
$usename=$met_fd_usename;
$usepassword=$met_fd_password;
$smtp=$met_fd_smtp;
$title=$met_webname.$lang_getNotice;
$x = md5($admin_list[admin_id].'+'.$admin_list[admin_pass]);
$outime=3600*24*3;
$String=authcode($admin_list[admin_id].".".$x,'ENCODE', $met_webkeys, $outime);
$String=urlencode($String);
$mailurl= $met_weburl.$adminfile.'/admin/getpassword.php?p='.$String;
$body ="<style type='text/css'>\n";
$body .="#metinfo{ padding:10px; color:#555; font-size:12px; line-height:1.8;}\n";
$body .="#metinfo .logo{ border-bottom:1px dotted #333; padding-bottom:5px;}\n";
$body .="#metinfo .logo img{ border:none;}\n";
$body .="#metinfo .logo a{ display:block;}\n";
$body .="#metinfo .text{ border-bottom:1px dotted #333; padding:5px 0px;}\n";
$body .="#metinfo .text p{ margin-bottom:5px;}\n";
$body .="#metinfo .text a{ color:#70940E;}\n";
$body .="#metinfo .copy{ color:#BBB; padding:5px 0px;}\n";
$body .="#metinfo .copy a{ color:#BBB; text-decoration:none; }\n";
$body .="#metinfo .copy a:hover{ text-decoration:underline; }\n";
$body .="#metinfo .copy b{ font-weight:normal; }\n";
$body .="</style>\n";
$body .="<div id='metinfo'>\n";
if($met_agents_type<=1){
$body .="<div class='logo'><a href='$met_weburl' title='$met_webname'><img src='http://www.metinfo.cn/upload/200911/1259148297.gif' /></a></div>";
}
$body .="<div class='text'><p>".$lang_hello.$admin_name."</p><p>$lang_getTip1</p>";
$body .="<p><a href='$mailurl'>$mailurl</a></p>\n";
if($met_agents_type<=1){
$body .="<p>$lang_getTip2</p></div><div class='copy'>$foot</a></div>";
}
require_once ROOTPATH.'include/jmail.php';
$sendMail=jmailsend($from,$fromname,$to,$title,$body,$usename,$usepassword,$smtp);
if($sendMail==0){
require_once ROOTPATH.'include/export.func.php';
$post=array('to'=>$to,'title'=>$title,'body'=>$body);
$met_file='/passwordmail.php';
$sendMail=curl_post($post,30);
if($sendMail=='nohost')$sendMail=0;
}

$text=$sendMail?$lang_getTip3.$lang_memberEmail.':'.$admin_list['admin_email']:$lang_getTip4;
okinfo('../index.php',$text);
}
}


最重要的是 这句$sendMail=jmailsend($from,$fromname,$to,$title,$body,$usename,$usepassword,$smtp);发送邮件的函数
$usename,$usepassword,$smtp
这三个变量
来自$met_fd_usename $met_fd_password $met_fd_smtp
回溯这三个变量
在config/config.inc.php

/*读配置数据*/
$_M[config][tablepre]=$tablepre;
$query = "SELECT * FROM $met_config WHERE lang='$lang' or lang='metinfo'";
$result = $db->query($query);
while($list_config= $db->fetch_array($result)){
$_M[config][$list_config['name']]=$list_config['value'];
if($metinfoadminok)$list_config['value']=str_replace('"', '&#34;', str_replace("'", '&#39;',$list_config['value']));
$settings_arr[]=$list_config;
if($list_config['columnid']){
$settings[$list_config['name'].'_'.$list_config['columnid']]=$list_config['value'];
}else{
$settings[$list_config['name']]=$list_config['value'];
}
if($list_config['flashid']){
$list_config['value']=explode('|',$list_config['value']);
$falshval['type']=$list_config['value'][0];
$falshval['x']=$list_config['value'][1];
$falshval['y']=$list_config['value'][2];
$falshval['imgtype']=$list_config['value'][3];
$list_config['mobile_value']=explode('|',$list_config['mobile_value']);
$falshval['wap_type']=$list_config['mobile_value'][0];
$falshval['wap_y']=$list_config['mobile_value'][1];
$met_flasharray[$list_config['flashid']]=$falshval;
}
}
$_M[lang]=$lang;
@extract($settings);


这段代码不是重点,只是说明一下变量在这里赋值的而已
但是在公共文件admin/include/common.inc.php
第50 行引入
require_once ROOTPATH.'config/config.inc.php';
但是70 行是伪全局代码

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value,0,0,1);
$_M['form'][$_key]=daddslashes($_value,0,0,1);
}
}


所以这这些变量都可以覆盖,
那样我们就把$met_fd_usename $met_fd_password $met_fd_smtp 覆盖为我们自己的邮箱
这样我们可以让找回密码的邮件用我们的邮箱发送。
然后我们登录邮箱,找到邮件记录 -> 改密码

漏洞证明:

依据metinfo的伪全局机制,我们只要在cookie中添加
met_fd_usename = 邮箱用户名
met_fd_password = 邮箱密码
met_fd_smtp = 邮箱服务器
就可以了

修复方案:

版权声明:转载请注明来源 淡蓝色の忧伤@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-08-19 11:28

厂商回复:

后续版本中修复此漏洞,感谢您的反馈。

最新状态:

暂无