sql注入,关于id=‘1 and 1=1‘

Source

在做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的话,就不会发生这种情况,输入了什么就会被原样转述。