以下查询返回表 tbl_user 中的所有密码,但我不明白为什么会这样。
SELECT password FROM tbl_users WHERE name = 'admin' OR 1=1 -- '
请帮助我理解这部分查询:’admin’ OR 1=1 – ‘
你能介绍其他类似的威胁(网站、书籍等)吗?
原文由 Daniyal Javani 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下查询返回表 tbl_user 中的所有密码,但我不明白为什么会这样。
SELECT password FROM tbl_users WHERE name = 'admin' OR 1=1 -- '
请帮助我理解这部分查询:’admin’ OR 1=1 – ‘
你能介绍其他类似的威胁(网站、书籍等)吗?
原文由 Daniyal Javani 发布,翻译遵循 CC BY-SA 4.0 许可协议
逻辑 OR
的结果如下:
a | b | a OR b
-----------------------
false | false | false
false | true | true
true | false | true
true | true | true
如果其中一个操作数为真,则 a OR b 的结果为真。
1 = 1 evaluates to true
=>
(any expression) OR 1 = 1 evaluates to true
=>
name = 'admin' OR 1 = 1
对表的每一行求值为真
结果:
SELECT password FROM tbl_users WHERE name = 'admin' OR 1=1 -- '
将返回所有用户的密码,而不仅仅是管理员,因为如 PeeHaa 所述
--
是sql注释的开始。
原文由 VMai 发布,翻译遵循 CC BY-SA 3.0 许可协议
5 回答3.3k 阅读✓ 已解决
3 回答3.7k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
5 回答1.4k 阅读
这是一个典型的 SQL 注入。
在我解释的时候看到这个小提琴: SQLfiddle
在此示例中,有 5 个用户被添加到表中。然后运行您的查询。预期结果将是仅返回
admin
用户的密码值。但是,通过添加
1=1
,这是一个真实的陈述,所有密码都会被返回。另一种帮助可视化的方法是添加括号,以便您可以看到所有内容是如何计算的。
因此,我们从用户名为
admin
的表中选择密码。我们还从 1=1 的表中提取密码——这总是正确的。每行都被评估为 true,因此返回所有密码。最后的
-- '
用于注释掉查询的其余部分。通常情况下,(如果
1=1
没有被注入),你会为具有管理员用户名和超级管理员权限的用户提取密码。您现在已将其注释掉,但未执行。这就是可以返回整个密码表的方式。