安全漏洞通过mysql查询,我不太理解


Security breached via a mysql query which I don't quite understand

我一直在做一个传统网站。最近有用户通知我们一个潜在的安全漏洞。

长话短说,当尝试登录并使用'=' 'or'作为密码或用户名时,将执行以下查询:

SELECT * FROM `table-goes-here` WHERE `username` = ''=' 'or'' AND `password` = 'some-hash-goes-here'

该查询将选择该表中的所有内容,并且允许在没有任何实际有效凭据的情况下登录。

我只是维护这个网站,我之前已经和站长谈过这样的安全漏洞,他不听。


我想知道的是这到底是一个有效的查询,它到底是做什么的(最好一步一步,向我解释,就像我是5版本一样)。我的MySQL知识不是最好的。


我很清楚这是一个SQL注入。我知道如何准备报表,但它们显然不在预算中。我只是想知道它到底是做什么的。也就是这一部分。我以前从来没有见过这种语法,谷歌并没有真正的帮助,因为我不知道我到底在找什么。

`username` = ''=' 'or''

问题是你正在跑步

SELECT * FROM table WHERE (username= '' = '') or ('' AND password="");

and (user_username = " = ")求值为true…试着

SELECT  (username= '' = '') FROM table;

and (" and password=")也求值为true…试着

Select ('' AND password="") FROM table;

也求值为true,所以…

我认为它是这样工作的,首先evalusername = ''返回false或0,然后其他部分来了0 = ' '

可以从mysql中看到:https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal

如果将string与0(0)进行比较,则返回1 (true)结果:

SELECT 'blabla' = ''; // returns 0
SELECT 0 = ' '; // returns 1

查询的值基本为true,并返回所有记录。

因此,可能发生的事情是,黑客将以ID首先存储在数据库中的用户身份登录。

当然,它不会将数据库显示给黑客,因为您没有在任何地方回显任何数据库内容,但是只需稍加修改,黑客就可以以任何用户登录,而不仅仅是第一个用户。

阅读以下内容以防止此类攻击如何在PHP中防止SQL注入?

更多信息- http://www.w3schools.com/sql/sql_injection.asp

EDIT-黑客也必须在密码字段中使用类似的技巧,否则它将变为假。