这个Joomla密码重置漏洞如何工作?

时间:2011-05-22 18:05:37

标签: php joomla joomla1.5

我们的一个Joomla网站遭到攻击,攻击者用他丑陋的页面替换了我的模板的index.php - “Hacked”标题和一些红色的阿拉伯语线。 显然,攻击者有些人如何重置用户表中的第一个用户的密码(以及电子邮件地址),这是超级用户,并获得了对管理面板的访问权。

在快速恢复之后,我搜索网以防止未来的黑客攻击并发现这篇文章:Security News-[20080801] - Core - Password Remind Functionality

我把那篇文章中的代码修补了我的reset.php

但我仍然怀疑。 文章没有说明漏洞利用如何真正起作用。 但我在互联网上读到了一些内容,这是reset.php中的SQL注入漏洞

执行SQL以检查令牌的行:

$db->setQuery('SELECT id FROM #__users
                         WHERE block = 0
                           AND activation = '.$db->Quote($token));

正在使用JDatabase :: Quote()方法。那么一些SQL注入如何成为可能。是不是引用应该阻止SQLi? 被攻击网站的Joomla版本是1.5.18。

另一个疑问是补丁检查只是为了验证字符串长度为32.它怎么能阻止利用。

我想知道SQLi是否真的可以传递Quote方法然后不会超过32的字符串长度来绕过WHERE子句吗?

    if(strlen($token) != 32) {
        $this->setError(JText::_('INVALID_TOKEN'));
        return false;
    }

1 个答案:

答案 0 :(得分:4)

问题是令牌值根本没有验证,只是从非字母数字字符清除。而exploit只是输入一个被过滤掉的',以便有效令牌值为空字符串,结果如下:

SELECT id FROM #__users WHERE block = 0 AND activation = ""