oracle 中的定时炸弹-k8凯发天生赢家

oracle 中的定时炸弹-触发器漏洞
作者:思成 发布时间:2016-07-21

在oracle数据库中触发器被大量使用,这是因为无论是在功能还是安全性方面触发器相对于oracle数据库本身都有着众多优势。触发器可以实现比数据库自身标准功能更精细、更复杂的数据库控制能力和更便利的数据同步功能。在数据同步方面,触发器可以限制对表的修改、自动派生列、强制数据的一致性等。在强化安全方面,触发器可以在修改数据库数据前对操作用户的权限进行验证、对数据库做操作限制、审计用户操作的数据库语句、实现复杂的数据完整性规则等一系列安全防护措施。
 触发器不仅解决很多功能和安全上的需要,而且使用范围广泛。oracle几乎可以为所有事件创建触发器,其中包括dml操作,如insert、delete和update,而且可以将这些操作设定为事件前或事件后触发。甚至可以为用户登录、用户被删除或表被截断之类的特殊事件定义触发器。

剖其本质触发器是一种由sql语言及其扩展语言编写成的隐式存储过程,它和存储过程唯一不同的是触发器是由一个事件来启动运行的,并不是被用户直接调用的。由于触发器的存储过程是一个隐式的存储过程,所以很多人认为触发器本身无法接受用户的输入,就算有注入漏洞也难以被利用。其实则不然,虽然在注入方面加大了一定的利用难度,但漏洞依旧可以被利用。在oracle的演进过程中有很多著名的触发器漏洞。例如:  sdo_geom_trig_ins1、user_sdo_lrs_metadata、sdo_cmt_cbk_trig、cdc_drop_ctable_before、sdo_drop_user_before等等。触发器的漏洞和触发器本身一样也是由特定事件启动的,触发器中的漏洞犹如oracle中一颗定时炸弹一般,一旦被黑客引爆就可以取得数据库的控制权、从而获取敏感数据、主机操作权限甚至整个内网环境的控制权。

oracle触发器中的漏洞

触发器是由sql及其扩展语言编写而成的,所以安全问题往往也发生在sql代码上。正是因为这一原因,如果想利用触发器中的漏洞入侵数据库,也需要满足sql注入漏洞的3个要素:1.通过触发器是否可以用低权限用户拿到高权限执行权限。2.是否存在sql注入点,可以注入存在恶意代码的参数。3.怎么把恶意变量注入到触发器中。

触发器提供的权限是定义它自身用户的权限,也就是说触发器都是定义者权限。因此具有特殊权限的账号下的触发器被入侵的风险性更大,一但这些触发器存在安全问题,则黑客可能利用这些权限获得整个数据库的控制权。这些高风险账号系统自带的有mdsys、sys、olapsys、dbsnmp、ordsys、ctxsys等。虽然这些账号权限各不相同,但都可以被用来对低权限用户进行一定程度的提权,甚至通过漏洞之间的相互配合拿到dba权限。

有些人认为触发器无法接受直接输出的参数,同时也无法被直接调用,所以触发器漏洞很难被利用。但事实确是触发器虽然无法直接调用,无法直接接受参数,但它可以间接的接受参数。

我们一起看一个简化的例子。图中get_user_password创建了一个恶意函数。其中触发器是由sys用户定义的,在执行触发器的时候会局部获取sys账号的权限。在这一例子中触发器的作用是在表a插入内容的时候,把插入的内容同步到b。用户输入的变量会从表a通过触发器的改写流入表b中。而如果向表a的变量插入恶意语句,这些恶意语句则会被带入到触发器中,被触发器所拥有的高级权限所执行,最终导致数据库被入侵。

20160706-1.jpg

接下来我们一起看下具体的入侵过程:首先我们创建了一个存在恶意语句的函数get_user_password。其中核心语句是 select  password from sys.user$where name ==’’sys’’’;(获取sys用户的密码散列)。由于我们拿到的只是一个低权限用户,虽然创建了这个存在恶意语句的函数,但并不能执行该函数。接下来我们找到一个高权限用户定义的触发器,下面就是想办法把get_user_password传输到触发器中。上文我们已经说过由于触发器是不接受参数的所以无法直接写入参数,但我们可以利用触发器会把表a中插入的输入同步插入到表b中这个原理把恶意代码注入到触发器中。在这一步中由于触发器是高权限用户,则可以对select password from sys.user$where name ==’’sys’’’;进行查询,从而最终用低权限用户获取sys的密码散列,最后通过一定的算法可以把密码散列转换成明文,从而获取sys账号的权限。

以上是一个触发器漏洞最简单的利用过程,当然还有更多更复杂的利用方式,今后安华金和数据库攻防实验室会进一步和大家分享。通过以上实例说明,触发器漏洞绝对是可以被利用的,只是比存储过程或函数中的漏洞更加难以利用,更加难以被发现而已。但实际造成的危害绝不比任何数据库上存在的其他漏洞类型造成的危害小。

oracle触发器漏洞的危害及防护

触发器漏洞造成的危害主要可以分为三个级别:

1.对数据库自身及其数据库中存储的敏感信息造成入侵;
     2.对数据库所在主机及其主机中存在的关键信息造成入侵;
     3.对数据库所在的网络环境及网络中其他信任它的主机造成入侵。

每一个级别都会以上一个级别为依托,从触发器漏洞这一个点逐渐深入,从数据库到本地主机再到入侵整个网络和网络上的主机。

20160706-2.jpg

对于oracle触发器的漏洞防护同样要追本溯源,从源头来治理。所以对于触发器漏洞带来的威胁防护思路主要是拦和改。
 拦,是指通过数据库防火墙等数据库安全产品对访问数据库的会话中存在的恶意字段进行过滤和纠察,使得恶意入侵行为被阻断在数据库防火墙层面,无法到达数据库中。改,则是通过修改传入到数据库中的包的内容去掉其中可能的恶意信息。两种方式的区别在于是否中断整个会话。虽然方式有所不同,但都会达到防止入侵数据库的目的。

最后也是最重要的就是数据库防火墙部署的位置。数据库防火墙必须被部署于数据库前,且保证数据库防火墙是进入数据库的唯一通路。这样才能有效防止入侵者利用其他手绕过数据库防火墙直接访问数据库,从而真正起到对数据库的安全防护作用。

网站地图