2012-11-29 24 views
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查询,因为这可能会出现的漏洞。

有什么想法?

+2

也许这更适合http://security.stackexchange.com/ –

+0

不要使用md5,请使用某些版本的sha。 – imreal

+0

是的,没有逃跑是一个大问题。比'mysql_real_escape_string'好的是准备好的语句和参数化查询。 [这是开始这个​​主题的好地方](http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection)。 –

回答

0

问题可能在于,您使用md5散列密码,而这种密码很容易发生冲突并且已经过时。如果他们有散列的密码,他们可以找到一个产生相同散列的字符串,即使它不是您的实际密码。

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

+0

谢谢。我会试试这个。我是一名安全新手。 –

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

如果这个^真的是您的实际选择语句,那就尖叫SQL注入。这不可能比这更容易。虽然你似乎不太惊讶他们得到你的散列,所以我会假设你的问题的根源是关于他们如何进入你的网站使用除散列之外的任何东西。

有几个选择这里:

  • 彩虹表
  • 在数据库中创建了自理的新用户(SQL注入,记不清了)
  • 改变哈希(SQL注入)
  • 简单的离线蛮力或字典攻击
  • 恶意代码重写(不太可能,因为你已经仔细阅读了代码)
  • 可能涉及XSS或会话劫持的其他可能性(您是否清理了输入数据?你会保护你的会话吗?)

请随便选择。一旦黑客拥有如SQL注入这样的不错的立足点,许多新的攻击媒介就会开放。

此外,我不得不怀疑 - 上帝的绿色地球是什么这个黑客认为他们的错误发生在facebook上?这是朋友还是什么?如果是这样,也许你应该问他们他们是如何做到的。如果不是,我真的需要说这个...你有你的家伙/加仑 - 正义时间。

+0

+ 1为自己在数据库中创建一个新的用户(sql注入,记住)和更改散列(SQL注入) – tomdemuyt

+0

但是,不是mysql_query()防止SQL注入? 不,黑客是一个只针对网站并发现漏洞的组织。他们有一个Facebook页面。现在,我怎么知道只是一个Facebook页面?正义时间的一部分。 –

+0

@NitroChummy是的......但是如果你已经被黑客攻击,这并没有什么帮助* –

1

这与您的实际密码无关。只有SQL injection vulnerability可以被利用来获得访问权。我会告诉你如何。

假设你联系表只有两列,所有你需要的是注入username和适合提供密码的密码散列UNION:

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

这里所提供的用户名在制作这种方式完全符合注入发生的环境条件。这将是结果查询:

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

的结果集将与注入的用户名和Admin MD5哈希5ebe2294ecd0e0f08eab7690d2a6ee69一条记录。

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

+0

DAMN !!!! mysql_real_escape_string会阻止现在正确的?他们如何检索我保存的散列密码? –

+0

@NitroChummy是的,它会阻止它。正如已经说过的那样,他们不需要你的实际密码,因为他们可以提供他们自己的密码哈希值,以便对给定的密码进行测试。但是,如果他们得到了它,使用SQL注入可以做很多事情,即使您的脚本行为不同,无论您输入的是有效用户名还是无效用户名,都可以盲目地阅读数据。你一定要检查你的日志,看看是否有任何异常。 – Gumbo

+0

好的。谢谢! –