浅谈oracle web环境注射技术

上传人:子 文档编号:47209629 上传时间:2018-06-30 格式:PDF 页数:11 大小:264.59KB
返回 下载 相关 举报
浅谈oracle web环境注射技术_第1页
第1页 / 共11页
浅谈oracle web环境注射技术_第2页
第2页 / 共11页
浅谈oracle web环境注射技术_第3页
第3页 / 共11页
浅谈oracle web环境注射技术_第4页
第4页 / 共11页
浅谈oracle web环境注射技术_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《浅谈oracle web环境注射技术》由会员分享,可在线阅读,更多相关《浅谈oracle web环境注射技术(11页珍藏版)》请在金锄头文库上搜索。

1、一一 OracleOracle 简单介绍简单介绍 Oracle作为一款比较早期出现的 RDBMS 数据库,市场占有率比较大,经常用 在一些大型数据库上。它本身除了很好地支持各种 SQL 语句外,还提供了各种丰 富的包,存储过程,甚至支持 java 和创建 library 等特性,如此强大的功能为 Hacking 提供了很好的便利。 Oracle 自身有很多默认的帐户,并且有很多的存储过程,这些存储过程是由 系统建立的, 很多默认都是对 public开放的, 在过去的几年里公布了很多 oracle 的漏洞,包括溢出和 SQL 注射在内的许多漏洞。在这里面,SQL 注射漏洞显得格 外严重, 因为在

2、 Oracle 里, 在不加其他关键字 AUTHID CURRENT_USER 的情况下, 创建的存储过程在运行时是以创建者身份运行的,而 public 对这些存储过程都 有权限调用,所以一旦自带存储过程存在注射的话,很容易让普通用户提升到 Oracle 系统权限。Oracle 本身内置了很多的帐户,其中一些帐户都有默认的密 码并且具有 CONNECT 的权限,这样如果 oralce 的端口没有受到防火墙的保护又 可以被人远程连接的话, 就可以被人利用默认帐户远程登陆进系统然后利用系统 里的存储过程的 SQL 注射漏洞, 系统就会沦陷, 当然, 登陆进 oracle 还需要 sid, 不过这也

3、并不困难,oracle 的 tnslintener 默认没有设置密码,完全可以用 tnscmd.pl 用 services 命令查出系统的 sid(到比较新的版本,这个漏洞已经被 修复了),这也是非常经典的入侵 oracle 的方式。 二二 Oracle Web Hacking Oracle Web Hacking 技术背景技术背景 oracle 丰富的系统表。oracle 几乎所有的信息都存储系统表里,当前数据 库运行的状态,当前用户的信息,当前数据库的信息,用户所能访问的数据库和 表的信息.系统表就是整个数据库的核心部分, 通过恰当地查询需要的系统 表, 几乎可以获得所有的信息。如 sys

4、.v_$option 就包含了当前数据库的一些信 息, 如是否支持java 等, all_tables里就包含了所有的表信息, all_tab_colmuns 包含所有的列信息等等,为我们获得信息提供了非常大的便利,后面将有关于如 何利用系统表获取敏感信息的描述。 在 oracle 的各种漏洞里,需要特别说下存储过程的注射,其实也并没有什 么神秘,存储过程和函数一样是接受用户的输入然后送到数据库服务器解析执行, 如果是采取的组装成 SQL 字符串的形式执行的话,就很容易将数据和命令混淆, 导致 SQL 注射。但是根据注射发生的点不同,一样地注射漏洞的性质也不同。 Oracle 使用的是 PL/

5、SQL,漏洞发生在 select 等 DML 语句的,因为不支持多语句 的执行,所以如果想运行自己的语句如 GRANT DBA TO LOVEHSELL 这些 DDL 语句 的话,就必须创建自己的函数或存储过程,如果没有这相关的权限还可以利用 cursor 注射,用 dbms_sql 包来饶过限制。大多数的注射正是上面这些有限制的 注射,必须依靠自己创建的一些其他包或者 cursor 来实现提升权限的目的,但 是还是有些非常少见但是注射环境非常宽松的漏洞,就是用户的输入被放在 begin 和 end 之间的匿名 pl/sql 块的注射,这种环境下的注射可以直接注射进 多语句,几乎没有任何限制,

6、而可以看到,正是这种闪光的漏洞为我们的 web 注射技术带来了怎样的辉煌。 好了,上面谈到的都是 Oracle 的一些攻击技术,但是现在很多的环境是, 对外开放 web 服务,后台数据库被防火墙保护着,无法得到数据库的太多详细信 息, 已经不能直接登陆进数据库进行操作,这个时候就要考虑利用 web 下的漏洞 来攻击后台的数据库了。现在来看下如何进行 Oracle web 环境下注射吧!oracle 可以在各种 web 环境下良好地工作, 各种 web 环境对我们注射的影响也并不是很 大,在 asp,.net,jsp 中对进入的参数基本没做任何过滤,但是由于.net,jsp 语言是强类型语言,

7、在数字类型的注射上即使 sql 语句没有做过滤但是可能在接 受参数的时候就出错了,所以注射出现在字符串类型的参数上比较多一些。在 php 环境下,所有的会被转义为,在 oracle 环境里并不会成为转义(在 oracle 环境里的正确转义应该为),但是在我们自己的注射语句里使用会因 为被转成而遭到破坏,所以在注射时不能使用。除此之外,web 环境下就没 什么限制了。在数据库方面,如果语句采取的是参数的方式执行,也不能够被注 射,除非使用的是字符串连接的方式(由于字符串连接的方式比较简单,也因为 一些历史上的原因,很多程序员往往会偏向于这种方式,),字符串连接方式的 话也会分为两种,参数在 se

8、lect,update,insert 这些 DML 语句之间,与参数 在 pl/sql 匿名块之间,如果 web 程序没有捕获错误,那么我们很容易根据错误 判断出当前语句的类型,后面会提到。在 pl/sql 匿名块之间的比较少见,但也 不排除,这样的注射基本也是没有什么限制的,可以执行多语句,做任何事,跟 本地登陆没有任何区别。 三三 Oracle Web Hacking Oracle Web Hacking 基本思路基本思路 下面说说如何确定目标,注射参数的确定就由大家自己来了,主要是如何判 断数据库属于 oracle,根据数据库的特性很容易判断出来,oracle 支持-类型 注释, 但是不

9、支持; 分隔执行多语句, oracle 有很多系统表, 譬如 all_tables, 通过对这些表的访问也可以判断出是否属于 oracle,另外在 oracle 里的一些函 数也可以用来判断,譬如 utl_http.request 这些,语言上的小细节也可以用来 区分系统,譬如在 oracle 里|是连接符号,但是在其他数据库里就不是了,所 以 and chr(123)|chr(123)=chr(123)|chr(123)这样的,如果可以顺利执行, 那么就基本应该是 oracle 了,另外,一些脚本在出现数据库查询错误时,对错 误信息没有处理,也会泄露真实的后台数据库,这个可以很明显地看出来。

10、 然后需要确定的是注射点的类型,一般的情况下,我们进入的参数不是数字 类型就基本是字符类型(其他很多人所说的搜索型注射其实还是应该归结于字符 类型的),对于数字类型的基本不用考虑什么,很容易添加-注释字符就可以让 语句正确闭合了,如果是字符类型的就要考虑如何让整个语句正确,通常是添加 以及-这些注射字符来构造自己的注射环境。在一些复杂的情况下,如同一个 参数在多个 sql 语句和逻辑里出现, 就要自己小心构造出符合环境的注射语句了, 记住,我们只需要一个能便利插入自己 sql 命令的完好环境:) 在确定目标数据库为 Oracle 并且可以注射的时候, 就可以开始尝试构造语句了。 一般首先要进行

11、的是判断当前的权限,在 Oracle 数据库里权限比较高的是 DBA 权限, 拥有 Oracle 数据库的所有权限, 另外如果当前用户的权限授予不对的话, 也可以实现跨库查询的效果,可以通过对 dba_tables 这样的 dba 的表进行尝试 访问来测试是否是 dba。在一般的注射中,分为 select 类型注射,insert 类型注射以及 update 类型等。update 和 insert 类型的注射可以根据上下文来更改 数据库中的数据, 如利用 update 注射将表中某个重要字段更改成我们想要的值, 即使这些数据库无关紧要也没关系,我们可以利用 select 子语句来将我们需要 的数

12、据查询出来然后在另外某个地方将这个数据读出来, 只要遵循数据库的语法, 实现自己的目的就可以了。在这里主要说下 select 类型的注射,如果我们能控 制 select 语句的一部分的话,就可能实现这种类型注射,如果查询的结果可以 返回到页面中的时候,还可以尝试使用 union 查询出结果,直接将内容显示在页 面当中,这是最方便的一种。事实上后面可以看到,无论是什么注射,在 oracle 的 web 环境下,都可以直接执行系统命令返回 shell。 Oracle 中获得敏感数据,首先就是 oracle 有系统表,任何有权限获得数据 都可以从这里获得,关键的系统表有 all_tables,all

13、_objects 等,都是有权限 能访问的,包括别人赋予你权限的,所以如果你的权限是 dba 的话,这能看到系 统中所有的表, 注射中一个技巧就是如果你需要从后台登陆但是不知道密码就可 以在这里使用了,譬如猜测列名含不含有 password 等方法,后面的例子中也有 讲述。 另外比较需要了解的就是 union 查询,在 oracle union 查询中和其他数据 库类似,要求列数一样,还要求类型完全一致,oracle 类型有很多,常见的有 字符类型,数字类型以及日期类型等等,一般我们能用来做 union 查询并且显示 的是字符类型,所以需要精确定位哪个字段符合我们的要求(1 会在页面显示, 数

14、据从进入到出来会有很多的流程,很多数据会在中间经过多次的处理,所以要 想找到能显示出来的数据,很多时候并不是那么顺利,这种显示包括很多地方, 包括返回的 http 头,页面正文甚至是 cookie 等。 2 字符类型 因为我们出来的 数据大部分都是字符类型,所以需要这个类型用来正确地匹配 3 长度需要足够 尽管我们可以用一些字符函数来解决这个问题, 但是够长的字段总是非常简便 ), oracle 并不会自己做数据类型转换,但是 oracle 中提供了一个 NULL 类型,可 以匹配所有的数据类型, 所以我们在定位完字段数之后就可以在 union 的各个字 段填写 null 来匹配, 另外 or

15、acle 不支持 select 1 这样的查询, 语法要求 select 必须有关键字, 如果我们没有表可以用, 可以用系统中默认谁都有权限的表 dual。 关于定位字段数其实也比较简单,和其他数据库一样可以利用 order by 1- 这 样操作,如果字段个数存在就会正常,通常页面的逻辑会让这个参数 不只在一 个地方出现,所以 order by 地方不一致,所以不能进行 union 查询。在这里可 能会遇到目标语言不支持的情况, 所以可以使用 chr 这些函数来处理这些问题。 即使不支持 union, oracle 的一些特性还是让我们轻易拿到想要的信息,就 是用系统的 utl_http.r

16、equest 包,这个包你可以看做是一个普通的函数,用来 取得远方 web服务器的请求信息,所以我们完全可以自己监听端口,然后通过这 个函数用请求将需要的数据发送过来, 这个时候我们还可以用来查看数据库可不 可以上网以及出口 IP,是个非常重要的一点。正是有了这些系统里丰富的包和 函数以及存储过程,使得只要有一个注射点,就可以在 oracle 里做任何事情, 包括权限允许的和权限不允许的,记住,是任何事。 敏感数据只是我们想要的一部分,通常直接杀入 oracle 可能更有吸引力, 这个时候查看系统的信息就非常地有价值了,对注射的灵活运用也非常重要。oracle 在启动之后,把系统要用的一些变量都放置到一些特定的视图当中,可 以利用这些视图获得想要的东西。通常非常重要的信息有 1 当前用户权限 (select * from session_roles) 2 当前数据库版本 (select banner from sys.v_$version where rownum=1) 3 服务器出口 IP (用 utl_http.re

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号