Oracle身份验证的攻击与防范

时间:2022-08-08 05:30:37

Oracle身份验证的攻击与防范

【 摘 要 】 论文介绍了Oracle身份验证的工作原理和所存在的安全漏洞,总结了针对Oracle身份验证的各种攻击手段,提出了相应的防范措施。

【 关键词 】 Oracle;黑客;身份验证

1 引言

对Oracle身份验证的漏洞进行揭示看上去有一定的危险性,因为这样做把漏洞信息既告诉了防御者也告诉了黑客,但是我们应该清楚地看到,绝大多数黑客已经知道了这些漏洞,而防御者却不知道。所以深入了解Oracle身份验证的原理,对防御者防范黑客的攻击是很有必要的。

2 攻击身份验证过程

2.1 身份验证的工作原理

在尝试登录数据库的时候,客户端首先连接TNS Listener并请求访问数据库服务,如果没有向TNS Listener登记该服务,那么Listener会生成一个错误,如果服务已经被登记过,那么Listener会将客户端重新定向到另一个端口。如果服务器正运行在多线程服务器模式下,那么客户端就不会被重定向,而且所有的通信都是通过Listener端口发生的,这种情况下使用的端口是1521。一旦客户端连接到新的端口,它就会像当初连接到Listener时一样,发送同样的服务请求,在客户端连接到Listener等以后,身份验证过程就开始了。

身份验证是通过客户端向服务器发送自己的用户名完成的。服务器取出这个用户名并检查它是否是一个有效的用户,如果不是有效用户,则服务器就向客户端发送一个“登录被拒绝”的错误;如果用户名确实存在,那么服务器会从数据库中提取该用户密码的散列值。服务器通过调用Orageneric库中的重新获得系统时间的函数slgdt(),将分钟、小时、毫秒和秒(各自占用一个字)结合起来形成一个用来加密的8个字节的“文本”。加密中要使用的密钥的前4个字节代表分钟和小时与用户的十六进制密码散列值的最后4个字节的异或,而密钥的后4个字节是由毫秒和秒与用户的十六进制密码散列值的前4个字节的异或所组成的。

服务器通过调用Oracommon库中的函数Kzsrenc(),可以使用该密钥对文本进行加密。通过使用函数Lncgks(),函数Kzsrenc()基本上完成了DES密钥的生成,而且随后它利用函数Lncecb()输出ECB模式下的DES密文,这里生成的密文就是密码。接着再次调用函数kzsrenc(),利用用户的密码散列值对改密码加密。这样调用的结果就是AUTH_SESSKEY,然后结果被发送给客户端,收到AUTH_SESSKEY之后,客户端必须将其解密并重新获得该密码。用户利用Oracore库中的函数Lncupw()创建自己密码散列值的一个副本,然后通过调用函数Kzsrdec()将该散列值用作对AUTH_SESSKEY进行解密的密钥,从而生成密码,随后通过调用函数Kzsrenp(),这个密码被用作对用户的明文、大小写敏感的密码进行加密的一个密钥,这个函数完成了DES密钥的生成以及在CBC模式下用户密码的加密,然后,密文以AUTH_PASSWORD的形式被送回服务器。

服务器通过调用Oracommon库中的函数Kzsrenc(),利用密钥密码对AUTH_PASSWORD进行解密。现在服务器已经拥有明文密码的一个副本,然后服务器创建密码的散列值并将它与数据库中的散列值进行比较,如果它们是匹配的,那么用户就通过了身份验证。随后,服务器通过核查来确定用户是否具有Create Session的访问权限,如果有,就会允许用户访问数据库服务器。

2.2 攻击密码术

从数据库中获得密码散列值是很容易的,暴力攻击Oracle的密码散列值是可行的,不过密码越长,它花费的时间也就越长。对非常长的密码而言,除了暴力攻击以外,有一种更好的攻击方法可以快速获得明文,如果一个攻击者持有散列值而又想要得到明文,他可以嗅探线路上的AUTH_SESSKEY和AUTH_PASSWORD,然后就可以立即获得明文密码。他用已知的散列值对AUTH_SESSKEY解密来得到密码,然后用密码解密AUTH_PASSWORD,结果就得到了明文。在交换式环境中,对ARP的攻击可能会导致数据在本地线路上被广播,位于客户端和服务器中间某处的主机和网关可能变成一个嗅探器,来获得交换的数据。

2.3 利用默认用户名和密码

Oracle比其它任何软件拥有更多的默认用户名和密码。为了获得通过验证的系统访问权限,用户名和密码是攻击者必须攻破的第一道防线。下面给出了更多的用户名和密码:

SYS/CHANGE_ON_INSTALL

SYSTEM/MANAGER

DBSNMP/DBSNMP

CTXSYS/CTXSYS

MDSYS/MDSYS

SCOTT/TIGER

虽然账户SYS和SYSTEM采用默认密码的情况并不常见,但是常常可以发现智能账户DBSNMP完好地保留着默认密码,如果进行只能工作的话就必须在两个地方修改密码,首先要在数据库中修改密码,其次需要在snmp_rw.ora文件中修改密码。10g版本可以改变这种情况,在安装过程中,会提醒安装者为SYS账户设定一个密码,然后可以为SYSTEM、DBSNMP和SYSMAN账户设定同样的密码。

2.4 在文件中查找密码

尽管在10g版本中密码的情况有所改善,但是风险依然存在,在安装是选择的密码被写入某些文件就是风险之一,例如,在10g Release 1中,SYSMAN的密码以明文的形式被写入$ORACLE_HOME/hostname_sid/sysman/config目录下的emoms.properties文件内;10g Release 2用DES加密密码,但是emoms文件仍然包含解密密钥,因此还是可以重新获得密码:只要把属性emdRepPwd和emdRepPwdSeed输入最近的DES工具,就可以得到明文密码。

另一个可能记录密码的文件是postDBCreation.log。假设在安装过程中安装者选择了一个很难猜的带有感叹号的密码,在设置账户SYSMAN和DBSNMP的密码时,完成该任务的SQL脚本将执行下面的语句:

alter user SYSMAN identified by f00bar!! account unlock

alter user DBSNMP identified by f00bar!! account unlock

由于密码中有感叹号,所以会导致一个错误,随后该错误被记录下来:

ERROR at line 1:

Ora-00922: missing or invalid option

因为账户SYS和SYSTEM的密码设定方式(这种方式是不会导致错误的)与账户SYSMAN和DBSNMP的密码设定方式不同,所以如果有人能够访问这个文件,那么他们就可能发现SYS和SYSTEM的密码。

另一组记录密码的文件是:

$ORACLE_HOME/cfgtoollogs/cfgfw/cfmLogger_install_date.log

$ORACLE_HOME/cfgtoollogs/cfgfw/oracle.assistants.server_install_date.log

$ORACLE_HOME/cfgtoollogs/configToolAllCommands

$ORACLE_HOME/inventory/Components21/oracle.assistants.server/10.2.0.1.0/context.xml

$ORACLE_HOME/inventory/ContentsXML/Config XML/oracle.assistants.server.10_2_0_1_0.CFM.1.inst.xml

$ORACLE_HOME/cfgtoollogs/oui/installActions_install_date.log(Windows only)

其中,install_date指明了安装服务器的日期和时间,但是,这些密码是乱码,不过从这些乱码中恢复出明文密码是很容易的。从这些文件可以恢复出SYS、SYSTEM、SYSMAN和DBSNMP的密码。

安装10g应用程序服务器并查找文件内的字符串,可以发现下面文件也含有相同的方式打乱的密码:

$ORACLE_HOME/inventory/ContentsXML/configtools.xml

$ORACLE_HOME/cfgtoollogs/configtoolsinstalldate.log

$ORACLE_HOME/sysman/emd/targets.xml

$ORACLE_HOME/config/ias.properties

2.5 账户穷举与暴力攻击

当一个用户尝试通过数据库服务器的身份验证时,它会发送一个质询,一个用来加密密码的会话密钥,这只发生在这个账户确实存在而且有可能穷举出数据库服务器中所有账户的情况下,例如,假如我们要确定一个名为“HELPDESK”的账户是否存在,可以简单地尝试登录服务器,如果服务器向您发送一个质询,那么这个账户是存在的,如果没有发送任何质询,那么该账户就不存在,尽管这只是一个含有信息的事件,但是它却以告知攻击者这个账户是否存在的方式泄露了足够的信息,这使得对这个账户进行暴力登录尝试比对SYS和SYSTEM的攻击更加可行,通过关闭账户和确认使用复杂的密码就可以阻止暴力登录尝试。

2.6 利用长用户名缓冲区溢出

在2003年2月,Mark Litchfield发现了所有版本的Oracle(9iR2 及更早的版本)在任何操作系统上都存在身份验证过程中的缓冲区溢出漏洞,通过在登录的时候传递一个过长的用户名,这个用户名被复制到一个基于堆栈的缓冲区,该缓冲区会溢出并覆盖关键的程序控制信息,利用这个隐患,攻击者能够获得数据库服务器的完整控制权。Oracle提供了一个针对该问题的补丁,但是存在此种攻击漏洞的未打补丁的系统仍然随处可见。XML数据库通过TCP端口2100以FTP的方式提供服务,通过端口8080以HTTP的方式提供服务,在这两个方面都存在用户名过长缓冲区溢出和密码过长缓冲区溢出的漏洞。

2.7 对Windows XP平台上Oracle的注释

在Windows XP上安装Oracle的时候,如果用户是ORA_DBA本地组的一个成员,那么他们不需要提供SYS用户的密码就可以用SYSDBA的身份连接到数据库服务器,在处理这样的一个登录请求时,Oracle是以NTLMSSPI的函数Accept Security Context(),如果用户出示了正确的用户名和密码,那么这个函数就会返回0并创建一个标记,这样做的问题是如果允许简单的文件共享,那么所有的登录尝试都将获得成功,用户一访问者的身份通过验证。不过,随着对Oracle研究的深入,认证式用户不是“访客”而是远端用户在身份验证是提供的用户名,如果他们提供的用户名是ORA_DBA组中的有效用户名,那么Oracle会通过该用户的身份验证并给予SYSDBA的访问权限,当然下面的假设必须成立:远端用户必须有正确的密码,即函数AcceptSecurityContext()“宣布”他们顺利的通过了身份验证,攻击者所要做的就是发现ORA_DBA组中的一个成员的名字并在自己的系统中创建一个同名的用户,因为密码是不相干的,所以攻击者可以以SYSDBA的身份访问Oracle服务器。

3 结束语

身份验证为保障Oracle数据库安全性起着是极其重要的作用,深入地了解Oracle身份验证的工作原理才能更清楚地认识到其中所存在的漏洞隐患,才能为更好地防范黑客攻击做准备。

参考文献

[1] 刘超,张明安,吴伊萌等.Oracle数据库系统安全技术策略[J].软件,2013,(34)4:101-104.

[2] SameerDandage ,宋立桓.实现Oracle使用Windows身份验证[J].Windows & Net Magazine:国际中文版,2004,4: 77-80.

[3] 王慧慧. Oracle之用户管理[J].硅谷, 2011,4:179-181.

作者简介:

刘竹涛(1971-),男,福建福州人,哈尔滨工程大学,研究生,硕士,高级工程师;主要研究方向和关注领域:模式识别、民航气象数据库。

黄南(1971-),江苏南京人,黑龙江大学,本科,学士,工程师;主要研究方向和关注领域:计算机应用。

上一篇:血液内科临床实习教学工作探讨 下一篇:浅谈如何提高本科生专业课教学质量