SQL注入,为什么要写0或1 = 1

时间:2017-06-19 11:51:18

标签: security

在SQL注入中,为什么要使用0或1 = 1,这不是在布尔运算中自动计算为1吗?我不明白为什么我们应该这样写。有人可以解释一下吗?

提前致谢

2 个答案:

答案 0 :(得分:4)

因为它使条件始终为真。

例如,如果有人的SQL代码是:

string query = "SELECT * FROM Users WHERE Password = '" + somePassword + "'";

(为简洁起见省略了用户名子句。)

然后你可以输入这样的密码:

' OR 1 = 1;--

哪会产生查询结果:

SELECT * FROM Users WHERE Password = '' OR 1 = 1;--'

分号结束语句,--表示注释,因此忽略其后的所有内容。所以它简化为:

SELECT * FROM Users WHERE Password = '' OR 1 = 1

这将匹配表中的所有记录。总是。因为1 = 1总是如此。根据应用程序处理此响应的方式,您可能已登录。甚至可能是表中的第一个用户,可能是管理员用户。

对于SQL注入代码,它基本上是一个通用密码。 (如果你猜错了正确的用户名,那就不难了。)

修改:我刚刚注意到您问题的0部分。当您希望注入的值要查找数字而不是字符串时,将使用此方法。例如,考虑类似的SQL语句:

string query = "SELECT * FROM Users WHERE Id = " + someID;

注入值中的前导0可防止语法错误。因此得到的查询将是:

SELECT * FROM Users WHERE Id = 0 OR 1 = 1

与上述相同的概念。这将每次匹配所有记录。

答案 1 :(得分:0)

以下是对此的简要说明: -

从新闻中选择标题,文字,其中id = $ id

在上面的例子中,变量$ id包含用户提供的数据,而余数是程序员提供的SQL静态部分;使SQL语句动态化。

由于构造方式,用户可以提供精心设计的输入,尝试使原始SQL语句执行用户选择的进一步操作。下面的示例说明了用户提供的数据“10或1 = 1”,更改了SQL语句的逻辑,修改了添加条件“或1 = 1”的WHERE子句。

从新闻中选择标题,文本,其中id = 10或1 = 1

所以查询仍然会被执行