在我们上一笔记中,我们作出了一次最基础的UNION注入,我们需要用UNION注入来获取一些更有用的信息。

information_schema

在mysql中,存在系统自带的一个数据库,包含了所有mysql数据库的简要信息——information_schema

其中包括了两个表——table表名集合表和columns列名集合表

image-20230406190754005 image-20230406191014074

它们都存在一个TABLE_SCHEMA,来表明他们归属于那个数据库。因此我们在筛选的时候,就可以通过这个方式来筛选出我们注入那个表的。

获取表名与列名

通过这个方法,我们可以构造出一个注入语句

image-20230406192208561

由于表名有很多个,我们只能显示出第一个,这时候就用到了group_concat()

这个函数的作用就是将所有查询结果在一行中显示出来,通过这个函数我们可以新构造一个注入语句

image-20230406192411386

可以得知我们需要的表名为users。

同样的方法,我们可以构造出查询列名,只不过我们需要额外添加一个where条件table_name=users以查询我们需要的表的所有列

image-20230406192938157

至此,我们就拿到了表名和列名

查询最终目标

获取到表明与列名后,我们就可以通过这两个信息拿到我们需要的所有的用户信息了

image-20230406193331534

使用~对用户名和密码进行分割。

总结过程:

  1. 尝试闭合方式:'"
  2. 使用group by二分法判断union语句中前一个查询的列数,使union语句对其上一个查询
  3. 将id改为一个不存在的数字
  4. 查询靶机数据库名database()
  5. 查询数据库表名information_schema tables
  6. 查询表内列名columns
  7. 拿到所有用户名和密码

数字型union注入

数字型联合注入的方式与字符型类似,仅少了一个尝试闭合方式

  1. 使用group by判断union语句中前一个查询的列数

    image-20230406194140404
  2. 将id改为一个不存在的数字

  3. 查询靶机数据库名

    image-20230406194236123
  4. 查询数据库表名

    image-20230406194449093
  5. 查询表内列名

    image-20230406194613953
  6. 拿到所有用户名和密码

    image-20230406194722168