设为首页收藏本站优领域

优领域

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
优领域 优领域 IT领域 数据库 Oracle 查看内容

基于Oracle web环境漏洞攻击与防护技术

2014-5-21 09:54| 发布者: dzly| 查看: 685| 评论: 0|原作者: 唐 林

摘要: 本文从概念、原理以及日常生活中的运用对Oracle web 环境注射技术进行阐述,从一个web 安全的角度来 看如何入侵一台被防火墙防护的Oracle 数据库,对一些入侵技术做了web 入侵上的总结和延伸。尽量展现一些SQL 注射入 侵的思路以及如何利用数据库的一些特性,在web 上做最大的入侵与防护。
  1 Oracle 简单介绍
  Oracle 作为一款比较早期出现的RDBMS 数据库,市场占有率比较大,经常用在一些大型数据库上。它本身除了很好地支持各种SQL 语句外,还提供了各种丰富的包,存储过程,甚至支持java 和创建library 等特性,如此强大的功能为Hacking提供了很好的便利。
  Oracle 自身有很多默认的帐户,并且有很多的存储过程,这些存储过程是由系统建立的,很多默认都是对public 开放的,在过去的几年里公布了很多oracle 的漏洞,包括溢出和SQL 注射在内的许多漏洞。在这里面,SQL 注射漏洞显得格外严重,因为在Oracle 里, 在不加其他关键字AUTHIDCURRENT_USER 的情况下,创建的存储过程在运行时是以创建者身份运行的,而public 对这些存储过程都有权限调用,所以一旦自带存储过程存在注射的话,很容易让普通用户提升到Oracle 系统权限。Oracle 本身内置了很多的帐户,其中一些帐户都有默认的密码并且具有CONNECT的权限,这样如果oralce的端口没有受到防火墙的保护又可以被人远程连接的话,就可以被人利用默认帐户远程登陆进系统然后利用系统里的存储过程的SQL 注射漏洞,系统就会沦陷,当然,登陆进oracle 还需要sid,不过这也并不困难,oracle 的tnslintener 默认没有设置密码,完全可以用tnscmd.pl 用services 命令查出系统的sid,这也是非常经典的入侵oracle 的方式。
  2 Oracle Web Hacking 技术背景
  oracle 丰富的系统表。oracle 几乎所有的信息都存储系统表里,当前数据库运行的状态,当前用户的信息,当前数据库的信息,用户所能访问的数据库和表的信息......系统表就是整个数据库的核心部分,通过恰当地查询需要的系统表,几乎可以获得所有的信息。如sys.v_$option 就包含了当前数据库的一些信息,如是否支持java 等,all_tables 里就包含了所有的表信息,all_tab_colmuns 包含所有的列信息等等,为我们获得信息提供了非常大的便利,后面将有关于如何利用系统表获取敏感信息的描述。
  在oracle 的各种漏洞里,需要特别说下存储过程的注射,存储过程和函数一样是接受用户的输入然后送到数据库服务器解析执行,如果是采取的组装成SQL 字符串的形式执行的话,就很容易将数据和命令混淆,导致SQL 注射。但是根据注射发生的点不同,一样地注射漏洞的性质也不同。Oracle 使用的是PL/SQL,漏洞发生在select 等DML 语句的,因为不支持多语句的执行,所以如果想运行自己的语句如GRANT DBA TOLOVEHSELL 这些DDL 语句的话,就必须创建自己的函数或存储过程,如果没有这相关的权限还可以利用cursor 注射,用dbms_sql 包来饶过限制。大多数的注射正是上面这些有限制的注射,必须依靠自己创建的一些其他包或者cursor 来实现提升权限的目的,但是还是有些非常少见但是注射环境非常宽松的漏洞,就是用户的输入被放在begin 和end 之间的匿名pl/sql块的注射,这种环境下的注射可以直接注射进多语句,几乎没有任何限制。
  3 Oracle Web Hacking 基本思路
  如何确定目标,主要是如何判断数据库属于oracle,根据数据库的特性很容易判断出来,oracle 支持--类型注释,但是不支持;分隔执行多语句,oracle 有很多系统表,譬如all_tables,通过对这些表的访问也可以判断出是否属于oracle,另在oracle里的一些函数也可以用来判断,譬如utl_http.request 这些,语言上的小细节也可以用来区分系统,譬如在oracle 里||是连接符号,但是在其他数据库里就不是,所以 and chr(123)||chr(123)=chr(123)||chr(123)这样的,如果可以顺利执行,那么就基本应该是oracle 了,另外,一些脚本在出现数据库查询错误时,对错误信息没有处理,也会泄露真实的后台数据库,这个可以很明显地看出来。
  然后需要确定的是注射点的类型,一般的情况下,我们进入的参数不是数字类型就基本是字符类型,对于数字类型的基本不用考虑什么,很容易添加--注释字符就可以让语句正确闭合了,如果是字符类型的就要考虑如何让整个语句正确,通常是添加'以及--这些注射字符来构造自己的注射环境。在一些复杂的情况下,如同一个参数在多个sql 语句和逻辑里出现,就要自己小心构造出符合环境的注射语句了。
  在确定目标数据库为Oracle 并且可以注射的时候,就可以开始尝试构造语句了。一般首先要进行的是判断当前的权限,在Oracle 数据库里权限比较高的是DBA 权限,拥有Oracle 数据库的所有权限,另外如果当前用户的权限授予不对的话,也可以实现跨库查询的效果,可以通过对dba_tables 这样的dba的表进行尝试访问来测试是否是dba。在一般的注射中,分为select 类型注射,insert 类型注射以及update 类型等。update 和insert 类型的注射可以根据上下文来更改数据库中的数据,如利用update 注射将表中某个重要字段更改成我们想要的值,即使这些数据库无关紧要也没关系,我们可以利用select 子语句来将我们需要的数据查询出来然后在另外某个地方将这个数据读出来,只要遵循数据库的语法,实现自己的目的就可以了。在这里主要说下select 类型的注射,如果我们能控制select 语句的一部分的话,就可能实现这种类型注射,如果查询的结果可以返回到页面中的时候,还可以尝试使用union 查询出结果,直接将内容显示在页面当中,这是最方便的一种。事实上后面可以看到,无论是什么注射,在oracle 的web 环境下,都可以直接执行系统命令返回shell。
  Oracle 中获得敏感数据,首先就是oracle 有系统表,任何有权限获得数据都可以从这里获得,关键的系统表有all_tables,all_objects 等,都是有权限能访问的,包括别人赋予你权限的,所以如果你的权限是dba 的话,这能看到系统中所有的表,注射中一个技巧就是如果你需要从后台登陆但是不知道密码就可以在这里使用了,譬如猜测列名含不含有password 等方法。
  4 关于防护
  首先就是尽量有好的编程习惯,避免使用字符串连接的方式来执行Sql 语句,如果一定要采用字符串连接方式来执行Sql,那也对进入的参数必须做好过滤,是数字类型的话就强制为数字,是字符串类型的就要做好过滤,从数据库等其他途径过来的数据也必须做好验证,在web app 上杜绝Sql 注射漏洞。另外在Oracle 方面就是要做好对1521 端口的防火墙过滤,避免被人直接登陆,对一些不需要的包和存储过程可以考虑删除,对一些Sql 注射漏洞也要及时做好补丁,避免数据库的沦陷。
  
  

相关阅读

网站统计|优领域|优领域 ( 粤ICP备12011853号-1 )  

GMT+8, 2019-3-23 23:02 , Processed in 0.039943 second(s), 12 queries .

Copyright © 2008-2014 优领域

回顶部