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

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

缺陷编号: WooYun-2014-87890

漏洞标题: ecshop一处验证码绕过逻辑漏洞

相关厂商: ShopEx

漏洞作者: 路人甲

提交时间: 2014-12-26 22:02

公开时间: 2015-03-26 22:04

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

危害等级: 低

自评Rank: 5

漏洞状态: 厂商已经确认

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

Tags标签: 第三方不可信程序

0人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-12-26: 细节已通知厂商并且等待厂商处理中
2014-12-28: 厂商已经确认,细节仅向厂商公开
2014-12-31: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2015-02-21: 细节向核心白帽子及相关领域专家公开
2015-03-03: 细节向普通白帽子公开
2015-03-13: 细节向实习白帽子公开
2015-03-26: 细节向公众公开

简要描述:

一处逻辑漏洞导致绕过

详细说明:

虽然验证码进行了加密,但是逻辑上还有点问题

问题出在

..\includes\cls_captcha.php

通过验证函数可以看到直接返回,并没有对验证失败进行处理

code 区域
function check_word($word)
{
$recorded = isset($_SESSION[$this->session_word]) ? base64_decode($_SESSION[$this->session_word]) : '';
$given = $this->encrypts_word(strtoupper($word)); //MD5加密处理

return (preg_match("/$given/", $recorded)); //验证规则
}



也就是说如果登陆失败的时候没有对验证码SESSION置空的话,就可以在这次请求中反复尝试进行破解。

下面代码可以看到并没有对验证错误的时候进行处理

..\ecshop\admin\privilege.php

code 区域
if (intval($_CFG['captcha']) & CAPTCHA_ADMIN)
{
include_once(ROOT_PATH . 'includes/cls_captcha.php');

/* 检查验证码是否正确 */
$validator = new captcha();
if (!empty($_POST['captcha']) && !$validator->check_word($_POST['captcha']))
{
sys_msg($_LANG['captcha_error'], 1);
}
}
$_POST['username'] = isset($_POST['username']) ? trim($_POST['username']) : '';
$_POST['password'] = isset($_POST['password']) ? trim($_POST['password']) : '';
$sql="SELECT `ec_salt` FROM ". $ecs->table('admin_user') ."WHERE user_name = '" . $_POST['username']."'";
echo $sql."<br/>";
$ec_salt =$db->getOne($sql);
if(!empty($ec_salt))
{
/* 检查密码是否正确 */
$sql = "SELECT user_id, user_name, password, last_login, action_list, last_login,suppliers_id,ec_salt".
" FROM " . $ecs->table('admin_user') .
" WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5(md5($_POST['password']).$ec_salt) . "'";
}
else
{
/* 检查密码是否正确 */
$sql = "SELECT user_id, user_name, password, last_login, action_list, last_login,suppliers_id,ec_salt".
" FROM " . $ecs->table('admin_user') .
" WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5($_POST['password']) . "'";
}
$row = $db->getRow($sql);

if ($row)
{....}

漏洞证明:

QQ图片20141219215619.png

修复方案:

通过以上代码,可以看出是验证码session没有置空导致的,每次登陆都session(null)就行了;

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2014-12-28 21:15

厂商回复:

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

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评价

登录后才能发表评论,请先 登录