0

我最近创建的一个网站遭到黑客攻击和污损。他们进入了一个自制的 CMS 来管理网站。他们能够检索我的用户名和密码的散列版本并将其发布在 Facebook 上。

现在我的问题是,他们是如何使用散列密码进入网站的?他们不需要先解密吗?他们为什么不在他们的 Facebook 帐户上发布密码的解密版本(当我看到许多其他网站张贴在那里并显示他们的人类可读密码时)。

这是我的验证码:

SELECT * FROM Admin WHERE Username = '$_POST[Username]' // This finds the username

if ($row[Password] == md5($_POST[Password])) {
    Save Sessions here
}

尽管我现在已将 mysql_real_escape_string 添加到 SQL 查询中,因为这可能是漏洞。

有什么想法吗?

4

3 回答 3

2
SELECT * FROM Admin WHERE Username = '$_POST[Username]'

如果这个 ^ 真的是你的实际选择语句,那就是 SQL 注入。再简单不过了。尽管您似乎对他们得到您的哈希并不太震惊,但我认为您的问题的根源是他们如何使用哈希进入您的网站。

这里有几个选项:

  • 彩虹桌
  • 在数据库中为自己创建一个新用户(sql注入,切记)
  • 更改哈希(sql 注入)
  • 简单的离线暴力破解或字典攻击
  • 恶意代码重写(不太可能,因为您事后一直在仔细阅读代码)
  • 可能涉及 XSS 或会话劫持的其他可能性(您是否清理输入数据?您是否保护您的会话?)

任你选。一旦黑客有了 SQL 注入这样的良好立足点,就会出现许多新的攻击媒介。

另外,我不得不怀疑——在上帝的绿地上,这个黑客在想把他们的不幸事件发布到 Facebook 上吗?这是朋友还是什么?如果是这样,也许你应该问他们他们是怎么做到的。如果不是……我真的需要这么说吗……你有你的男人/女孩——正义的时间。

于 2012-11-29T02:28:56.110 回答
1

这与您的实际密码无关。只有SQL 注入漏洞可以被利用来获得访问权限。我会告诉你怎么做。

假设您的Admin表只有两列,您只需要一个 UNION 来注入用户名和适合所提供密码的密码哈希:

$_POST['Username'] = "' UNION SELECT 'Admin','5ebe2294ecd0e0f08eab7690d2a6ee69"
$_POST['Password'] = "secret"

此处提供的用户名的制作方式完全符合注入发生的上下文条件。这将是结果查询:

SELECT * FROM Admin WHERE Username = '' UNION SELECT 'Admin','5ebe2294ecd0e0f08eab7690d2a6ee69'

结果集将是带有注入的 usernameAdmin和 MD5 hash的单个记录5ebe2294ecd0e0f08eab7690d2a6ee69

因此,请确保您受到 SQL 注入的保护。

于 2012-11-29T05:58:20.923 回答
0

问题可能是您使用 md5 对密码进行了哈希处理,这很容易发生冲突和过时。如果他们有您的散列密码,他们可以找到一个产生相同散列的字符串,即使它不是您的实际密码。

使用更强大的哈希算法(如 SHA 和盐)来防止彩虹攻击。

于 2012-11-29T02:23:57.137 回答