Dan*_*yal 5 php mysql security sql-injection cracking
以下查询返回表tbl_user中的所有密码,但我无法理解为什么会发生这种情况.
SELECT password FROM tbl_users WHERE name = 'admin' OR 1=1 -- '
Run Code Online (Sandbox Code Playgroud)
请帮我理解这部分查询:'admin'OR 1 = 1 - '
你能介绍一下这样的其他威胁(网站,书籍等)吗?
这是一个经典的SQL注入.
在我解释它的时候看到这个小提琴:SQLfiddle
在此示例中,有5个用户被添加到表中.然后运行您的查询.预期的结果是仅返回admin用户的密码值.
但是,通过添加1=1,这是一个真实的语句,将返回所有密码.
另一种帮助可视化的方法是添加括号,以便您可以看到如何评估所有内容.
SELECT pass FROM users WHERE (user_name = 'admin') OR (1=1) -- '
^ Pulls only the admin user ^ Pulls everything because 1=1
Run Code Online (Sandbox Code Playgroud)
因此,我们从用户名所在的表中选择密码admin.我们也在从1 = 1的表中提取密码 - 这总是正确的.每行评估为true,因此返回所有密码.
最后-- '一个用于注释掉查询的其余部分.
SELECT pass from users WHERE user_name = 'admin' or (1=1) -- 'and permission='superadmin'
Run Code Online (Sandbox Code Playgroud)
通常,(如果1=1没有注入),您将使用user_name的admin和superadmin权限为用户提取密码.你现在已经评论过了,并没有执行.这是整个密码表的返回方式.
逻辑结果OR如下:
a | b | a OR b
-----------------------
false | false | false
false | true | true
true | false | true
true | true | true
Run Code Online (Sandbox Code Playgroud)
如果其中一个操作数为true,则OR b的结果计算结果为true.
1 = 1 evaluates to true
Run Code Online (Sandbox Code Playgroud)
=>
(any expression) OR 1 = 1 evaluates to true
Run Code Online (Sandbox Code Playgroud)
=>
name = 'admin' OR 1 = 1
Run Code Online (Sandbox Code Playgroud)
对于表的每一行,求值为true
结果:
SELECT password FROM tbl_users WHERE name = 'admin' OR 1=1 -- '
Run Code Online (Sandbox Code Playgroud)
将返回所有用户的密码,不仅仅是管理员,因为正如PeeHaa所述
--
Run Code Online (Sandbox Code Playgroud)
是一个SQL注释的开头.