联合查询注入 来自:sechub

1.判断注入点

我们可能存在SQL注入变量的后边添加以下payload:

  • and 1=1 / and 1=2 回显页面不同(整型判断)
  • 单引号判断’显示数据库错误信息或者页面回显不同(整型,字符串类型判断)
  • \ (转义符)
  • -1 / +1 回显下一个或上一个页面 (整型判断)

注:加号’+’在URL中有特殊含义,因此在需要对其进行URL编码为%2b

2.判断是整型注入还是字符型注入

数字型与字符型的最大区别在于:
数字类型不需要引号闭合,而字符类型需要使用引号闭合。

数字型:

select * from table where id = 1;

字符型:

select * from table where username = 'admin';

3.根据不同的分类进行注入

根据SQL注入语法分类:

  • UNION query SQL injection(可联合查询注入)
  • Error-based SQL injection(报错型注入)
  • Boolean-based blind SQL injection(基于布尔型注入)
  • Time-based blind SQL injection(基于时间延迟注入)
  • Stacked queries SQL injection(可多语句查询注入)

3.1 MySQL中UNION使用规则

UNION的作用时间俩个或多个select语句查询结果合并起来

  • UNION必须由俩条或俩条以上的select语句组成,语句之间用UNION分隔
  • UNION中的每个查询的列数必须相同
  • UNION会从查询结果集中自动去除重复行

3.2 判断查询列数

order by 函数是对MySQL中查询结果按照制定字段名进行排序,除了指定字段名还可以指定字段的栏位进行排序,第一个查询字段位1,第二个位2,以此类推,我们可以通过二分猜解列数。
例:

order by 1

order by 20

order by 10

3.3 获取所有数据库名

group_concat()一次性显示:

select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA

limit逐一显示:

select count(SCHEMA_NAME) FROM information_schema.schemata #查询数据库个数
select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1

3.4 获取数据库(test)所有表名

group_concat()一次性显示:

select group_concat(TABLE_NAME) from information_schema.TABLES where table_schema='test';

limi 逐一显示

select count(TABLE_NAME) from information_schema.TABLES where table_schema='test';

select TABLE_NAME from information_schema.SCHEMATA where table_schema='test' limit 0,1

4.联合查询

前提条件:页面上有显示位

什么是显示位?

在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位

5.过程

image.png