数据库的非常规式安全隐患的开发方式

1 背景 
  以往对于数据库的安全方面都强调基于访问控制的常规式机制,即所谓的角色控制,入侵检测等方面。由于DBMS是基于操作系统之上的系统软件,故其安全性往往与操作系统的安全性有不可分割的联系[1]。最近几年,对于数据库造成安全隐患的都不是从角色控制方面出现的,如出现的SQL Server2000的1434端口漏洞被人利用之后,一度造成全世界大部分网络瘫痪1天,这即是关于数据库的非常规式安全方面。 
  随着当前对于数据库的应用越来越多,一些hack技术的手段也越来越高明,因此我们对于数据库的安全就需要从整个系统的角度来看待,从数据库的应用到数据库本身,到与之结合起来的操作系统都需要全面的审视[2-4]。 [本文转自:www.dylw.net]
  2 数据库的非常规式隐患分析 
  当需要分析这些对于非常规式攻击时,首先需要考虑那些本身通过操作系统或其它应用程序的漏洞来获取对于系统的控制权的情况,其次分析通过DBMS本身设计漏洞来攻击。该文只考虑与DBMS有关的安全性方面,如下就详述其常见的攻击手段以及防患措施。 
  2.1 暴力攻击法 
  常见的攻击方法就是尝试一个用户,枚举密码的方式,通过ODBC或者JDBC标准访问接口反复的连接数据库,直到连接返回成功。比如,ODBC提供了一个SQLConnect函数,其中有个字段就是用户的密码,一旦某个攻击者知道了某个用户名,就可以用如下的方式进行攻击: [本文转自:www.dylw.net]
  while(1) 
  {从密码字典中取出一个密码s; 
  ret = SQLConnect(...,s,...); 
  if(ret = =SQLSUCCESS) 
  break;} 
  实际上若再考虑几个因素,就会发现这种方法成功效率是很高的:一般用户的密码长度都不是很长,而且大多用数字或者字母。SQLConnect执行的时间一般是500ms,这样在1个小时内,攻击者就可以枚举60×60×2 = 7200个密码;在不到一天的时间内就可以破译所有10位以内的密码,如果攻击者采用多台机器并行攻击,其破译的时间更快。曾一度对SQL2K攻击非常见效的一个方法就是采取这样思路:默认的SQL2K的安装的SA用户的密码为空,获取了SA的密码,就可以采取SQL2K的存储过程任意改动操作系统的文件了。 
  实际上,一般数据库对于这种防范根本没有。防范这点的方法就是每隔一定时间扫描数据库的登陆日志,一旦发现对于数据库某个用户的登陆失败次数超过一个规定值,我们就可以判定有攻击者在试图破译这个密码,这个时候我们就必需采取一定的防范措施:一种方法是拒绝访问这个帐号,这样方法适用与分布式攻击,其一个缺点就是使得合法用户不能登陆数据库;另外一种方法就是对于不断尝试登陆的机器的ip禁止其访问服务器,这种方法对于少量用户的攻击可以起到作用,但是对于大部分的分布式或者协同式攻击就很难防范了[5]。 
  2.2 监听数据包发 
  上述1的攻击通过服务器接收的消息可以明显的分析出来,但对于监听网络发出的包信息的监听就很难防范了。监听的结果就是截获发往服务器的所有数据包。如若服务器没有对客户端发往服务器的信息或者服务器方法客户端的信息进行加密的话,或者这种加密算法很简单的话;这个时候,当监听者获取服务器和客户端之间通讯的数据库包,就可以对这些数据报展开分析了。这种方法,对于通讯双方的服务器和客户端来说,他们是不可能知道有人在监听的,这是由这种类型网络的结构所决定的。 
  分析SQL2K,发现其客户端发送的所有信息都是以明文形式发送,而服务器返回的信息是一个很简单的多次异或、移位的加密算法(其加密算法我们是通过反编译其源码获取的)。分析这个数据库系统的实例,我们可以很容易的获取很多秘密的信息。 
  对于这样防范的方法,有如下的两种方法: 
  1)加密通讯双方的数据进 
  由于数据库信息系统的数据库以及其客户端程序是公开的,故其加密算法也是公开的,这就要求加密算法对于加密之后的数据,即使攻击者获取密文之后也无法破译明文,其一就是要求加密算法的秘钥长度足够。按算法复杂度而言,随着秘钥长度的增加,加密算法的开销也会很快增加的;如若选取强度大的加密算法,势必造成整个数据库系统的性能降低;这也是现在很多的商业数据库选取简单的加密算法的一个初衷所在。这种方法,对于要求数据保密级别很高的应用才需要,一般应用只需要选取一个简单的加密算法即可。
 2)改变网络的拓扑结构 
  对于网络监听而言,分为有线监听和无线监听;无线监听就是直接监听服务器发出的电磁波来达到监听的目的,我们重点是讨论基于internet的有线监听,就是攻击者有限接入。由于一般的局域网都是采取的IEEE 802协议结构来实现的,所以在同一个局域网内的任何用户都可以监听到该局域网内收发的所用数据报。若改变这种拓扑结构,加入IEEE 802.1x认证服务器的话,这样就可以避免局域网的数据报被其他攻击者所监听到。此处考虑的是局域网信息,如果是基于internet的数据库访问的话,网络的拓扑结构就加入路由器,若攻击者监听对于数据库服务器所经过的路由器的数据报,此时的重点防患的即是保护路由器。 
  2.3 基于SQL语句 
  基于SQL语句的一个典型的攻击实例就是数据库推理机制,在此不讨论这个问题;而是从应用程序级别就是客户端程序的级别来讨论这个问题。 
  考虑实际的应用系统,涉及到1000个(实际上更多)用户以及该用户的一些相关信息,在数据库中我们并不是为着每个用户建立一个用户以及相应的权限等信息;而是创建一个表,然后由这个表记载着所有用户的名字、密码等信息。实际上,基本上所有的商业应用系统或者一般的MIS都是这样做的(其实也只能这么做)。然后,当一个用户登陆的时候,输入其相应的用户名字、密码;客户程序就以select的形式把用户名、密码发往服务器,客户端通过返回的信息就知道该用户时候合法,如下所示: 
  这种基于web的数据库应用系统的默认方式都是可以连接到数据库的,比如现在的ASP方式。此时采取2种方式可进行SQL语句的攻击: 
1)附加SQL语句 
  对于一个一般基于web的asp程序而言,一般都是用户输入名字和密码之后,asp程序就把取得的字符串附加在SQL语句之后递交给服务器,如下一个实例: 
  dim name [本文转自:www.dylw.net]
  dim pwd 
  select * from user_info where sname=” & name & “spwd =” & pwd; 
  大多数asp程序都是这样写的,其中的name、pwd都是直接从网页中的Form输入框中获取的。一个典型的输入就是name=”dm3” pwd=”dm3”;如果我们在pwd里面输入“pwd or 1=1”的话,就变成了:“select * from … or 1=1”。此时,这条SQL语句无论如何都是返回正确的登陆信息的。这就是所谓的SQL入侵。 
  对于这种攻击的一个很好的方法就是程序员编写的程序中,把认为的那些含有攻击特点的关键词过滤调就可避免这种攻击。 [本文转自:www.dylw.net]
  2)截获并修改发送数据包 
  上述程序是我们直接利用客户程序的疏忽而进行数据库的攻击的,实际应用中可能程序是以其它形式比如ADO、OLE DB连接的;此时只要采取监听客户所发的SQL语句包,然后再进行修改通过tcp/ip发送的数据就可以达到目的了,这种方法的原理与前面2.1所述的方法是类似的,只不过它不是直接攻击的;而是需要通过监听客户的程序所发往服务器的所有SQL语句而进行篡改数据的。 
  2.4 基于缓冲区溢出 
  缓冲区溢出是一个非常普遍、非常危险的漏洞,在各种操作系统、应用软件中大量存在着。曾一度令全球网络瘫痪的SQL2K的1434端口漏洞就是一个缓冲区漏洞的典型代表。缓冲区溢出的原理是:向一个有限空间的缓冲区中拷贝了过长的字符,它带来了两种后果,一是过长的字符串覆盖了相邻的存储单元,引起程序运行的失败,严重的可能引起当机、系统重新启动等后果;而是利用这种漏洞可以执行任意的指令,甚至可以取得系统的权限。 [本文转自:www.dylw.net]
  程序员常犯的一个错误就是不检查程序的输入,总是想当然的认为用户肯定会输入我们所希望的参数。如下就是一个人们编写的C程序,就可以利用来进行攻击: 
  int do_something(char *str) 
  {char buffer[BUFFER_LEN]; 
  strcpy(buffer,str); 
  ……} 
  C语言不进行数组的边界检查,这已经是众所周知的事情。在许多运用C语言实现的应用程序中,都假定缓冲区长度是足够的,它的长度肯定大于要拷贝的字符串。然而事实不总是这样。当向一个局部变量(数组)中拷贝一个超过数组本来长度的字符时,超过数组本来长度的那部分字符串将会覆盖与数组相邻的其他变量的空间,使变量出现不可预料的值。如果碰巧,数组与子程序的返回地址相邻时,便有可能由于超出的一部分字符覆盖了子程序的返回地址,子程序执行完毕返回时转向了另一个无法预料的地址,使程序的流程发生了错误,甚至,由于应用程序访问了不在进程地址空间范围的地址,而是进程发生了违例的故障。 
  随着操作系统软件的复杂,DBMS软件本身的庞大性;上述出现的错误是不可避免的。以常用的SQL2K来说,其ODBC现在被利用来进行缓冲区溢出攻击的地方就有100多处;我们用自己所做的边界检查程序就发现SQL2K的服务器就有20多处可以利用的地方。而发现自己所开发的DBMS就有10多处可以利用的地方。 
  关于这种漏洞的预防,主要是程序员在编写程序的时候要注意编写“安全”的程序;然后再加上一定的程序边界检查工具,就可以尽量消除这种漏洞了。 
  3 试验结果 
  上述我们简述了如何把常见的攻击手段结合在数据库上所产生的后果。还有一些直接获取对于操作系统的控制权,那么对于数据库所有的信息就很容易的收集到,这些不在我们的讨论之列,它是属于操作系统级别的安全性问题。 
  由于实际关于攻击的手段是层出不穷,比如病毒就是一个代表。而实际的攻击者在进行攻击的时候决不是只采取一种方法,而是灵活的根据具体的情况进行分析的进而进行攻击的。以下就简述我们实际的几个攻击实例,可以更清楚这种非常规式攻击的危害。
 3.1 攻击SQL2K服务器 
  1)基本法 
  首先扫描某学校的整个网段的机器,看谁的机器装了并正在运行SQL2K;如何知道?只要connect其1434端口就知道了,因为SQL2K是在1434端口监听的。之后直接用SQLConnect进行连接,用户名为sa,密码为空(因为默认状态的密码是空的,而大部分用户根本没有修改这么密码)。最后发现可以连上的有10台机器,有该漏洞的就有4台!之后登陆上去,运行xp_cmdshell()存储过程,就可以控制这台服务器了。剩下的事情就是把重要的数据导出,然后删除自己登陆留在系统的日志。 
  2)监听法 
  监听局域网内所有发往外部的1434端口的信息,因为SQL2K发送的信息都是明文形式的。收到如下数据: 
  select money from user_info where id=0314859 and query_pwd=1111;//可能是银行的查询 
  insert into buy_good values(0314859,58745,…);//这里面可能就有转帐密码了
  是不是很容易就收集到了我们需要的信息? 
  分析以上的攻击实例,目的就是使我们了解攻击者对于数据库的攻击不在是传统的那种方式,也不是教唆我们去攻击,目的就是使我们了解攻击者的攻击方法以及原理。在我们的安全数据库实现上,就需要考虑如何防备攻击者来攻击服务器,从而使得我们的数据库走向更高的安全级别。 
  4 结束语 
  本文通过研究基于非常规式的数据库攻击方法,其目的是加强对于数据库安全的防患,使得我们可以配置更加实用和高安全级别的DMBS。通过对于数据库的非常规式攻防分析,提高我们对于关系数据库系统的安全防患能力,提高数据库系统的安全性。 
  参考文献: 
  [1] 冯玉才.数据库系统基础[M].2版.华中理工大学出版社,1998. 
  [2] 陈建兵.分布式数据库安全管理研究[J] .微计算机信息,2007,5:154-156. 
  [3] National Computer Security Center.Department of Defense Trusted Computer System Evaluation Criteria,December 1985.DoD 5200.28-STD. 
  [4] M. H. Kang, J. N. Froscher, J. P. McDermott, O. Costich, and R. Peyton. "Achieving Database Security through Data Replication: The SINTRA Prototype," Proc. 17th National Computer Security Conference, Baltimore, MD, Oct., 1994:77-87. 
  [5] Z. Tari and G. Fernandez. Security Enforcement in the DOK Federated Database System. In P. Samarati and R. Sandhu, editors, Database Security, X: Status and Prospects, 23-42.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值