我们的一个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;
}
答案 0 :(得分:4)
问题是令牌值根本没有验证,只是从非字母数字字符清除。而exploit只是输入一个被过滤掉的'
,以便有效令牌值为空字符串,结果如下:
SELECT id FROM #__users WHERE block = 0 AND activation = ""