我一直在创建旧网站。最近,用户告知我们可能存在的安全漏洞。
长话短说,当尝试登录并使用'=' 'or'
作为密码或用户名时,将执行以下查询。
SELECT * FROM `table-goes-here` WHERE `username` = ''=' 'or'' AND `password` = 'some-hash-goes-here'
此查询将选择该表中的所有内容,并允许在没有任何实际有效凭据的情况下登录。
我只是维护网站,我之前已经与业主谈过这些安全漏洞,他不会听。
我想知道的是这究竟是一个有效的查询以及它究竟是做什么的(最好是一步一步地向我解释,就像我' m 5版本)。我的MySQL知识并不是最好的。
我非常清楚这是一个SQL注入。我知道如何准备语句,但它们显然不在预算中。我只是想知道它究竟做了什么。即这一部分。我之前从未见过这种语法,谷歌搜索并没有真正帮助,因为我不知道我究竟在寻找什么。
`username` = ''=' 'or''
答案 0 :(得分:4)
你正在实际运行
SELECT * FROM table WHERE (username= '' = '') or ('' AND password="");
和(user_username =''='')计算结果为true ...尝试
SELECT (username= '' = '') FROM table;
和(''AND password =“”)也评估为true ...尝试
Select ('' AND password="") FROM table;
也评估为true所以...显示所有内容
答案 1 :(得分:1)
我认为它的工作方式是这样的,首先要证明这一点
username = ''
这会返回false或0然后其他部分来
0 = ' '
:https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal
如果将字符串与0(零)进行比较,则返回1(true) 结果:
SELECT 'blabla' = ''; // returns 0
SELECT 0 = ' '; // returns 1
答案 2 :(得分:0)
查询基本上会评估为true并返回所有记录。
所以,会发生的事情是黑客会以ID首先存储在数据库中的用户身份登录。
当然,它不会向黑客显示数据库,因为你不会在任何地方回显任何数据库内容,但只需稍加修改,黑客就可以设法以任何用户身份登录,而不仅仅是第一个用户
阅读以下内容以防止此类攻击How can I prevent SQL injection in PHP?
更多信息 - http://www.w3schools.com/sql/sql_injection.asp
编辑 - 黑客还必须在密码字段中使用类似的技巧,否则它会变错。