为什么这个sql是正确的? (sql注入)

时间:2017-03-07 18:41:17

标签: mysql sql sql-injection

这是什么意思?

SELECT * from users where password = ''*'';

如果我在mysql workbench中检查这个,我只得到一行,尽管表中有很多用户。

这究竟选择了什么?

3 个答案:

答案 0 :(得分:6)

有趣的问题。让我们看看''*''做了什么。

mysql> select ''*'';
+-------+
| ''*'' |
+-------+
|     0 |
+-------+

让我们创建一些用户:

mysql> select * from users;
+------+-------+
| id   | name  |
+------+-------+
|    1 | joe   |
|    2 | moe   |
|    3 | shmoe |
|    4 | 4four |
+------+-------+

测试我们的查询:

mysql> select * from users where name = ''*'';
+------+-------+
| id   | name  |
+------+-------+
|    1 | joe   |
|    2 | moe   |
|    3 | shmoe |
+------+-------+

有趣的是,用户4未被选中!但是让我们这样试试:

mysql> select * from users where name = 4;
+------+-------+
| id   | name  |
+------+-------+
|    4 | 4four |
+------+-------+

那么,我们可以从中扣除什么呢?

  1. ''*''不知何故意味着0(我对mysql字符串运算符不是那么流利,所以让我们把它当成事实);
  2. 在这种情况下,MySQL显然会进行类型转换。因此,如果您针对整数查询varchar列,它会尝试将这些字符串转换为整数并查看它是否匹配;
  3. 您只有一行password以0开头或非数字。

答案 1 :(得分:5)

  1. 您始终可以在SQL中使用表达式。就像SELECT 5-4 AS one一样得到1.所以你可以说这是一个表达式。
  2. MySQL是一种松散类型的语言,所以它可以繁殖字符串。将它们转换为数字。由于'' * ''
  3. 而让你为零
  4. 将字符串与数字进行比较时,MySQL会将两者都转换为数字。所以0 ='name'条件会让你真实

答案 2 :(得分:4)

''*''是一个乘法:它的两个参数(空字符串)被转换为数字(即0),结果为0.然后,等式的左边也被转换为数字,这将是有时为零(当密码不能被评估为非零数字时),有时不是。

这有点模糊,您可以问自己这是针对您的情况还是意外行为,而实际意图是测试'*'。意图不好的用户可能已输入'*'作为密码,希望您没有受到SQL注入保护,以便在没有有效密码的情况下进入系统。