ecshop前台任意用户登录漏洞分析记录
文章目錄
ecshop前台任意用户登录漏洞分析记录
漏洞详情参考:http://www.wooyun.org/bugs/wooyun-2014-063655
这里比较坑的是ecshop的架构设计不是很好。不同页面的登录使用了不同的登录逻辑,虽然都是复制粘贴的,但是没有复制全,导致存在问题。
根据乌云的漏洞详情,看到是由于采用了check_user函数,这个函数有个这样一段逻辑:
if ($password === null)
{
$sql = "SELECT " . $this->field_id .
" FROM " . $this->table($this->user_table).
" WHERE " . $this->field_name . "='" . $post_username . "'";
return $this->db->getOne($sql);
如果$password===null,直接返回查询对应用户名的结果。既验证通过了。导致提交的时候去掉password变量,$password没有赋值,$password===null判断为真。
而官方的修复方式是验证之前加了一个判断:
$_POST['password']=isset($_POST['password']) ? trim($_POST['password']) : '';
如果$_POST[‘password’]没设置,让$_POST[‘password’]的值为空字符串’’。这个逻辑个人感觉略坑。既然是验证登录,而没有发送密码直接返回错误信息不就可以了么。干嘛还要进入后续的逻辑。
当然这里的修复是没有问题的。但是如果
if ($password === null)
{
$sql = "SELECT " . $this->field_id .
" FROM " . $this->table($this->user_table).
" WHERE " . $this->field_name . "='" . $post_username . "'";
变成
if ($password == null)
{
$sql = "SELECT " . $this->field_id .
" FROM " . $this->table($this->user_table).
" WHERE " . $this->field_name . "='" . $post_username . "'";
===变成==就会存在问题了。因为在php里,==判断只判断值,并且会先进行强制性懂得类型转换。转换成统一数据类型进行比较。所以’’==null 这个判断是成立的。如果判断逻辑写成==,那么就可以继续任意帐号登录了。