在做sql-labs靶场时,学到了,这个知识点很重要,当时发现这个问题困惑了我许久
正常的注入语句:select * from users where id = 1
select * from users where id = '1'也可以查询出和语句一相同的结果
select * from users where id = '$id'
令$id=1"
语句变为select * from users where id = '1"'
此时引号正常闭合,按理说应当是查询users表中,id为1"的所有数据,然后查询不到返回空才对,我一开始是这样想的,但是结果是返回了id=1的结果,
在后面加上了and1=1和and 1=2
语句变为select * from users where id = '1 and 1=1'
select * from users where id = '1 and 1=2'
结果上面两个语句返回相同的结果,而且都返回的是id=1的结果
经过查阅资料得知,数据库中id的数据类型设置为int(数值类型)就会出现这种情况
如果数据库检查到id的参数并不为数值的话,就会发生类型转换(很简单粗暴的类型转换)
比如字符串'1'会被转换为1
比如字符串'1"'会被转换为1
比如'1 and 1=1'会被识别为1
比如'1 and 1=2'会被识别为1
比如'1akbucbdadbaiudadbabdaud'会被识别为1
比如'23adasuasdai32ansoiha'会被识别为23
字符串中数字后面的字符可以是任意的,类型转换时都会被忽略,不会对数值有任何的影响
这个特性在mysql数据库中存在,具体其它数据库中存不存在还不知道
当然,如果数据库中id列的类型设置为varchar的话,就不会发生这种情况,输入了什么就会被原样转述。