Ecshop提供了密碼找回功能,但是整個密碼找回流程中存在一些設計上的安全隱患
1. Ecshop程序使用了MD5不可逆加密算法,但是計算密文的生成元素都有可以很輕易地被黑客拿到
/*
if (md5($adminid . $password) <> $code)
1. $adminid: 黑客顯式指定
2. $password: 暴力枚舉
*/
2. 對重復失敗次數沒有做限制
1. 漏洞觸發條件
HTTP Package Repeater
2 漏洞影響范圍
1. ecshop 2.7.2
2. ecshop 2.7.3
3. ...
3. 漏洞代碼分析
admin/get_password.php
...
/* 驗證新密碼,更新管理員密碼 */
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);
/*
這里是漏洞的關鍵
1. $adminid:黑客想要爆破攻擊重置密碼的對象
2. $password:黑客通過密碼暴力枚舉
3. $code:黑客可以在本地使用相同的算法進行計算得到
*/
if (md5($adminid . $password) <> $code)//www.zuimoban.com
{
//此鏈接不合法
$link[0]['text'] = $_LANG['back'];
$link[0]['href'] = 'privilege.php?act=login';
sys_msg($_LANG['code_param_error'], 0, $link);
}
....
4. 防御方法
這個漏洞屬于密碼學的抗窮舉設計缺陷,要對這個漏洞進行修復,同時要能保證對原有的業務進行平滑兼容,我們可以從以下幾個方面去思考
1. 增加密鑰空間,提供攻擊者的攻擊成本:容易實現
2. 改變加密算法,間接地提高了密鑰空間:需要對原有舊的密碼進行全量地升級,改造成本大
admin/get_password.php
/* 以用戶的原密碼,與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);
}
//更新管理員的密碼
/*
這里是pathc code的關鍵
代碼中增加了隨機數的鹽,這極大地增加了黑客爆破的密鑰空間,提供了攻擊成本
*/
$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'";
新聞熱點
疑難解答