Oracle注入攻击教程
一、核心系统表
三、Oracle 的特点
- 特殊系统表:
- 能查询表信息的系统表:
- 能查询列信息的系统表:
| 用户名/密码 | 登录身份 | 说明 |
| 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 | 复制管理员 |
- 不支持堆叠查询: 可以尝试提交多语句支持符号 “;” ,如果支持多行查询,说明是MSSQL或MySQL,不支持则是 Oracle
- 使用查询语句必须跟上表名,如果没有表则使用 dual 表
- Oracle的数据类型是强匹配的:所以在进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。
- 没有limit语句:所以使用 where rownum=1 语句代替
- 有 user_tables 等其它类型数据库没有的表
- 当前数据库名就是当前用户名,所以 select user from dual 其实就是同时获取数据库名和用户名
- 可用的注释符为:单行注释(--) 和 多行注释(/**/),只有MySQL才支持#注释符
- oracle没有if函数,所以进行布尔盲注时一般使用decode()或者instr()函数,或者使用 case when语句
- 数据库版本: select banner from sys.v_$version where rownum=1
- 当前用户:select user from dual
- 当前环境:select SYS_CONTEXT ('USERENV', 'CURRENT_USER') from dual,其中的 'CURRENT_USER' 可换成其它信息,如以下。
- DNSlog请求外带数据:
- HTTP请求外带数据:
- 报错注入: XMLType()、 dbms_xdb_version.checkin()、 ctxsys.drithsx.sn()、 ordsys.ord_dicom.getmappingxpath()、 dbms_utility.sqlid_to_sqlhash()
- 布尔盲注: substr()、decode()、 case、 ascii()、 instr()、chr()
- 时间盲注: DBMS_PIPE.RECEIVE_MESSAGE() 或者 decode()与高耗时SQL操作的组合(如: select count(*) from all_objects )
- 判断是否有注入点
- 判断数据库是否为oracle
- 获取基本信息
- 判断列数
- 获取当前数据库表的个数: and (select count(table_name) from user_tables)>1--
- 获取第一个表名(以此类推):
- 获取第一个表的第一个字段名(以此类推)
- 读取数据
- 获取当前数据库的表数量:
- 获取第一个表的表名长度:
- 获取表的第一个ascii码的值:
- decode函数:
- instr函数:
- DBMS_PIPE.RECEIVE_MESSAGE()函数
- decode()函数结合耗时操作
- XMLType
- dbms_xdb_version.checkin()
- dbms_xdb_version.makeversioned()
- dbms_xdb_version.uncheckout()
- ctxsys.drithsx.sn()
- ordsys.ord_dicom.getmappingxpath()
- dbms_utility.sqlid_to_sqlhash()
- utl_inaddr.get_host_name()