电子商务技术与安全
上QQ阅读APP看书,第一时间看更新

2.1.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 arg1=value arg2=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类文件的代码。

为了阻止任意下载文件,微软公司使用了一种鉴别方案,在这种鉴别方案下,下载的代码是有密码标记的,而且在执行前需要验证签名。但是,鉴别验证的仅仅是源代码,而不是它们的正确性或者安全性。来自微软公司的代码并不是绝对安全的,具有未知来源的代码可能会更加安全,但也可能更不安全。以前的事实证明,不论代码来自何处,用户都不能假设它到底有多好或者有多安全。况且,有些弱点还可以允许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文件)介于两者之间。如果一个文件没有明显的文件类型,将会使用它内置的文件处理程序来打开。攻击者经常使用没有明显文件类型的方法来隐藏一个“怀有恶意”的活动文件。