我一直在做一个传统网站。最近有用户通知我们一个潜在的安全漏洞。
长话短说,当尝试登录并使用'=' '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-黑客也必须在密码字段中使用类似的技巧,否则它将变为假。