首页 理论教育 网络本身存在的威胁及防护策略

网络本身存在的威胁及防护策略

时间:2023-06-09 理论教育 版权反馈
【摘要】:某些网络协议实现是很多安全缺陷的源头,攻击者可以利用所有这些错误。“../”问题网页服务器代码应该一直在一个受到限制的环境中运行。以此类推,“../..”就是当前位置的祖父目录。ciwebhits&file=../../../../../winnt/system32/autoexec.nt应用代码错误用户的浏览器与网页服务器之间传递着一种复杂而且无状态的协议交换。i1=459012&p1=1599该URL意味着用户已经选择了一张编号为459012的CD,单价是15.99美元。

网络本身存在的威胁及防护策略

1.协议的缺陷

网络协议是网络的基础,协议的缺陷是网络安全威胁的根源之一。互联网联盟为了详细检查所有Internet协议,而将它们公开张贴出来。每一种被接受的协议都被分配了一个Internet(Request For Comment,RFC)标准(草案)编号。在协议被接受成为一个标准之前,许多协议中存在的问题就已经被那些敏锐的检查者发现并得到了校正。

但是,协议的定义是由人制定和审核的,协议本身可能是不完整的,也难免存在某些缺陷。某些网络协议实现是很多安全缺陷的源头,攻击者可以利用所有这些错误。特别是下述软件的故障:SNMP(网络管理)、DNS(寻址服务)和E-mail服务(如SMTP和S/MIME)。虽然不同的厂商会编写实现他们自己服务的代码,但他们常常基于通用(有缺陷)的原型。这样,在Windows操作系统上成功的交互,有可能在UNIX操作系统上失效。例如,针对SNMP缺陷(漏洞代码:107186),CERT报告列出了建议使用的近200套不同的实现方案。

2.网站漏洞

因为网络几乎完全暴露在用户面前,所以非常脆弱。如果用户使用应用程序,一般不会获取并查看程序代码。而对于网站来说,攻击者可能会下载网站代码,然后离线长时间研究它。对于程序而言,几乎不能控制使用哪种顺序访问程序的不同部分,但是,网站攻击者可以控制以哪种顺序访问网页,甚至直接访问网页5,而不按1到4的顺序访问。攻击者也能选择提供哪种数据,以及用不同的数据进行实验,以测试网站的反应。简而言之,攻击者在挑战控制权方面具有某些“优势”。

(1)网站被“黑”

一种广为人知的攻击方式是网站被“黑”。这不仅是因为其结果是可见的,而且实施起来也比较容易。由于网站的设计使得代码可以下载,这就允许攻击者能够获取全部超文本文档和在加载进程中与客户相关的所有程序。攻击者甚至可以看到编程者在创建或者维护代码时遗留下来的注解。下载进程实质上为攻击者提供了一份该网站的规划图。

(2)缓冲区溢出

网页也存在缓冲区溢出问题。攻击者向一个程序中输入大量数据,比预期所要接收的数据多得多。由于缓冲区的大小是有限的,所以过剩的数据就会溢出到相邻的代码和数据区域中去。

最知名的网页服务器缓冲区溢出也许就是被称为iishack的文件名问题了。这种攻击方式如此著名,以至于被写进了一个程序中(参见http://www.technotronic.com)。只需提供要攻击的站点和攻击者想要服务器执行的程序的URL作为参数,攻击者就可以执行该程序实施攻击。

其他网页服务器对于极长的参数字段也很容易发生缓冲区溢出错误,如长度为10000的密码或者填充大量空格或空字符的长URL。

(3)“../”问题

网页服务器代码应该一直在一个受到限制的环境中运行。在理想情况下,网页服务器上应该没有编辑器xterm和Telnet程序,甚至连绝大多数系统应用程序都不应该安装。通过这种方式限制了网页服务器的运行环境以后,即使攻击者从网页服务器的应用程序区跳到了别处,也没有其他可执行程序可以帮助攻击者使用网页服务器所在的计算机和操作系统来扩大攻击的范围。用于网页应用程序的代码和数据可以采用手工方式传送到网页服务器。

但是,相当多的应用软件程序员喜欢在存放网页应用程序的地方编辑它,因此,他们认为有必要保留编辑器和系统应用程序,以提供一个完整的开发环境。

第二种阻止攻击的方法是创建一个界地址来限制网页服务器应用程序的执行区域。有了这样一个界地址,服务器应用程序就不能从它的工作区域中跳出来访问其他具有潜在危险的系统区域(如编辑器和系统应用程序)了。服务器把一个特定的子目录作为根目录,服务器需要的所有东西都放在以此根目录开始的同一个子树中。

无论是在UNIX还是Windows操作系统中,“..”都代表某一个目录的父目录。以此类推,“../..”就是当前位置的祖父目录。因此,可以输入文件名的用户每输入一次“..”就可以进入到目录树的上一层目录。Cerberus Information Security的分析家们发现微软索引服务器的扩展文件webhits.dll中就存在这个漏洞。例如,传递如下的URL会导致服务器返回请求的autoexec.nt文件,从而允许攻击者修改或者删除它:

http://yoursite.com/webhits.htw?ciwebhits&file=../../../../../winnt/system32/autoexec.nt

(4)应用代码错误

用户的浏览器与网页服务器之间传递着一种复杂而且无状态的协议交换。网页服务器为了使自己的工作更轻松一些,向用户传递一些上下文字符串,而要求用户浏览器用全部上下文进行应答。一旦用户可以修改这种上下文内容,就会出现问题。

下面用一个假想的销售站点来说明这个问题。用CDs-r-us来称呼该站点,它出售CD。在某一个特定时刻,该站点的服务器可能有很多个交易正处于不同的状态。该站点显示了供订购的货物清单网页,用户选择其中的一种货物,站点又显示出更多的货物,用户又选择其中的几种,如此进行下去,直到用户结束选择为止。然后,很多用户会通过指定付账和填入邮购信息继续完成这份订单,但也有一些用户使用像这样的网站作为在线目录或者指南,而没有实际订购货物的意图。例如,他们想使用该站点来查询某人最近出版CD的价格;也可能使用在线书籍服务来确定有多少某作家编写的书正在销售。或者,即使用户确实有购物的诚意,有时也会由于网页连接失败而留下一个不完整的交易。正是考虑到这些因素,网页服务器常常通过一些紧跟在URL之后的参数字段来跟踪一个还没有完成的订单的当前状态。随着每一个用户的选择或者页面请求操作,这些字段从服务器传递到浏览器,然后又返回给服务器。

假设用户已经选择了一张CD,网页服务器就会传递给用户一个与此类似的URL。

http://www.CDs-r-us.com/buy.asp?i1=459012&p1=1599

该URL意味着用户已经选择了一张编号为459012的CD,单价是15.99美元。现在,当用户选择了第二张CD时,网页服务器会传递给用户一个类似的URL。

http://www.CDs-r-us.com/buy.asp?i1=459012&p1=1599&i2=365217&p2=1499

如果攻击者“经验丰富”,就会知道在用户浏览器的地址窗口中的URL是可以编辑的。两张CD的单价都可以修改!

在第一次需要显示价格的时候,服务器会设置(检查)每一项物品的价格。但后来,被检查过的数据项失去了控制,而没有对它们进行复核。这种情况经常出现在服务器应用程序代码中,因为应用程序编程人员常常没有意识到其中存在的安全问题,以至于常常对一些恶意的举动没有预见性。

(5)服务器端包含问题

一种具有代表性的更严重问题被称为服务器端包含(Server-Side Include)问题。该问题利用了一个事实:网页中可以自动调用一个特定的函数。例如,很多页面的最后都显示了一个“请与我联系”链接,并使用一些Web命令来发送电子邮件消息。这些命令(如E-mail、if、goto和include等)都被置于某一个区域,以便转换成HTML。

其中一种服务器端包含命令称为exec,用于执行任意一个存放于服务器上的文件。例如,以下服务器端包含命令:

<!-#execcmd="/usr/bin/telnet&"->

上述命令会以服务器的名义(也就是说,具有服务器的特权)打开一个在服务器上运行的Telnet会话。攻击者会对执行像chmod(改变一个对象的访问权限)、sh(建立一个命令行解释器)或者cat(复制到一个文件)这样的命令很感兴趣。

3.拒绝服务

可用性攻击,有时称为拒绝服务或者DoS攻击,在网络中比在其他的环境中更加值得重视。可用性或持续服务面临着很多意外或者恶意的威胁。

(1)传输故障

有很多原因会导致通信故障。例如,电话线被切断;网络噪声使得一个数据包不能被识别或者不能被投递;传输路径上的一台设备出现软件或者硬件故障;一台设备因维修或者测试而停止服务;某台设备被太多任务所淹没,从而拒绝接收其他输入数据,直到所有过载数据被清除为止。在一个主干网络(包括Internet)中,其中的许多问题都是临时出现或者能够自动恢复(通过绕道的方式)的。

然而,一些故障却很不容易修复。例如,连接到用户使用的计算机的唯一一根通信线路(如从网络到用户的网卡或者连到用户的Modem上去的电话线)被折断了,就只能通过另外接一根线或者修理那根被损坏的线来进行恢复。

站在另一个立场来看,所有可以切断线路、干扰网络或者能使网络过载的行为都可以造成用户得不到服务。这说明来自物理上的威胁是相当明显的。

(2)连接泛洪

最早出现的拒绝服务攻击方式是使连接出现“泛滥”。如果一名攻击者给用户发送了太多数据,以至于用户的通信系统疲于应付,这样,就没空接收任何其他数据了。即使偶尔有一两个来自其他用户的数据包被用户收到,他们之间的通信质量也会出现严重降级。

一些更为狡猾的攻击方式使用了Internet协议中的元素。除了TCP和UDP以外,Internet协议中还有一类协议,即网间控制报文协议(Internet Control Message Protocol,ICMP),通常用于系统诊断。这些协议与用户应用软件没有联系。ICMP包括如下内容。

●Ping:用于要求某个目标返回一个应答,目的是看目标系统是否可以到达以及是否运转正常。

●Echo:用于请求一个目标将发送给它的数据发送回来,目的是看连接链路是否可靠(Ping实际上是Echo的一个特殊应用)。

●Destination Unreachable:用于指出一个目标地址不能被访问。

●Source Quench:意味着目标即将达到处理极限,数据包的发送端应该在一段时间内暂停发送数据包。

虽然以上协议对于网络管理有着重要的作用,但是它们也可能被攻击者用于对系统的攻击。由于这些协议都是在网络堆栈中进行处理的,所以在接收主机端检测或者阻塞这种攻击是很困难的。下面说明怎样使用其中的两种协议来进行攻击。

1)响应索取。这种攻击发生在两台主机之间。chargen是一个用于产生一串数据包的协议,常常用于测试网络的容量。攻击者在主机A上建立起一个chargen进程,以产生一串包,作为对目标主机B的响应包。然后,主机A生成一串包发送给主机B,主机B通过响应它们,返回这些包给主机A。这一系列活动使得网络中包含主机A和主机B部分的基础设施进入一种无限循环状态。更有甚者,攻击者在发送第一个包的时候,将它的目标地址和源地址都设置成主机B的地址,这样,主机B就会陷入一个循环之中,不断地对它自己发出的消息做出应答。

2)死亡之Ping。死亡之Ping(Ping of Death)是一种简单的攻击方式。因为Ping要求接收者对Ping请求做出响应,故攻击者所要做的事情就是不断地向攻击目标发送大量的Ping,以图淹没攻击目标。然而,这种攻击要受攻击路径上最小带宽的限制。如果攻击者使用的是10Mbit/s带宽的连接,而到攻击目标的路径带宽为100Mbit/s甚至更高,那么,单凭攻击者自身是不足以淹没攻击目标的。但是,如果将两个数字对换一下,即攻击者使用100Mbit/s带宽的连接,而到攻击目标的路径带宽为10Mbit/s,那么攻击者可以轻易地淹没攻击目标。这些Ping包将会把攻击目标的带宽堵塞得满满当当。

3)Smurf。Smurf攻击是Ping攻击的一个变体。它采用与Ping攻击方式相同的载体——Ping包,但使用了另外两种手法。首先,攻击者需要选择不知情的受害者所在的网络。攻击者假造受害者的主机地址作为Ping包中的源地址,以使Ping包看起来像是从受害者主机发出来的一样。然后,攻击者以广播模式(将目标地址的最后一个字节全部设置为1)向网络发送该请求,这些广播包就会发布给网络上的所有主机,如图6-1所示。

978-7-111-39843-1-Chapter06-1.jpg

图6-1 Smurf攻击

4)同步泛洪。同步泛洪(SYN Flood)是另一种流行的拒绝服务攻击。这种攻击利用了TCP协议族,使用这些面向会话的协议来实施攻击。

对于一个协议(如Telnet),在协议的对等层次之间将建立一个虚拟连接,称为一个会话(Session),以便对Telnet终端模仿自然语言中来来回回、有问有答的交互过程进行同步。三次TCP握手建立一个会话。每一个TCP包都有一些标记位,其中有两个标记位表示SYN(同步)和ACK(应答)。在开始一次TCP连接时,连接发起方发送一个设置了SYN标记的包。如果接收方准备建立一个连接,就会用一个设置了SYN和ACK标记的包进行应答。然后,连接发起方发送一个设置了ACK标记的包给接收方,这样就完成了建立一个清晰完整的通信通道的交换过程,如图6-2所示。

978-7-111-39843-1-Chapter06-2.jpg

图6-2 三次连接握手

包在传输过程中偶尔会出现丢失或者损坏的情况。因此,在接收端维持着一个称为SYN_RECV连接的队列,用于跟踪已经发送了SYN-ACK信号但还没有收到ACK信号的项。在正常情况下,这些工作在一段很短的时间内就会完成。但如果SYN-ACK(2)或者ACK(3)包丢失,最终目标主机会由于这个不完整的连接超时而将它从等待队列中丢掉。

攻击者可以通过发送很多SYN请求而不以ACK响应,从而填满对方的SYN_RECV队列来对目标进行拒绝服务攻击。通常SYN_RECV队列相当小,如只能容纳10个或者20个表项。由于在Internet中存在潜在的传输延迟,通常在SYN_RECV队列中保留数据的时间最多可达几分钟,因此,攻击者只需要每隔几秒钟发送一个新的SYN请求,就可以填满该队列。

攻击者在使用这种方法的时候,通常还要做一件事情:在初始化SYN包中使用一个不存在的返回地址来欺骗对方。为什么这样做呢?有两个原因:第一,攻击者不希望泄露真实的源地址,以免被通过检查SYN_RECV队列中的包而试图识别攻击者的人认出来。第二,攻击者想要使这些伪造的SYN包与用于建立真实连接的合法SYN包没有区别。为每个包选择一个不同的(骗人的)源地址,以使它们是唯一的。一个SYN-ACK包发往一个不存在的地址会导致网络发出一个“目标不能到达”的ICMP报文,但这不是TCP所期待的ACK信号,因为TCP和ICMP是不同的协议组,所以,一个ICMP应答不需要返回到发送者的TCP处理部分。

5)Teardrop。Teardrop攻击滥用了设计来改善网络通信的特性。一个网络IP数据报是一个变长的对象。为了支持不同的应用和不同的情况,数据报协议允许将单个数据单元分片,即分成小段数据,分别发送。每个分片可表明其长度和在数据单元中的相对位置。接收端负责重新将分片组装成单个数据单元。

在Teardrop攻击中,攻击者发送一系列数据报,这些数据报不能被正确组装在一起。第一个数据报表明它的位置在长度为60B的数据单元的位置0处,第二个数据报表明它在长度为90B的数据单元的位置30处,第三个数据报表明它在长度为173B的数据单元的位置41处。因为这3个分片是重叠的,所以不能正确重组。在极端情况下,操作系统将把不能重组的数据单元部分锁住,从而导致拒绝服务。

(3)流量重定向

路由器工作在网络层,是一种在源主机所在网络与目标主机所在网络之间,通过一些中间网络来向前传递消息的设备。因此,如果攻击者可以破坏寻址,就不能正确传递消息。

路由器使用复杂的算法来决定如何进行路径选择。不管采用何种算法,从本质上说都是为了寻找一条最好的路径(在这里,“最好”是通过一些综合指标来进行衡量的,如距离、时间、费用和质量等)。每一个路由器只知道与它共享相同网络连接的路由器,路由器之间使用网关协议来共享一些信息,这些信息是关于彼此之间的通信能力的。每一个路由器都要向它的相邻路由器通告它自己到达其他网络的路径情况。这个特点可以被攻击者利用来破坏网络。(www.xing528.com)

路由器只是一台带有两块或者更多网卡的计算机。假设一台路由器向它的所有相邻路由器报告:它到整个网络的每一个其他地址都有最好的路径。很快,所有路由器都会将所有通信传递到该路由器。这样,这台路由器就会被大量通信所淹没,或者只能将大多数通信一丢了之。无论出现哪一种情况,都会造成大量通信永远不能到达预期的目标。

(4)DNS攻击

最后一种拒绝服务攻击是一类基于域名服务器(Domain Name Server,DNS)的攻击。DNS是一张表,用于将域名转换成对应的网络地址,这个过程称为域名解析。域名服务器在遇到它不知道的域名时,通过向其他域名服务器提出询问来进行解析。出于效率的考虑,它会将收到的答案存储起来,以便将来再解析该域名的时候能够更快一些。

在绝大多数采用UNIX实现域名服务的系统中,域名服务器运行的软件称为BIND(Berkeley Internet Name Domain)或者Named(Name Daemon)。在BIND中存在着一些缺陷,包括缓冲区溢出缺陷。

通过接管一个域名服务器或者使其存储一些伪造的表项(称为DNS缓存中毒),攻击者可以对任何通信进行重定向,这种方式带有明显拒绝服务的含义。

2002年10月,大量泛洪流量淹没了顶级域名DNS服务器,这些服务器构成了Internet寻址的基石。大约一半的流量仅来自200个地址。虽然人们认为这些问题是防火墙的误配置,但至今没有人确知是什么引起了攻击。

2005年3月,一次攻击利用了Symantec防火墙的漏洞,该漏洞是允许修改Windows机器中的DNS记录。但这次攻击的对象不是拒绝服务。在这次攻击中,“中招”的DNS缓存重定向用户到广告网站,这些广告网站在每次用户访问网站时进行收费。同时,这次攻击也阻止用户访问合法网站。

4.分布式拒绝服务(DDoS)

上面所列举的拒绝服务攻击本身就已经非常具有威力了,但是,攻击者还可以采取一种两阶段的攻击方式,攻击效果可以扩大很多倍。这种乘数效应为分布式拒绝服务攻击提供了巨大威力。攻击者发起DDoS攻击的第一步是在Internet上寻找有漏洞的主机并试图侵入,入侵成功后在其中安装“后门”或者木马程序;第二步是在入侵各主机上安装攻击程序,由程序功能确定其扮演的不同角色;第三步由各部分主机“各司其职”,在攻击者的调遣下对目标主机发起攻击,制造数以百万计的数据分组流入欲攻击的目标,致使目标主机或网络极度拥塞,从而造成目标系统的瘫痪。

与DoS攻击一次只能运行一种攻击方式攻击一个目标不同,DDoS攻击可以同时运用多种DoS攻击方式,也可以同时攻击多个目标。攻击者利用成百上千个被“控制”结点,向受害结点发动大规模的协同攻击。通过消耗带宽、CPU和内存等资源,造成被攻击者性能下降,甚至瘫痪和死机,从而造成合法用户无法正常访问。与DoS攻击相比,其破坏性和危害程度更大,涉及范围更广,更难发现攻击者。DDoS攻击原理如图6-3所示。

978-7-111-39843-1-Chapter06-3.jpg

图6-3 DDoS攻击原理图

(1)攻击者

攻击者可以是网络上的任何一台主机。在整个攻击过程中,它是攻击主控台,向主控机发送攻击命令,包括被攻击者主机地址,控制整个攻击过程。攻击者与主控机的通信一般不包括在DDoS工具中,可以通过多种连接方法完成,最常用的有Telnet TCP终端会话,还可以是绑定到TCP端口的远程Shell和基于UDP的客户/服务器远程Shell等。

(2)主控机

主控机和代理主机都是攻击者非法入侵并控制的一些主机,它们分成了两个层次,分别运行非法植入的不同的攻击程序。每个主控机控制一部分代理主机,主控机有其控制的代理主机的地址列表,它监听端口接收攻击者发来的命令后,将命令转发给代理主机。主控机与代理主机的通信根据DDoS工具的不同而有所不同。例如,Trinoo使用UDP,TFN使用ICMP,Stacheldraht使用TCP和ICMP。

(3)代理主机

代理主机运行攻击程序,监听端口接收和运行主控机发来的命令,是真正进行攻击的机器。

(4)被攻击者

被攻击者可以是路由器、交换机或主机。遭受攻击时,它们的资源或带宽被耗尽。防火墙、路由器的阻塞还可能导致恶性循环,加重网络拥塞情况。

除了巨大的乘数效应以外,也很容易通过脚本来实施分布式拒绝服务攻击,这也是一个严重的问题。只要给出一套拒绝服务攻击方式和一种特洛伊木马繁殖方式,就可以很容易地写出一个程序来植入特洛伊木马,该特洛伊木马就可以用任何一种或者所有的拒绝服务攻击方法实施攻击。DDoS攻击工具最早出现于1999年,包括TFN(Tribal Flood Network)、Trin00及TFN2K(Tribal Flood Network,Year 2000 Edition)。随着一些新弱点的发现,特洛伊木马的植入方式也随之发生了一些改变,而且,随着一些新的拒绝服务攻击方式被发现,也相应出现了一些新的组合工具。

5.来自活动代码或者移动代码的威胁

活动代码(Active Code)或者移动代码(Mobile Code)是对被“推入”到客户端执行的代码的统称。网页服务器为什么要浪费宝贵的资源和带宽去做那些客户工作站能做的简单工作呢?例如,假设想让你的网站上出现一些熊跳着舞跨过页面顶部的画面。为了下载这些正在跳舞的熊,你可能会在这些熊每一次运动的时候下载一幅新图片:向前移动一点,再向前移动一点,如此继续下去。然而,这种方法占用了服务器太多的时间和带宽,因为需要服务器来计算这些熊的位置并下载很多新的图片。一种更有效利用(服务器)资源的方式是直接下载一个实现熊运动的程序,让它在客户端计算机上运行即可。

下面介绍不同种类活动代码的相关潜在弱点。

(1)Cookie

严格来说,Cookie不是活动代码,而是一些数据文件,远程服务器能够存入或获取Cookie。然而,由于Cookie的使用可能造成从一个客户端到服务器的不期望的数据传送,所以它的一个缺点就是失去了机密性。

Cookie是一个数据对象,可以存放在内存中(一次会话Cookie),也可以为将来使用而存储在磁盘上(持久Cookie)。Cookie可以存储浏览器允许的与客户端相关的任何内容:用户按键、机器名称、连接详细内容(如IP地址)、日期和类型等。在服务器命令控制下,浏览器将Cookie的内容发送给服务器。一次会话Cookie在关闭浏览器的时候被删除,而持久Cookie却可以保留一段预先设定的日期,可能是未来的几年时间。

Cookie为服务器提供了一个上下文。通过使用Cookie,某些主页可以使用“欢迎回来,James Bond”这样的欢迎词来对用户表示欢迎,或者反映出用户的一些选择,如“我们将把该订单上的货物邮寄到Elm大街135号,对吗?”但是,正如以上两个例子所显示的那样,任何人只要拥有了某人的Cookie,他在某些情形中就代表着这个人。这样,任何人只要窃听或者获得了一个Cookie,就可以冒充该Cookie的所有者。

Cookie中究竟包含着关于用户的哪些信息呢?尽管这些都是用户的信息,但绝大多数时间用户都不会知道Cookie里边到底是些什么内容,因为Cookie的内容是使用一个来自服务器的密钥加过密的。

因此,Cookie会占用用户的磁盘空间,保存着一些用户不能看到但与用户相关的信息,能传递给服务器但用户不知道服务器什么时候想要它,服务器也不会通知用户。

(2)脚本

客户可以通过执行服务器上的脚本来请求服务。通常情况是,网页浏览器显示一个页面,当用户通过浏览器与网站进行交互时,浏览器把用户输入的内容转化成一个预先定义好的脚本中需要的参数,然后,它发送这个脚本和参数给服务器执行。但是,所有通信都是通过HTML来进行的,服务器不能区分这些命令到底是来自一个浏览器上的用户完成一个主页后提交的,还是一个用户手工写出来的。一些怀有恶意的用户可能会监视一个浏览器与服务器之间的通信,观察怎样改变一个网页条目可以影响浏览器发送的内容,及其后服务器会做出何种反应。具备了这些“知识”,怀有恶意的用户就可以操纵服务器的活动了。

来看看这种操纵活动有多么容易。首先,要记住程序员们通常不能预见到的恶意举动;事实正好相反,程序员们认为用户都是合法的,会按照程序预先设定的操作规程来使用一个程序。正是由于这个原因,程序员们常常忽略过滤脚本参数,以保证用户的操作是合理的,而且执行起来也是安全的。一些脚本允许包含到任何文件中,或者允许执行任何命令。攻击者可以在一个字符串中看到这些文件或命令,并通过改变它们来做一些实验。

一种广为人知的针对网页服务器的攻击方式是Escape字符(Escape-Character)攻击。一种常用于网页服务器的脚本语言——公共网关接口(Common Gateway Interface,CGI)定义了一种不依赖于具体机器的方法来对通信数据编码。按照编码惯例,使用%nn来代表特殊的ASCII字符。例如,%0A(行结束)指示解释器将紧接着的一些字符当做一个新的命令。下面的命令是请求复制服务器的密码文件:

http://www.test.com/cgi-bin/query?%0a/bin/cat%20/etc/passwd

CGI脚本也可以直接在服务器上启动一个动作。例如,如果攻击者观察到一个CGI脚本中包含着如下格式的一个字符串:

<!--#action argl=valuearg2=value-->

则攻击者用以下字符串替代上述字符串后,提交一个命令:

<!--#exec cmd="rm*"-->

这就会引起命令行解释器执行一个命令删除当前目录下的所有文件。

微软的动态服务器页面(Active Server Page,ASP)也具有像脚本一样的能力。这些页面指导浏览器怎样显示文件、维护上下文以及与服务器交互。因为它们在浏览器端也可以被看到,所以任何存在于ASP代码中的编程漏洞都可用于侦察和攻击。

服务器永远不要相信来自客户端的任何东西,因为远程用户可以向服务器发送手工写出来的字符串,用以代替由服务器发送给客户端的善意的程序。正是由于有如此多的远程访问方式,所有这些例子证明了这样一点:如果某用户允许其他人在他的机器上运行程序,那他的机器就不会有绝对的安全保障。

(3)活动代码

通过以下几个步骤就可以开始显示主页:产生文本,插入图片,并通过鼠标单击来获取新页。很快,人们就在他们的站点上使用了一些精心设计的内容:蹒跚学步的孩子在页面上跳舞、三维旋转的立方、图片时隐时现、颜色不断改变,以及显示总数等。其中,特别是涉及运动的小技巧显然会占用重要的计算能力,还需要花费大量时间和通信资源从服务器上把它们下载到客户端。然而,通常情况下,客户端自身有一个有能力却没有充分利用的处理器,因此,无需担心活动代码占用客户端计算时间的问题。

为了充分利用处理器的能力,服务器可以下载一些代码到客户端去执行。这些可执行代码称为活动代码(Active Code)。两种主要的活动代码是Java代码(Java Code)和ActiveX控件(ActiveX Control)。

1)Java代码。敌意的Applet(Hostile Applet)是一种可以下载的Java代码,会对客户系统造成损害。由于Applet在下载以后失去了安全保护,而且通常以调用它的用户的权限运行,因此敌意的Applet会造成严重破坏。Dean等列举了安全执行Applet的几种必要条件:

●系统必须控制Applet对重要系统资源的访问,如文件系统、处理器、网络、用户显示和内部状态变量等。

●编程语言必须通过阻止伪造内存指针和数组(缓冲区)溢出来保护内存。

●在创建新对象时,系统必须通过清除内存内容来阻止对象的重用;在不再使用某些变量时,系统应该使用垃圾回收机制来收回所占用的内存。

●系统必须控制Applet之间的通信,以及控制Applet通过系统调用对Java系统外的环境产生的影响。

2)ActiveX控件。微软公司针对Java技术的应对措施是ActiveX系列。使用ActiveX控件以后,任何类型的对象都可以下载到客户端。如果该客户端有一个针对这种对象类型的阅读器或者处理程序,就可以调用该阅读器来显示这个对象。例如,下载一个微软Word的.doc文件就会调用系统上安装的Word程序来显示该文件。对于那些客户端没有相应处理程序的文件将会导致下载更多的其他代码。正是由于这个特点,从理论上来说,攻击者可以“发明”一种新的文件类型,如称为.bomb的类型,就会导致那些毫无戒心的用户在下载一个包含.bomb文件的主页时,也随同下载了可以执行.bomb类型文件的代码。

为了阻止任意下载文件,微软公司使用了一种鉴别方案,在这种鉴别方案下,下载的代码是有密码标记的,而且在执行之前需要验证签名。但是,鉴别验证的仅仅是源代码,而不是它们的正确性或者安全性。来自微软公司(Netscape或者任何其他生产商)的代码并不是绝对安全的,具有未知来源的代码可能会更安全,但也可能更不安全。以前的事实证明:不论代码来自何处,用户都不能假设它到底有多好或者有多安全。况且,有些弱点还可以允许ActiveX绕过这种鉴别。

(4)根据类型自动执行

数据文件是通过程序进行处理的。对于某些产品而言,文件类型是通过文件的扩展名来表示的,如扩展名为.doc的文件是一个Word文档,扩展名为.pdf,即可移植文档格式(Portable Document Format)的文件是一个Adobe Acrobat文件,而以.exe为扩展名的文件是一个可执行文件。在许多系统中,当一个具有某种扩展名的文件到达时,操作系统会自动调用相应的处理程序来处理它。

把一个Word文档本身当做一个可执行文件是让人难以理解的。为了阻止人们通过输入名字作为命令来运行文件Temp.doc,微软公司在文件中内置了它的真实类型。只需要在Windows文件浏览器窗口中双击该文件,就可以激活相应的程序来处理这个文件。

但是,这种方案也为攻击者提供了一个机会。一个“怀有恶意”的代理可能会给用户发送一个名为innocuous.doc的文件,使用户以为它是一个Word文档。由于它的扩展名是.doc,因此Word程序会试图打开它。假设该文件被重命名为innocuous(没有扩展名.doc),但如果内置的文件类型是.doc,那么双击innocuous也会激活Word程序打开该文件。这个文件中可能包含着一些“不怀好意”的宏命令,或者通过请求打开另一个更危险的文件。

在通常情况下,可执行文件是危险的,而文本文件相对比较安全,一些带有活动内容的文件(如.doc文件)介于两者之间。如果一个文件没有明显的文件类型,将会使用它内置的文件处理程序来打开。攻击者常常使用没有明显文件类型的方法来隐藏一个“怀有恶意”的活动文件。

(5)蠕虫(Bot)

蠕虫(Bot)是黑客机器人,是在远程控制的一段有恶意的代码。这些目标代码是分布在大量受害者主机的特洛伊木马。如果忽略它们消耗的计算机资源和网络资源,由于它们不干扰或损害用户的计算机,因而通常不易被察觉。

通过常用的网络,如在线聊天系统(Internet Relay Chat,IRC)通道、P2P网络(该网络通过Internet共享音乐),蠕虫之间或蠕虫与主控机之间进行相互协作。由蠕虫构成的网络称为Botnet,其结构类似于松散协作的Web站点,该结构允许任何一个蠕虫或蠕虫组失效,并存在多个连接通道用于信息与协调工作,因此,灵活性非常好。

Botnet常用于分布式拒绝服务攻击,从很多站点发起对受害者的并行攻击。它们也常常用于垃圾邮件或其他大邮件攻击,发送服务提供者发送极大邮件可能引起网络堵塞。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈