本章学习要点
- 掌握DoS攻击的原理
- 掌握DoS攻击工具的基本使用和防护
- 了解基于服务的漏洞和入侵方法
- 掌握Telnet入侵的基本防护
- 了解SQL数据库的安全技术和原理
- 掌握基于SQL的入侵和防护
3.1 拒绝服务攻击概述
3.1.1 DoS定义
DoS(Denial of Service,拒绝服务)是指阻止或拒绝合法使用者存取网络服务器。造成DoS的攻击行为被称为DoS攻击,即将大量的非法申请封包传送给指定的目标主机,其目的是完全消耗目标主机资源,使计算机或网络无法提供正常的服务。最常见的DoS攻击包括计算机网络带宽攻击和连通性攻击。带宽攻击是指以极大的通信量冲击网络,使得所有可用的网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。连通性攻击是指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
DoS攻击的原理是借助网络系统或协议的缺陷以及配置漏洞进行网络攻击,使网络拥塞、系统资源耗尽或系统应用死锁,妨碍目标主机和网络系统对正常用户服务请求的及时响应,造成服务的性能受损,甚至导致服务中断。
DoS攻击的基本过程是首先攻击者向服务器发送众多的带有虚假地址的请求,服务器发送回复信息后等待回传信息。由于地址是伪造的,所以服务器一直等不到回传的消息,分配给这次请求的资源就始终没有被释放。当服务器等待一定的时间后,连接会因超时而被切断,攻击者会再度传送一批新的请求,在这种反复发送伪地址请求的情况下,服务器资源最终会被耗尽,而导致服务中断,如图3.1所示。
3.1.2 拒绝服务攻击的分类
近年来,人们不断加强对DoS的防御,设计出应对DoS攻击的各种技术手段,同时,DoS攻击的手段也在不断地变化、增多,即使是同一种攻击方式,攻击者改变某些攻击特征后,就可以躲过某些防御措施,从而衍生出了各种各样的DoS攻击模式。这些问题,一方面阻碍了研究者对攻击现象与特征的深入理解;另一方面,也对人们根据攻击特征的异同来实施不同的防御手段、并对防御措施的有效性进行评估带来了困难。
如果了解了攻击者采取的攻击类型,就可以有针对性地应对这些攻击。而对拒绝服务攻击的分类研究则是深入了解拒绝服务攻击的有效途径。拒绝服务攻击的分类方法有很多种,从不同的角度可以进行不同的分类,而不同的应用场合又需要采用不同的分类。
1.按攻击的对象分类
拒绝服务攻击可以是“物理的”(又称“硬件的”),也可以是“逻辑的”(又称“软件的”)。
① 物理形式的攻击,如偷窃、破坏物理设备,破坏电源等。
② 逻辑的攻击,如通过软件破坏网络、系统资源和服务,如邮件服务、DNS服务、CPU资源等。
2.按攻击的目标分类
按攻击的目标拒绝服务攻击又可分为节点型和网络连接型。
① 节点型:旨在消耗节点(主机Host)资源。节点型又可以进一步细分为主机型和应用型。
- 主机型攻击:其目标主要是主机中的公共资源,如CPU、磁盘等,使得主机对所有的服务都不能响应。
- 应用型攻击:其目标是网络中特定的应用,如邮件服务、DNS服务、Web服务等。受攻击时,受害者使用的其他服务可能不受影响或者受影响的程度较小(与受攻击的服务相比而言)。
② 网络连接型:旨在消耗网络连接和带宽。
3.按攻击方式分类
按照攻击方式拒绝服务攻击可以分为资源消耗、服务中止和物理破坏。
① 资源消耗:指攻击者试图消耗目标的合法资源,如网络带宽、内存和磁盘空间、CPU使用率等。根据资源类型的不同,资源消耗可分为带宽耗尽和系统资源耗尽两类。
- 带宽耗尽攻击:其本质是攻击者通过放大等技巧,消耗掉目标网络的所有可用带宽。
- 系统资源耗尽攻击:指对系统内存、CPU 或程序中的其他资源进行消耗,使其无法满足正常提供服务的需求。著名的Syn Flood攻击即是通过向目标服务发送大量的数据包,造成服务的连接队列耗尽,无法再为其他正常的连接请求提供服务。
② 服务中止:指攻击者利用服务中的某些缺陷导致服务崩溃或中止。
③ 物理破坏:指雷击、电流、水、火等以物理接触的方式导致的拒绝服务攻击。
4.按受害者类型分类
按受害者类型拒绝服务攻击可以分为服务器端拒绝服务攻击和客户端拒绝服务攻击。
① 服务器端拒绝服务攻击:指攻击的目标是特定的服务器,使之不能提供服务(或者不能向某些客户端提供某种服务),如攻击一个Web服务器使之不能访问。
② 客户端拒绝服务攻击:针对特定的客户端,使之不能使用某种服务,如游戏、聊天室中的“踢人”,也就是使某个特定的用户不能登录游戏系统或聊天室中,使之不能使用系统的服务。
5.按攻击是否针对受害者分类
大多数的拒绝服务攻击(无论从种类还是发生的频率角度)是针对服务器的,针对客户端的攻击一般发生得少些,同时因为涉及面小,其危害也会小很多。按攻击是否直接针对受害者,拒绝服务攻击又可以分为直接拒绝服务攻击和间接拒绝服务攻击,如要对某个E-mail账号实施拒绝服务攻击,直接对该账号用邮件炸弹攻击就属于直接攻击;为了使某个邮件账号不可用,攻击邮件服务器而使整个邮件服务器不可用就是间接攻击。
6.按攻击地点分类
拒绝服务攻击按攻击地点可以分为本地攻击和远程(网络)攻击。本地攻击是指不通过网络,直接对本地主机的攻击,远程攻击则必须通过网络连接。由于本地攻击要求攻击者与受害者处于同一地,这对攻击者的要求太高,通常只有内部人员能够做到。本地攻击通常可以通过物理安全措施以及对内部人员的严格控制予以解决。
3.1.3 常见DoS攻击
拒绝服务攻击的攻击者想尽办法让目标机器停止提供服务或资源访问,这些资源包括磁盘空间、内存、进程,甚至网络带宽,从而阻止正常用户的访问。只要能够对目标造成麻烦,使某些服务被暂停甚至主机死机,都属于拒绝服务攻击。
攻击者进行拒绝服务攻击,实际上是让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接。
下面来了解几种常见的拒绝服务攻击。
1.Land程序攻击
Land程序攻击是利用向目标主机发送大量的源地址与目标地址相同的数据包,造成目标主机解析Land包时占用大量的系统资源,从而使网络功能完全瘫痪的攻击手段。其方法是将一个特别设计的SYN包中的源地址和目标地址都设置成某个被攻击服务器的地址,这样服务器接收到该数据包后会向自己发送一个SYN-ACK回应包,SYN-ACK又引起一个发送给自己的ACK包,并创建一个空连接。每个这样的空连接都将暂存在服务器中,当队列足够长时,正常的连接请求将被丢弃,造成服务器拒绝服务的现象。
2.SYN Flood攻击
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(Distributed Denial of Service,分布式拒绝服务攻击)的方式之一,这是一种利用TCP缺陷,发送大量伪造的TCP连接请求,使被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。其实现过程如下。
① 攻击者向被攻击服务器发送一个包含SYN标志的TCP报文,SYN(Synchronize,同步报文)会指明客户端使用的端口以及TCP连接的初始序号,这时同被攻击服务器建立了第1次握手。
② 受害服务器在收到攻击者的SYN后,将返回一个SYN+ACK的报文,表示攻击者的请求被接受,同时TCP序号被加1,ACK(Acknowledgement)即确认,这样就同被攻击服务器建立了第2次握手。
③ 攻击者也返回一个确认报文ACK给受害服务器,同样TCP序列号被加1,到此一个TCP连接完成,第3次握手完成。
在TCP连接的3次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第3次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端),并等待一段时间后丢弃这个未完成的连接。这段时间的长度称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒至2分钟)。一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况(伪造IP地址),服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源。即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断地对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃——即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求,而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常小),此时从正常客户的角度来看,服务器失去响应,这种情况就称作服务器端受到了SYN Flood攻击(SYN洪水攻击)。
防攻击方法是当接收到大量的SYN数据包时,通知防火墙阻断连接请求或丢弃这些数据包,并进行系统审计。
3.IP欺骗DoS攻击
这种攻击利用RST位来实现。假设现在有一个合法用户(61.61.61.61)已经同服务器建立了正常的连接,攻击者构造攻击的TCP数据,伪装自己的IP为61.61.61.61,并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后,认为从61.61.61.61发送的连接有错误,就会清空缓冲区中已经建立好的连接。这时,如果合法用户61.61.61.61再发送合法数据,服务器就已经没有这样的连接了,该用户就必须重新开始建立连接。攻击时,攻击者会伪造大量的IP地址,向目标发送RST数据,使服务器不为合法用户服务,从而实现了对受害服务器的拒绝服务攻击。
4.Smurf攻击
Smurf攻击结合IP欺骗和ICMP回复,是一种放大效果的ICMP攻击方式,其方法是攻击者伪装成被攻击者向某个网络上的广播设备发送请求,该广播设备会将这个请求转发到该网络的其他广播设备,导致这些设备都向被攻击者发出回应,从而达到以较小代价引发大量攻击的目的。例如,攻击者冒充被攻击者的IP,使用Ping来对一个C类网络的广播地址发送ICMP包,该网络上的254台主机就会对被攻击者的IP发送ICMP回应包,这样攻击者的攻击行为就被放大了254倍。
5.Ping of Death
这种攻击通过发送大于65 536字节的ICMP包造成操作系统内存溢出、系统崩溃、重启、内核失败等后果,从而达到攻击的目的。通常不可能发送大于65 536个字节的ICMP包,但可以把报文分割成片段,然后在目标主机上重组,最终会导致被攻击目标缓冲区溢出。
防止系统受到Ping of Death攻击的方法与防范Smurf和Fraggle攻击是相同的,可以在防火墙上过滤掉ICMP报文,或者在服务器上禁止ping,并且只在必要时才打开ping服务。
6.Teardrop攻击
泪滴(Teardrop)攻击是基于UDP的病态分片数据包的攻击方法,利用在TCP/IP堆栈中实现信任IP碎片的包的标题头所包含的信息来实现自己的攻击。IP分段含有指明该分段所包含的是原包的哪一段的信息,某些操作系统TCP/IP(包括Service pack 4以前的Windows NT)在收到含有重叠偏移的伪造分段时将会出现系统崩溃、重启等现象。
检测方法是对接收到的分片数据包进行分析,计算数据包的片偏移量(Offset)是否有误。可以通过添加系统补丁程序,丢弃收到的病态分片数据包,并对这种攻击进行审计等方法预防该攻击。
7.WinNuke攻击
WinNuke攻击又称带外传输攻击,它的特征是攻击目标端口,被攻击的目标端口通常是139、138、137、113、53,且URG位设为“1”,即紧急模式。可以通过判断数据包目标端口是否为139、138、137等,并判断URG位是否为“1”来检测该攻击。
适当配置防火墙设备或过滤路由器就可以防止这种攻击手段(丢弃该数据包),并对这种攻击进行审计(记录事件发生的时间,源主机和目标主机的MAC地址和IP地址)。
3.1.4 分布式拒绝服务
分布式拒绝服务(Distributed Denial of Service,DDoS)是一种基于DoS的特殊形式的拒绝服务攻击,是一种分布、协作的大规模攻击方式,主要瞄准比较大的站点,像商业公司、搜索引擎或政府部门的站点。分布式拒绝服务如图3.2所示。DoS攻击只要一台单机和一个Modem就可实现,与之不同的是DDoS攻击是利用一批受控制的机器向一台机器发起攻击,这样来势迅猛的攻击令人难以防备,因此具有较大的破坏性。
DDoS攻击分为3层:攻击者、主控端和代理端,三者在攻击中扮演着不同的角色。
- 攻击者。攻击者所用的计算机是攻击主控台,可以是网络上的任何一台主机,甚至可以是一个活动的便携机。攻击者操纵整个攻击过程,它向主控端发送攻击命令。
- 主控端。主控端是攻击者非法侵入并控制的一些主机,这些主机还分别控制大量的代理主机。在主控端主机的上面安装了特定的程序,因此它们可以接收攻击者发来的特殊指令,并且可以把这些命令发送到代理主机上。
- 代理端。代理端同样也是攻击者侵入并控制的一批主机,它们上面运行攻击器程序,接收和运行主控端发来的命令。代理端主机是攻击的执行者,真正向受害者主机发送攻击。
攻击者发起DDoS攻击的第一步,就是寻找在Internet上有漏洞的主机,进入系统后在其上面安装后门程序,攻击者入侵的主机越多,他的攻击队伍就越壮大。第二步在入侵主机上安装攻击程序,其中一部分主机充当攻击的主控端,另一部分主机充当攻击的代理端,最后各部分主机各司其职,在攻击者的调遣下对攻击对象发起攻击。由于攻击者在幕后操纵,所以在攻击时不会受到监控系统的跟踪,身份不容易被发现。
DDoS攻击实施起来有一定的难度,它要求攻击者必须具备入侵他人计算机的能力。但是很不幸的是一些傻瓜式的黑客程序的出现,这些程序可以在几秒钟内完成入侵和攻击程序的安装,使发动DDoS攻击变成一件轻而易举的事情。下面了解常见的DDoS工具。
1.Trinoo
Trinoo的攻击方法是向被攻击目标主机的随机端口发出全零的4字节UDP包,在处理这些超出其处理能力的垃圾数据包的过程中,被攻击主机的网络性能不断下降,直到不能提供正常服务,乃至崩溃。它对IP地址不进行修改,采用的通信端口如下。
- 攻击者主机到主控端主机:27665/TCP。
- 主控端主机到代理端主机:27444/UDP。
- 代理端主机到主服务器主机:31335/UDP。
2.TFN
TFN由主控端程序和代理端程序两部分组成,它主要采取的攻击方法为SYN风暴、Ping风暴、UDP炸弹和SMURF,具有伪造数据包的能力。
3.TFN2K
TFN2K是由TFN发展而来的,在TFN所具有的特性上,TFN2K又新增一些特性。它的主控端和代理端的网络通信是经过加密的,中间还可能混杂了许多虚假数据包,而TFN对ICMP的通信没有加密。攻击方法增加了Mix和Targa3,并且TFN2K可配置代理端进程端。
4.Stacheldraht
Stacheldraht也是从TFN派生出来的,因此它具有TFN的特性。此外,它增加了主控端代理端的加密通信能力,它对命令源作假,可以防范一些路由器的RFC 2267过滤。Stacheldraht中有一个内嵌的代理升级模块,可以自动下载并安装最新的代理程序。
现在网上采用DDoS方式进行攻击的攻击者日益增多,只有及早发现自己受到攻击才能避免遭受惨重的损失。检测DDoS攻击的主要方法有以下几种。
- 根据异常情况分析。当网络的通信量突然急剧增长,超过平常的极限值时,一定要提高警惕,检测此时的通信;当网站的某一特定服务总是失败时,也要多加注意;当发现有特大型的ICP和UDP数据包通过或数据包内容可疑时都要留神。总之,当机器出现异常情况时,最好分析这些情况,防患于未然。
- 使用DDoS检测工具。当攻击者想使其攻击阴谋得逞时,他首先要扫描系统漏洞,目前市面上的一些网络入侵检测系统,可以杜绝攻击者的扫描行为。另外,一些扫描器工具可以发现攻击者植入系统的代理程序,并可以把它从系统中删除。
由于DDoS攻击具有隐蔽性,因此到目前为止还没有发现对DDoS攻击行之有效的解决方法,所以要加强安全防范意识,提高网络系统的安全性。可采取的安全防御措施有以下几种。
① 及早发现系统存在的攻击漏洞,及时安装系统补丁程序。对一些重要的信息建立完善的备份机制,如系统配置信息的备份。对一些特权账号(如管理员账号)的密码设置要谨慎,最好采用强密码。通过这样一系列的措施可以把攻击者的可乘之机降低到最小。
② 在网络管理方面,要经常检查系统的物理环境,禁止那些不必要的网络服务。经常检测系统配置信息,并注意查看每天的安全日志。
③ 利用网络安全设备(如防火墙)来加固网络的安全性,配置好它们的安全规则,过滤掉所有可能的伪造数据包。
④ 比较好的防御措施就是和网络服务提供商协调工作,让他们帮助实现路由访问控制和对带宽总量的限制。
⑤ 当发现正在遭受DDoS攻击时,应当及时启动应付策略,尽可能快地追踪攻击包,并且要及时联系ISP和有关应急组织,分析受影响的系统,确定涉及的其他节点,从而阻挡已知攻击节点的流量。
⑥ 如果是潜在的DDoS攻击受害者,发现计算机被攻击者用作主控端和代理端时,不能因为系统暂时没有受到损害而掉以轻心,攻击者已发现系统的漏洞,这对于系统是一个很大的威胁。所以一旦发现系统中存在DDoS攻击的工具软件要及时把它清除,以免留下后患。
3.1.5 拒绝服务攻击的防护
拒绝服务攻击的防护一般包含两个方面:一方面是针对不断发展的攻击形式,尤其是采用多种欺骗技术的技术,能够有效地进行检测;另一方面也是最为重要的,就是如何降低对业务系统或者是网络的影响,从而保证业务系统的连续性和可用性。
针对上述两个方面要求,一个完善的拒绝服务攻击防护措施应该从4个方面下手:首先能够从网络流量中精确地区分攻击流量并阻断;然后检测发现攻击,降低攻击对服务的影响;同时能够在网络多个边界进行部署,阻断内外不同类型的攻击;最后保障网络系统具备很强的扩展性和良好的可靠性。
通常建议用户可以采取以下手段来保障网络能够抵御拒绝服务攻击。
① 增加网络核心设备的冗余性,提高对网络流量的处理能力和负载均衡能力。
② 通过路由器配置访问列表,过滤掉非法流量。
③ 部署防火墙,提高网络抵御网络攻击的能力。
④ 部署入侵检测设备,提高对不断更新的DoS攻击的识别和控制能力。
3.2 SQL数据库安全
3.2.1 数据库系统概述
数据库是电子商务、金融以及ERP系统的基础,通常保存重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人信息,如员工薪水、个人资料等。数据库服务器还掌握着敏感的金融数据,包括交易记录、商业事务和账号数据;战略上的或者专业的信息,如专利和工程数据;甚至市场计划等应该保护起来防止竞争者和其他非法者获取的资料。
数据完整性和合法存取会受到很多方面的安全威胁,包括密码策略、系统后门、数据库操作以及本身的安全方案,但是数据库通常没有像操作系统和网络那样在安全性上受到重视。
3.2.2 SQL服务器的发展
1970年6月,E.F.Dodd博士发表“A Relational Model of Data for Large Shared Data Banks”论文,提出关系模型。1979年6月12日,Oracle公司(当时还叫Relational Software)发布了第一个商用SQL关系数据库。1987年Microsoft、Sybase 和Ashton-Tate 3家公司共同开发了Sybase SQL Server。1988年,Microsoft、Sybase和Aston-Tate 3家公司把该产品移植到OS/2上。后来Aston-Tate公司退出了该产品的开发,而Microsoft公司、Sybase公司则签署了一项共同开发协议,这两家公司的共同开发结果是发布了用于Windows NT操作系统的SQL Server,1993年,将SQL Server移植到了Windows NT 3.1平台上,即微软SQL Server 4.2版本发布。在SQL Server 4版本发行以后,Microsoft公司和Sybase公司在SQL Server的开发方面分道扬镳,取消了合同,各自开发自己的SQL Server。Microsoft公司专注于Windows NT平台上的SQL Server开发,而Sybase公司则致力于UNIX平台上的SQL Server开发。SQL Server 6.0版是第一个完全由Microsoft公司开发的版本。1996年,Microsoft公司推出了SQL Server 6.5版本,接着在1998年又推出了具有巨大变化的SQL Server 7.0版,这一版本在数据存储和数据库引擎方面发生了根本性的变化。又经过两年的努力开发,Microsoft公司于2000年9月发布了SQL Server 2000,其中包括企业版、标准版、开发版、个人版4个版本。从SQL Server 7.0到SQL Server 2000的变化是渐进的,没有从6.5到7.0变化那么大,只是在SQL Server 7.0的基础上进行了增强。2005年Microsoft公司又发布了SQL Server 2005产品,该产品包括企业版、标准版、工作组版和精简版4个版本。
3.2.3 数据库技术的基本概念
在数据库技术应用中,经常用到的基本概念有数据(Data)、数据库(DataBase,DB)、数据库管理系统(DBMS)、数据库系统(Database System,DBS)、数据库技术及数据模型。
① 数据(Data):描述事物的符号。在日常生活中,数据无所不在,如数字、文字、图表、图像、声音等都是数据。人们通过数据来认识世界,交流信息。
② 数据库(DB):数据存放的地方。在计算机中,数据库是长期存储在计算机内、有组织的、统一管理的相关数据和数据库对象的集合。所谓数据库对象是指表(Table)、视图(View)、存储过程(Stored Procedure)、触发器(Trigger)等。数据库能为各种用户共享,具有较小冗余度、数据间联系紧密而又有较高的数据独立性。
③ 数据库管理系统(DBMS):位于用户与操作系统(OS)之间的用于管理数据的计算机软件,它为用户或应用程序提供访问数据库的方法,包括数据库的建立、查询、更新及各种数据控制等。数据库管理系统使用户能方便地定义和操纵数据,维护数据的安全性和完整性,以及进行多用户下的并发控制和恢复数据库。
④ 数据库系统(DBS):实现有组织、动态地存储大量关联数据,方便多用户访问的计算机软硬件和数据资源的系统,即它是采用数据库技术的计算机系统。狭义地讲,数据库系统是由数据库、数据库管理系统和用户构成的;广义地讲,数据库系统是由计算机硬件、操作系统、数据库管理系统以及在它支持下建立起来的数据库、应用程序、用户和维护人员组成的一个整体。
⑤ 数据库技术:研究数据库的结构、存储、设计、管理和使用的一门软件学科。
⑥ 数据模型:对现实世界的抽象。在数据库技术中,用模型的概念描述数据库的结构与语义,对现实世界进行抽象。
数据模型是能表示实体类型及实体间联系的模型。数据模型的种类很多,目前被广泛使用的可分为两种类型。
一种是独立于计算机系统的数据模型,完全不涉及信息在计算机中的表示,只是用来描述某个特定组织所关心的信息结构,这类模型称为“概念数据模型”。概念数据模型是按用户的观点对数据建模,强调其语义表达能力,概念应该简单、清晰、易于用户理解,它是对现实世界的第一层抽象,是用户和数据库设计人员之间进行交流的工具。这一类模型中最著名的是“实体联系模型”。
另一种数据模型是直接面向数据库的逻辑结构,它是对现实世界的第二层抽象。这类模型直接与数据库管理系统有关,称为“逻辑数据模型”,一般又称为“结构数据模型”,如层次、网状、关系、面向对象等模型。这类模型有严格的形式化定义,以便于在计算机系统中实现。它通常有一组严格定义的无二义性语法和语义的数据库语言,人们可以用这种语言来定义、操纵数据库中的数据。
结构数据模型应包含数据结构、数据操作和数据完整性约束3个部分。
- 数据结构是指对实体类型和实体间联系的表达和实现。
- 数据操作是指对数据库的检索和更新(包括插入、删除和修改)两类操作。
- 数据完整性约束给出数据及其联系应具有的制约和依赖规则。
3.2.4 SQL安全原理
在研究SQL Server攻击和防守前,应该熟悉基本的SQL Server安全原理。一旦认识到哪个安全基础结构正被使用,就会更好地理解每个攻击或防守。SQL Server支持三级安全层次,这种三层次的安全结构与Windows安全结构相似,因此Windows安全知识也适用于SQL Server。
1.第一级安全层次
服务器登录是SQL Server 认证体系的第一道关,用户必须登录到SQL Server,或者已经成功登录了一个映射到SQL Server的系统账号。SQL Server有两种服务器验证模式:Windows安全模式和混合模式。如果选择的是Windows安全模式,并把Windows用户登录映射到了SQL Server登录上,那么合法的Windows用户也就连到了SQL Server上,不是Windows合法用户的用户则不能连接到SQL Server上。在混合模式中,Windows用户访问Windows和SQL Server的方式与Windows安全模式下相同,而一个非法的Windows用户则可以通过合法的用户名和口令访问SQL Server(当然,合法的Windows用户也可以通过其他合法的用户名和口令但不通过Windows登录而访问SQL Server)。除非必须使用混合模式,否则建议使用Windows安全模式。
为方便服务器管理,每个SQL Server有多个内置的服务器角色,允许系统管理员给可信的实体授予一些功能,而不必使他们成为完全的管理员。服务器中的一些角色如表3.1所示。
2.第二级安全层次
它控制用户与一个特定的数据库的连接。在SQL Server上登录成功并不意味着用户已经可以访问SQL Server上的数据库,还需要数据库用户来连接数据库。数据库用户是实际被数据库授予权限的实体。当数据库所有者(db-owner,dbo)创建了新的存储过程,他将为数据库用户或角色的存储过程分配执行权限,而不是登录。数据库用户从概念上与操作系统用户是完全无关的,但是在实际使用中把它们对应起来可能比较方便,但不是必须的。
3.第三级安全层次
它允许用户拥有对指定数据库中一个对象的访问权限,由数据库角色来定义。用户定义的角色可以更加方便地为用户创建的对象、固定的角色和合适的应用角色分配权限。
(1)用户定义的角色
用户定义的角色与Windows认证中的组有点相似。每个用户可以是一个或多个用户定义的数据角色中的成员,可以直接应用于如表单或存储过程等系统对象。强烈建议把权限分配给角色而不是用户,因为这将极大地方便分配权限,从而极少导致错误。
(2)固定数据库角色
固定数据库角色允许数据库所有者(dbo)赋予一些用户授权能力,方便管理,抑制一些用户过多的权限。强烈推荐管理员和数据库所有者经常检查这些组的成员资格,确保没有用户被给予了不应得的权限。参考表3.2中的数据库角色,以及对角色主要功能和权限的简要描述。
应用角色是专门为下面的应用程序设计的,即当用户访问SQL Server,使用特别的应用程序时,希望用户拥有更大的权限访问,而又不想授予单独的用户权限,因为如果许可某个用户访问SQL Server表,就不能控制这些用户连接到SQL Server的方式,阻止他们以自己从没想过的方法访问数据。因此,要解决这个问题,需要创建一个应用程序角色,然后在执行需要提高权限的功能时,让应用程序切换到那个角色。接着确保当通过此应用程序时,用户只能执行期望的功能。
通过使用sp_addapprole,首先创建数据库角色执行这个功能,如exec sp_setapprole 'app_role_name','strong _password'。应用程序接着发布如下命令,切换安全环境到应用角色(假定以加密表单的形式给SQL Server发送密码):exec sp_setapprole 'app_role name',{Encrypt N 'strong _password'},'odbc'。
为了记录,这个特性只应考虑在小应用程序中作为最后的手段。除了必须在应用程序中嵌入永久密码,用户容易扫描(使用叫作“entropy scanner”的工具或其他途径)这个讨厌的事情外,有更多的明智的替换方法。例如,如果真希望用户做一些他们一般不能在应用程序中做的事情,只要创建不需要数据访问的存储过程即可。如果存储过程由一个用户所有(经常设定为dbo),并设有合适的权限级别,不包含任何exec参数,则用户将可以执行存储过程来访问需要的功能。这是更可控的数据方法,不需要证书编码。
3.3 SQL Server攻击的防护
Microsoft公司的SQL Server是一种广泛使用的数据库,很多电子商务网站、企业内部信息化平台等都是基于SQL Server的,但是数据库的安全性还没有和系统的安全性等同起来,多数管理员认为只要把网络和操作系统的安全做好了,那么所有的应用程序也就安全了。大多数系统管理员对数据库不熟悉,而数据库管理员又对安全问题关心太少,而且一些安全公司也忽略数据库安全,这就使数据库的安全问题更加严峻了。数据库系统中存在的安全漏洞和不当的配置通常会造成严重的后果,而且都难以发现。数据库应用程序通常同操作系统的最高管理员密切相关。广泛的SQL Server数据库又是属于“端口”型的数据库,这就表示任何人都能够用分析工具试图连接到数据库上,从而绕过操作系统的安全机制,进而闯入系统、破坏和窃取数据资料,甚至破坏整个系统。
这里主要介绍有关SQL Server 2000数据库的安全配置以及一些相关的安全和使用上的问题。
3.3.1 信息资源的收集
在讨论如何防守攻击者之前,必须要了解攻击者如何查找和渗透SQL Server或基于SQL Server的应用程序。
攻击者可能有许多原因来选择潜在的目标,包括报复、利益或恶意。永远不要假定自己的服务器“飞”得太低,以至于不能显示在别人的雷达屏幕上。许多攻击者只是因为高兴而扫描IP范围,假定自己的ISP或内部网络被这些人骚扰了,那就要做最坏的打算。
现在评估SQL Server被发现的方法,可以通过网络,也可以通过企业内部。攻击者无论是把某些IP范围作为目标,还是随机扫描,他们发现SQL Server所使用的工具都是一样的。
当Microsoft公司在SQL Server 2000中引入多请求能力时,就引入了一个难题:既然端口(除了默认的请求,它默认监听端口为1433)是动态分配的,那么怎么知道请求名字的用户是如何连接到合适的TCP端口的?Microsoft公司通过在UDP 1434上创建一个监听者来解决这个问题,称之为SQL Server解决服务方案。这个服务方案负责发送包含链接信息的响应包给发送特定请求的客户。这个包含有允许客户想得到的请求的所有信息,包括每个请求的TCP端口、其他支持的netlib、请求形式,以及服务器是否集群。
3.3.2 获取账号及扩大权限
假定SQL Server搜索是成功的,那么现在有收集到的IP地址、请求名称以及TCP端口作为武装,然后去获得一些安全环境的信息。可收集关于服务器的信息,如版本信息、数据库、表单以及其他的信息,这些将决定谁是目标:是SQL Server数据还是操作系统。 一般来说,入侵者可以通过以下几个手段来获取账号或密码。
- 社会(交)工程学:通过欺诈手段或人际关系获取密码。
- 弱口令扫描:该方法是最简单的方法,入侵者通过扫描大量主机,从中找出一两个存在弱口令的主机。
探测包:进行密码监听,可以通过Sniffer(嗅探器)来监听网络中的数据包,从而获得密码,这种方法对付明文密码特别有效,如果获取的数据包是加密的,还要涉及解密算法。
暴力破解SQL口令:密码的终结者,获取密码只是时间问题,如本地暴力破解、远程暴力破解。
- 其他方法:如在入侵后安装木马或安装键盘记录程序等。
3.3.3 设置安全的SQL Server
在进行SQL Server 2000数据库的安全配置之前,需要完成3个基本的安全配置。
① 对操作系统进行安全配置,保证操作系统处于安全的状态。
② 对要使用的数据库软件(程序)进行必要的安全审核,如ASP、PHP等脚本,这是很多基于数据库的Web应用常出现的安全隐患,对于脚本主要是一个过滤问题,需要过滤一些类似于“,”、“‘”、“;”、“@”、“/”等的字符,防止破坏者构造恶意的SQL语句进行注入。
③ 安装SQL Server 2000后,要打上最新的补丁。
在做完上述3步基本的配置之后,下面来讨论SQL Server 2000的安全配置。
(1)使用安全的密码策略和账号策略,减少过多的权限
健壮的密码是安全的第一步。很多数据库账号的密码过于简单,这与系统密码过于简单是一个道理,容易被入侵者获取,并以此入侵数据库。对于sa更应该注意,同时不要让sa账号的密码写于应用程序或者脚本中。SQL Server 2000安装的时候,如果是使用的是混合模式,那么就需要输入sa的密码,除非确认必须使用空密码。这比以前的版本有所改进。同时应养成定期修改密码的好习惯。数据库管理员应该定期查看是否有不符合密码要求的账号。例如,使用下面的SQL语句:
由于SQL Server不能更改sa用户名称,也不能删除这个超级用户,所以必须对这个账号进行最强的保护。当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa账号,只有当没有其他方法登录到SQL Server实例(例如,当其他系统管理员不可用或忘记了密码)时才使用sa。建议数据库管理员新建立一个拥有与sa一样权限的超级用户来管理数据库。安全的账号策略还包括不要让管理员权限的账号泛滥。
SQL Server的认证模式有Windows身份认证和混合身份认证两种。如果数据库管理员不希望操作系统管理员通过操作系统登录来接触数据库,可以在账号管理中把系统账号“BUILTIN\Administrators”删除。不过这样做的结果是一旦sa账号忘记密码的话,就没有办法来恢复了。
很多主机使用数据库应用只是用来做查询、修改等简单功能的,请根据实际需要分配账号,并赋予仅仅能够满足应用要求和需要的权限。例如,只要查询功能的,那么就使用一个简单的public账号,能够select就可以了。
(2)激活审核数据库事件日志
审核数据库登录事件的“失败和成功”,在实例属性中选择“安全性”,将其中的审核级别选定为全部,这样在数据库系统和操作系统安全性日志里面,就详细记录了所有账号的登录事件。
应定期查看SQL Server日志,检查是否有可疑的登录事件发生,或者使用如下的DOS命令:
(3)清除危险的扩展存储过程
对存储过程进行大手术,并且对账号调用扩展存储过程的权限要慎重。其实在多数应用中根本用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以可删除不必要的存储过程,因为有些系统的存储过程很容易被人利用来提升权限或进行破坏。
xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门,是危险性最高的存储过程,它可以执行操作系统的任何指令。如果不需要扩展存储过程xp_cmdshell,最好使用下面的SQL语句将其去掉。
如果日后又需要这个存储过程,可以使用下面的SQL语句将其恢复过来。
同理,可以去掉其他不需要的存储过程。
例如,OLE自动存储过程会造成管理器中的某些特征不能使用,这些过程包括Sp_OACreate、Sp_OADestroy、Sp_OAGetErrorInfo、Sp_OAGetProperty、Sp_OASetProperty、Sp_OAMethod和Sp_OAStop。
又如,注册表访问的存储过程甚至能够读出操作系统管理员的密码来,这些过程包括 Xp_regdeletekey、Xp_regdeletevalue、Xp_regenumvalues、Xp_regwrite、Xp_regread、Xp_regaddmultistring和Xp_regremovemultistring。
还有一些其他的扩展存储过程,也最好检查一下。在处理存储过程的时候,应确认一下,避免造成对数据库或应用程序的伤害。
(4)在与工作相关的存储过程上设置严格的权限
SQL Server代理服务允许对以后执行的或在重建基础上的工作的创建。遗憾的是,默认情况下,甚至对最低级别的用户,也允许有这个能力。恶意的用户会创建一个过程来不断地提交无限量的工作,并在他选择的任何时间执行它们。这可能意味着重大的拒绝服务风险,也意味着明显的过度权限的情况。建议对public角色删除execute权限,这样,低权限的用户不能发布工作。如下的过程位于MSDB数据库中,应在安装后立即对它们采取措施以确保安全:
(5)使用协议加密
SQL Server 2000使用Tabular Data Stream协议来进行网络数据交换,如果不加密,所有的网络传输都是明文的,包括密码、数据库内容等,这是一个很大的安全威胁,能被人在网络中截获到他们需要的东西,包括数据库账号和密码。所以,在条件允许的情况下,最好使用SSL来加密协议,当然,这需要一个证书来支持。
(6)拒绝来自1434端口的探测
默认情况下,SQL Server使用1433端口监听,很多人都认为在SQL Server配置时要把这个端口改变,这样别人就不能很容易地知道使用的是什么端口了。可惜,通过Microsoft公司未公开的1434端口的UDP探测可以很容易地探测到一些数据库信息,如SQL Server使用的是什么TCP/IP端口,而且还可能遭到DOS攻击,让数据库服务器的CPU负荷增大。
在实例属性中选择TCP/IP的属性,选择隐藏SQL Server实例。如果隐藏了SQL Server 实例,则将禁止对试图枚举网络上现有的SQL Server实例的客户端所发出的广播做出响应。这样,别人就不能用1434来探测自己的TCP/IP端口了(除非使用Port Scan)。
此外,还可以使用IPSec过滤拒绝掉1434端口的UDP通信,尽可能地隐藏SQL Server。
(7)更改默认的TCP/IP端口1433
在上一步配置的基础上,应更改原默认的1433端口。在实例属性中选择网络配置中的TCP/IP的属性,将TCP/IP使用的默认端口变为其他端口。
(8)对网络连接进行IP限制
SQL Server 2000数据库系统本身没有提供网络连接的安全解决办法,但是Windows 2000提供了这样的安全机制。使用操作系统自己的IPSec可以实现IP数据包的安全性。对IP连接进行限制,只保证自己的IP能够访问,也拒绝其他IP进行的端口连接,把来自网络上的安全威胁进行有效的控制。
3.4 SQL注入攻击
3.4.1 SQL注入概述
结构化查询语言SQL是用来和关系数据库进行交互的文本语言。它允许用户对数据进行有效的管理,包括对数据的查询、操作、定义和控制等几个方面,如向数据库写入、插入数据,从数据库读取数据等。
SQL注入是应用程序在向后台数据库传递SQL查询时,如果没有对攻击者提交的SQL查询适当的过滤,则会引发SQL注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和功能。SQL注入不只是一种会影响Web应用的漏洞:对于任何从不可信源获取输入的代码来说,如果使用了该输入来构造动态的SQL语句,那么就很可能受到攻击。
3.4.2 SQL注入产生的原因
SQL注入产生的原因有以下几点。
① 在应用程序中使用字符串联结方式组合SQL指令。
② 在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用sa这个内置的最高权限的系统管理员账户连接Microsoft SQL Server数据库)。
③ 在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)。
④ 太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。
3.4.3 SQL注入的特点
SQL注入的特点如下。
① 隐蔽性强:利用Web漏洞发起对Web应用的攻击纷繁复杂,包括SQL 注入、跨站脚本攻击等,一个共同特点是隐蔽性强,不易发觉,因为一方面普通网络防火墙是对HTTP/HTTPS全开放的;另一方面,对Web应用攻击的变化非常多,传统的基于特征检测的IDS对此类攻击几乎没有作用。
② 攻击时间短:可在短短几秒到几分钟内完成一次数据窃取、一次木马种植,完成对整个数据库或Web服务器的控制,以至于非常困难做出人为反应。
③ 危害性大:目前几乎所有银行、证券、电信、移动、政府以及电子商务企业都提供在线交易、查询和交互服务。用户的机密信息包括账户、个人私密信息(如身份证)、交易信息等,都是通过Web存储于后台数据库中。这样,在线服务器一旦瘫痪,或虽在正常运行,但后台数据已被篡改或者窃取, 都将造成企业或个人巨大的损失。据权威部门统计,目前身份失窃(identity theft)已成为全球最严重的问题之一。政府网站被攻击和篡改造成恶劣的社会影响甚至被外来势力所利用, 已经在危害着社会的稳定。
3.4.4 SQL注入攻击的危害
SQL注入攻击的危害有以下几方面。
① 数据表中的数据外泄,如个人机密数据,账户数据,密码等。
② 数据结构被黑客探知,得以做进一步攻击(例如执行SELECT * FROM sys.tables)。
③ 数据库服务器被攻击,系统管理员账户被窜改(例如执行ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
④ 取得系统较高权限后,有可能得以在网页加入恶意链接以及XSS。
⑤ 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如执行xp_cmdshell "net stop iisadmin"可停止服务器的IIS服务)。
⑥ 破坏硬盘数据,瘫痪全系统(例如执行xp_cmdshell "FORMAT C:")。
3.4.5 SQL注入攻击分析
例如,某个网站的登录验证的SQL查询代码为:
strSQL = "SELECT FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
攻击者在填写用户名密码表单时恶意填入如下信息:
userName = "1' OR '1'='1"; 和passWord = "1' OR '1'='1";
这时,将导致原本的SQL字符串被修改。因为代码strSQL = "SELECT FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"在WHERE语句后面的条件判断结果都会变成True,也就是实际上运行的SQL命令会变成了strSQL = "SELECT *FROM users;",因此实现无账号密码,亦可登录网站。
3.4.6 SQL注入类型
(1)不正确的处理类型
如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:
statement := "SELECT * FROM data WHERE id = " + a _variable + ";"
从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1;DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成:
SELECT * FROM DATA WHERE id = 1;DROP TABLE users;
(2)数据库服务器中的漏洞
有时,数据库服务器软件中也存在着漏洞,如MYSQL服务器中mysql_real_escape_string()
函数漏洞。这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的SQL注入式攻击。在数据库字符集设为GBK时是可能被绕过的。
(3)盲目SQL注入式攻击
当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。
(4)条件响应
有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值:SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1
这会导致一个标准的面面,而语句:SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2。在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个表中的某字段内容设计可以评判真伪的语句。
(5)条件性差错
如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起错误的语句,从而导致一个SQL错误。例如:SELECT 1/0 FROM users WHERE username='Ralph'。显然,如果用户Ralph存在的话,被零除将导致错误。
(6)时间延误
时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。
3.4.7 SQL注入防范
① 在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。
② 在组合SQL字符串时,针对所传入的参数作字符取代(将单引号字符取代为连续2个单引号字符)。
③ 如果使用PHP开发网页程序的话,可以打开PHP的魔术引号(Magic quote)功能(自动将所有的网页传入参数,将单引号字符取代为连续2个单引号字符)。
④ 使用其他更安全的方式连接SQL数据库。例如,已修正过SQL注入问题的数据库连接组件,如ASP.NET的SqlDataSource对象或是LINQ to SQL。
⑤ 使用SQL防注入系统。
实训2 SQL注入实战
【实训目的】
- 了解SQL注入原理。
- 熟悉SQL注入步骤和过程。
- 掌握SQL注入常用工具的使用。
【实训原理】
SQL注入是针对Web应用程序的主流攻击技术之一,2007年、2010年和2013年在OWASP组织公布的Top 10中一直都排在第一位,SQL注入通过利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码,从而造成了数据库信息泄露、攻击者对系统未授权访问等危害极高的后果。
SQL注入是由于Web应用程序对用户输入的信息没有正确的过滤以消除SQL语言中的字符串转义字符,如(’)、(”)、(`)、(;)、(%)、(#)等,或者没有对输入信息进行严格的类型判断,从而使得用户可以输入并执行一些非预期的SQL指令。
【实训步骤】
下面以testfire.net网站为例(testfire.net是IBM公司为了演示其著名的Web应用安全扫描产品AppScan的强大功能所建立的一个测试网站,是一个包含很多典型Web漏洞的模拟银行网站),本次测试其用户登录页面(见图3.3)。
① 首先打开登录页面http://testfire.net/back/login.aspx。
② 在Username和Password表单分别输入“ admin' ”进行测试,如图3.4所示。
③ 单击“Login”按钮提交表单后,会出现如图3.5所示的错误。
④ 出现错误的原因。出现错误的根本原因是因为网站没有对用户的输入进行最基本的过滤处理,而且我们也可以根据反馈的出错信息,分析得出网站进行用户验证时使用的SQL语句:
Select * from [users] where username = ? and password =?
这种SQL验证语句是没有经过任何处理的、极度危险的,因此我们可以通过构造特殊的表单值使得该查询的条件表达式结果永远为真。
⑤ 构造查询结果永远为真的条件表达式。
构造的语句如下:
Select * from [users] where username = 'admin' or '1' and password = 'admin' or '1'
该句话使得SQL查询语句的条件永远为真是因为,在SQL中逻辑运算符的优先级or低于and,所以or '1' 是永远为真,条件表达式的结果也总是为真。
⑥ 验证我们的构造结果。
返回到登录页面,在Username表单中输入“ admin 'or' 1 ”,在Passowrd表单中输入“ admin 'or' 1 ”,单击“Login”按钮,在弹出的页面中显示已经成功登录进入了网站的后台,如图3.6所示。
【实验报告】
根据前面对SQL注入语句原理的分析和理解,学习各类SQL语句,构造其他的SQL语句来绕过验证进入后台。(提示 “ admin' or 1=1 – ” ,“ -- ”是SQL语句中的注释。)