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

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

缺陷编号:wooyun-2014-056906

漏洞标题:Doyo建站系统设计缺陷(知邮箱即可修改该用户密码)

相关厂商:wdoyo.com

漏洞作者: ′雨。

提交时间:2014-04-13 12:29

修复时间:2014-07-09 12:30

公开时间:2014-07-09 12:30

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

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-04-13: 细节已通知厂商并且等待厂商处理中
2014-04-18: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-06-12: 细节向核心白帽子及相关领域专家公开
2014-06-22: 细节向普通白帽子公开
2014-07-02: 细节向实习白帽子公开
2014-07-09: 细节向公众公开

简要描述:

验证过于简单啊。

详细说明:

在source/member.php中

function retrieve_password(){
if($this->syArgs("go")){
if($GLOBALS['G_DY']['vercode']==1){
if(!$this->syArgs("vercode",1)||md5(strtolower($this->syArgs("vercode",1)))!=$_SESSION['doyo_verify'])message("验证码错误");
}
$ok=false;
$user=$this->syArgs("user",1);
$email=$this->syArgs("email",1);
if($email){
if($user){
$conditions = array('user' => $user,'email' => $email);
$m = syDB('member')->find($conditions,null,'id,user,email');
if(!$m){message("没有找到匹配的用户和邮箱,请确认用户名及邮箱输入正确。");}else{$ok=true;}
}else{
$conditions = array('email' => $email);
$num = syDB('member')->findCount($conditions);
if($num<1)message("没有找到匹配的用户和邮箱,请确认用户名及邮箱输入正确。");
if($num>1)message("此邮箱注册了多个账号,必须填写用户名才可找回密码。");
if($num==1){$m = syDB('member')->find($conditions,null,'id,user,email');$ok=true;}
}
}else{
message("请输入email地址");
}
if($ok){
$http=get_domain();
$subject=$http.'密码找回邮件';
$token=md5($this->syArgs("vercode",1).$email.time());

$url=$GLOBALS['WWW'].'index.php?c=member&a=reset_password&id='.$m['id'].'&token='.$token;
$body='您在'.$GLOBALS['S']['title'].'提交了密码找回邮件,点击下面的链接进行密码重置:<a href="'.$http.$url.'" target="_blank">【点击此处进行密码重置】</a>,如果本次找回密码不是您亲自操作,请忽略本邮件。';
$send=syClass('syphpmailer');
$retrieve=$send->Send($email,$m['user'],$subject,$body);
if(!$retrieve){
message('邮件发送失败,请联系管理员。');
}else{
syDB('member')->update(array('id'=>$m['id']),array('token'=>$token,'tokentime'=>time()));
message('密码已成功发送至您的邮箱,请点击邮件内容中的链接设置新密码,有效期3天。','?c=member');
}
}
}


在这里 修改密码主要就是用$token 可是$token的验证太弱了。

$token=md5($this->syArgs("vercode",1).$email.time());


看token的由来, 是用找回密码的时候的验证码 和 邮箱 和 时间戳。
所以我们知道要改用户的邮箱就可以直接修改他的密码。

漏洞证明:

do4.jpg


首先把验证码记录上 eqkm 这里用户名不需要填。
然后记录时间戳。1397361568

do5.jpg


然后 对 [email protected] md5一次 得到adc044125e0a5e96d37f2a171c8b3d96
则token就为这个。 但是对方的id我们是不知道的。 这不要紧。
载入burpsuite直接跑一次就行了。
token我们已经知道了。 就只需要其他用户的id了。 这里把id设置为变量 然后穷举。

do6.jpg


观察length 就知道当16的时候是正确的 则用户的id为16.
然后直接访问。

do7.jpg


即可直接修改其他用户的密码。

修复方案:

加强验证。

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-07-09 12:30

厂商回复:

最新状态:

2014-07-09:已修复