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

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

缺陷编号:wooyun-2014-065772

漏洞标题:yuncart设计不当可重置任意用户密码

相关厂商:yuncart

漏洞作者: wutongyu

提交时间:2014-06-22 01:08

修复时间:2014-09-20 01:10

公开时间:2014-09-20 01:10

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

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-22: 积极联系厂商并且等待厂商认领中,细节不对外公开
2014-09-20: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

Yuncart 是一套易与集成的php开源商城系统,方便多人同时经行二次开发,Yuncart 可以以非常方便的方式切换到sql server,oracle等数据库

详细说明:

Yuncart 是一套易与集成的php开源商城系统,方便多人同时经行二次开发,Yuncart 可以以非常方便的方式切换到sql server,oracle等数据库
该商城系统在用户找回密码的地方采用的是弱认证,很容易就会被攻击者模拟出来,并且重置任意用户的密码。
问题出在:user.class.php 大约171行:

public function forgetpwd() {
if(ispostreq()) {//接受email,发送
$email = trim($_POST["email"]);
if($email && ($user = DB::getDB()->selectrow("user","uid,uname","email='$email'")) ) {
//加载发送邮件
require COMMONPATH. "/send.class.php";
$sendmail = new SendEmail();

//邮件
$time = time();
$subject = __("getpwd");
$content = file_get_contents(DATADIR."/filemsg/forgetpwd.html");
$search = array("{uname}","{forgetpwd}");
$mailkey = substr(md5($email.$time),8,8);
$url = getConfig('weburl').url('index','user','setpwd','uid='.$user["uid"].'&mailkey='.$mailkey);
$replacement = array($user['uname'],$url);
$content = str_replace($search,$replacement,$content);
//发送
$ret = $sendmail->send($email,$subject,$content);
if($ret) {//如果发送成功
DB::getDB()->update("user",array("mailkey"=>$mailkey,"mailtime"=>$time),"uid='".$user["uid"]."'");
}
$this->setHint("forgetpwd_send_".($ret?"success":"failure"),$ret?"success":"error");
} else {
$this->setHint("email_not_exist","error");
}
} else {
$this->getHint();
$this->output("forgetpwd");
}
}


生成的找回密码链接是uid+key。key的生成方法是substr(md5($email.$time),8,8)。
也就是说截取了md5之后的用户邮箱+时间戳的后8位。
那么很容易就可以根据这个来编写对应的找回密码链接了。

漏洞证明:

这里我以官方的demo站点为例子,重置一个会员的密码:

2.jpg


会员id是5,根据这个情况。构造key值:
在找回密码的瞬间,记录下时间戳。顺便开始生成:

3.jpg


4.jpg


就是他了:

5.jpg


6.jpg

修复方案:

尽量不要采用攻击者能预测到的算法。

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


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝