网站地图    收藏   

主页 > 后端 > 网站安全 >

ecshop一处设计缺陷可以被二次利用 - 网站安全

来源:自学PHP网    时间:2015-04-17 10:15 作者: 阅读:

[导读] 关于管理员密码那些事。本文前提 已经获得管理员密码的MD5!不知道从那个版本开始ec管理员密码加密方式发生了一些变化$ec_salt=rand(1,9999);md5(md5($pwd).$ec_salt;对于通过注入得到md5的兄弟...

关于管理员密码那些事。

本文前提 已经获得管理员密码的MD5
 
 
不知道从那个版本开始ec管理员密码加密方式发生了一些变化
 
$ec_salt=rand(1,9999);
 
md5(md5($pwd).$ec_salt;
 
对于通过注入得到md5的兄弟们标识压力山大啊!爆破无望。
 
 
 
不过。。ec后台的找回密码给了大家希望。
 
这个Bug 很明显 可能已经被长期利用
 
 
 
下面看代码
 
admin/get_password.php 138行
 
 
/* 验证新密码,更新管理员密码 */
    elseif (!empty($_POST['action']) && $_POST['action'] == 'reset_pwd')
    {
        $new_password = isset($_POST['password']) ? trim($_POST['password'])  : '';
        $adminid      = isset($_POST['adminid'])  ? intval($_POST['adminid']) : 0;
        $code         = isset($_POST['code'])     ? trim($_POST['code'])      : '';

        if (empty($new_password) || empty($code) || $adminid == 0)
        {
            ecs_header("Location: privilege.php?act=login\n");
            exit;
        }

        /* 以用户的原密码,与code的值匹配 */
        $sql = 'SELECT password FROM ' .$ecs->table('admin_user'). " WHERE user_id = '$adminid'";
        $password = $db->getOne($sql);

        if (md5($adminid . $password) <> $code)
        {
            //此链接不合法
            $link[0]['text'] = $_LANG['back'];
            $link[0]['href'] = 'privilege.php?act=login';

            sys_msg($_LANG['code_param_error'], 0, $link);
        }

        //更新管理员的密码
$ec_salt=rand(1,9999);
        $sql = "UPDATE " .$ecs->table('admin_user'). "SET password = '".md5(md5($new_password).$ec_salt)."',`ec_salt`='$ec_salt' ".
               "WHERE user_id = '$adminid'";
        $result = $db->query($sql);

 

 
 
 
看出问题了把
 
md5($adminid . $password) == $code
 
即可重置密码
 
前面已经说了前提了 2个值都有了 code是多少已经很明显了
 
 
 
而且这里没有任何限制,存在暴力破解(密码字典+1-9999的盐)。成本较高。但是可以自动化。 

 
修复方案:

换个更加严禁的code生成方式。增加验证码。
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论