文章目錄

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 这个判断是成立的。如果判断逻辑写成==,那么就可以继续任意帐号登录了。

文章目錄