### 简要描述: ecshop一处设计缺陷导致可以被二次利用。关于管理员密码那些事。 ### 详细说明: 本文前提 已经获得管理员密码的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);...
### 简要描述: ecshop一处设计缺陷导致可以被二次利用。关于管理员密码那些事。 ### 详细说明: 本文前提 已经获得管理员密码的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的盐)。成本较高。但是可以自动化。 ### 漏洞证明: 上面已经很清楚鸟!