SQL注入-联合查询(union)注入

联合查询介绍

联合查询语句:

1
select a from b union select c from d where e;

使用条件:页面对查询语句有回显查询数据

注意事项

  • 使用联合查询注入时,位于union前的语句不要出现查询的结果(后端只选择查询结果第一行的情况,若前一部分可以被查询,则联合查询的部分不会回显)

  • 若前部分有结果,可在每次的union查询后添加语句limit n,1(n根据题目实际进行切换)起到回显联合查询结果的作用

    注:limit num1,num2的作用为从第num1行开始显示num2行内容

所需函数

1.concat()函数

concat()函数:将多个不同字段的字符串连接成一个字符串。

1
concat(str1,str2) #语法

注意:返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

2.group_concat()函数

group_concat() 将多个同个字段的字符串连接成一个字符串。

1
group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc] [separator ‘分隔符’]) #语法

注入流程

  1. 判断类型

    链接:SQL注入-基础 | WELLS Blog

  2. 字段数

    联合查询(union),必选保证union前后两个查询的字段数一致,即两个查询结果有相同的列数,因此要对前一个的字段数进行判断。可以使用order by 数字进行判断

    order by n表示查询结果通过第n个字段进行排序

    使用示例:

    1
    id=1' order by 1 --+

    使用时不断增大数字,假设直至第n个出现错误,从而判断出字段数为n-1

  3. 回显点

    知道字段数之后,我们还需要确定在哪个字段是回显到页面上的

    直接根据字段数,联合查询数字1,2,3...,以三个字段数为例

    1
    id=1' order by union select 1,2,3 --+

    从页面上查找回显的是哪个数字

  4. 爆库名、表名,字段名,数据

​ 使用union语句在回显位置导出数据库中的数据,结合SQL注入-基础 | WELLS Blog中的SQL注入常用基础语句

以2位置为回显点,爆表名为例

1
id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+