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

Dan*_*iaN 4 mysql sql sql-injection

这是什么意思?

SELECT * from users where password = ''*'';
Run Code Online (Sandbox Code Playgroud)

如果我在mysql workbench中检查这个,我只得到一行,虽然我在表中有很多用户.

这究竟是什么选择的?

Ser*_*sev 6

有趣的问题.让我们看看是''*''做什么的.

mysql> select ''*'';
+-------+
| ''*'' |
+-------+
|     0 |
+-------+
Run Code Online (Sandbox Code Playgroud)

让我们创建一些用户:

mysql> select * from users;
+------+-------+
| id   | name  |
+------+-------+
|    1 | joe   |
|    2 | moe   |
|    3 | shmoe |
|    4 | 4four |
+------+-------+
Run Code Online (Sandbox Code Playgroud)

并测试我们的查询:

mysql> select * from users where name = ''*'';
+------+-------+
| id   | name  |
+------+-------+
|    1 | joe   |
|    2 | moe   |
|    3 | shmoe |
+------+-------+
Run Code Online (Sandbox Code Playgroud)

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

mysql> select * from users where name = 4;
+------+-------+
| id   | name  |
+------+-------+
|    4 | 4four |
+------+-------+
Run Code Online (Sandbox Code Playgroud)

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

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


You*_*nse 5

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