5.3 收集用户数据:浏览器扩展

除HTML表单外,另一种收集、确认并提交用户数据的主要方法是使用在浏览器扩展中运行的客户端组件(如Java或Flash)。最初用于Web应用程序时,浏览器扩展通常用于执行简单而基本的任务。如今,已经有越来越多的公司使用浏览器扩展来创建功能强大的客户端组件。这些组件在浏览器中运行,跨越多个客户端平台,提供相关反馈,提高灵活性,并与桌面应用程序协作。使用浏览器扩展的一个副作用是:由于速度和用户体验方面的原因,之前在服务器上执行的处理任务现在将在客户端完成。对某些应用程序(如网上交易应用程序)而言,速度至关重要,因此,许多关键的应用程序任务需要在客户端完成。为了提高速度,在开发应用程序时可能需要“有意” 以牺牲安全为代价,这可能是因为开发者误以为交易者全都是可信用户,或者浏览器扩展会自行防御恶意企图。但是,如我们在第2章以及本章前面部分讨论核心安全问题时所述,客户端组件不可能为自己的业务逻辑提供防御。

浏览器扩展可以通过输入表单、或者在某些情况下通过与客户端操作系统的文件系统或注册表交互,以各种不同的方式收集数据。在将收集到的数据提交给服务器之前,它们可以对这些数据执行任何复杂的确认和处理。而且,由于它们的内部工作机制与HTML表单和JavaScript相比更加不透明,开发者认为它们执行的确认更加难以躲避。为此,通过浏览器扩展查找Web应用程序中存在的漏洞往往能够获得更大的成果。

赌博组件是应用客户端控件的典型浏览器扩展。如前所述,客户端控件并不可靠,因此,如果使用在潜在攻击者的机器上本地运行的浏览器扩展来执行在线赌博应用程序,这种做法将非常具有诱惑力。如果游戏的任何一个部分由客户端而非服务器控制,攻击者就可以非常精确地对游戏进行控制,以提高获胜机率、改变规则、或更改返回给服务器的得分。这种情况将导致以下几种攻击。

img002 可能会使用客户端组件来维护游戏状态。这时,攻击者就可以在本地篡改游戏状态,从而在游戏中获得优势。

img002 攻击者能够避开客户端控件,并执行非法操作,以在游戏中获得优势。

img002 攻击者能够发现隐藏的功能、参数或资源,一旦调用这些功能、参数或资源,攻击者将可以非法访问服务器端资源。

img002 如果游戏中还有其他玩家,客户端组件可能会接收并处理其他玩家的信息,攻击者获知这些信息就能够在游戏中获得优势。

5.3.1 常见的浏览器扩展技术

常见的浏览器扩展技术包括Java applet、Flash和Silverlight。由于这些技术的用途基本相同,因此,它们也提供类似的安全功能:

img002 它们均编译成中间字节码;

img002 它们在提供沙盒执行环境的虚拟机中运行;

img002 它们可能会使用远程框架,这类框架采用序列化来传输复杂数据结构,或通过HTTP传送对象。

1.Java

Java applet在Java虚拟机(JVM)中运行,并采用由Java安全策略应用的沙盒。因为Java在Web发展的早期就已存在,并且其核心概念仍基本不变,因此,有大量知识和工具可用于对Java applet实施攻击或进行防御(如本章后面部分所述)。

2.Flash

Flash对象在Flash虚拟机中运行。和Java applet一样,Flash也要在主机上的沙盒中运行。此前,Flash主要用于传送动画内容。但随着较新版本的ActionScript的推出,现在Flash已经能够传送成熟的桌面应用程序。Flash最近的主要更新为ActionScript 3以及采用动作信息格式(AMF)序列 化的远程功能。

3.Silverlight

Silverlight是微软开发的与Flash类似的产品。同样,该产品主要用于启动各种桌面应用程序,允许Web应用程序在浏览器内的沙盒环境中提供精简的.NET体验。从技术上讲,任何兼容.NET的语言,从C#到Python,都可用于开发Silverlight,但C#是开发Silverlight最常用的语言。

5.3.2 攻击浏览器扩展的方法

针对使用浏览器扩展组件的应用程序实施攻击时,需要采用以下两种常用的技巧。

首先,可以拦截并修改浏览器扩展组件提出的请求及服务器的响应。在许多情况下,这是对浏览器扩展组件进行测试的最简单也是最快速的方法,但这时你可能会遇到各种限制。正在传输的数据可能经过模糊处理或加密,或者使用专门针对所用技术的方案进行了序列化。仅仅查看组件生成的流量,可能会忽略一些关键的功能或业务逻辑,而这些功能或逻辑只需对组件本身进行分析就可以发现。另外,在正常使用拦截代理服务器时也可能会遇到障碍;但是,通常情况下,通过仔细配置(如本章后面部分所述),完全可以克服这些障碍。

其次,可以直接针对组件实施攻击,并尝试反编译它的字节码,以查看其源代码;或者使用调试器与组件进行动态交互。这种方法的优点在于,如果进行得非常彻底的话,将能够确定组件支持或引用的所有功能。还能修改组件向服务器提交的请求中的关键数据,而无论这些数据采用何种模糊处理或加密机制。其缺点在于,这种方法可能相当费时,并且需要深入了解浏览器扩展组件所使用的技术和编程语言。

许多时候,最好是结合使用上述两种技巧。下面我们详细介绍这种技巧。

5.3.3 拦截浏览器扩展的流量

如果浏览器已配置为使用拦截代理服务器,并且应用程序使用浏览器扩展加载客户端组件,这时,该组件提出的请求将经过代理服务器。在某些情况下,这时就可以开始测试相关功能,因为攻击者能够以常规方式拦截并修改组件提出的请求。

在需要避开在浏览器扩展中实施的客户端输入确认的情况下,如果组件以透明方式向服务器提供经过确认的数据,那么,如5.2节所述,可以使用拦截代理服务器修改这些数据。例如,支持身份验证机制的浏览器扩展可能会收集用户证书,并对这些证书进行确认,然后在请求中以明文参数的形式向服务器提交这些证书。这时,攻击者不需要对组件本身进行任何分析或攻击,就可以轻松解除这种确认。

在其他情况下,测试浏览器扩展组件可能会遇到各种障碍。以下几节将讨论这些问题。

1.处理序列化数据

应用程序可能会首先对数据或对象进行序列化处理,然后再通过HTTP请求传送这些数据或对象。当然,通过检查原始的序列化数据,可以解译一些基于字符串的数据,但是,通常而言,需要对序列化数据进行解压缩才能了解这些数据。如果希望修改这些数据,以破坏应用程序的处 理过程,首先,需要解压缩序列化内容,对其进行必要的编辑,然后重新对其进行序列化处理。几乎可以肯定,直接编辑原始的序列化数据将破坏其格式,并在应用程序处理请求时导致解析错误。

每种浏览器扩展技术都具有各自处理HHTTP消息中数据的序列化方案。因此,通常渗透测试员可以根据所采用的客户端组件推断出相关数据的序列化格式,但是,任何时候,仔细检查相关HTTP消息才能确认序列化格式。

img007  Java序列化

Java语言本身支持对象序列化,而且,Java applet可能会以这种方式在客户端与服务器应用程序组件之间传送序列化数据结构。通常,包含序列化Java对象的消息很容易辨别,因为它们使用以下Content-Type消息头:

img121a

使用代理服务器拦截原始的序列化数据后,就可以通过Java对这些数据进行去序列化处理,以查看其中包含的原语数据项。

Dser是Burp Suite中的一个有用插件,该插件提供一个框架,可用于查看和处理Burp拦截的序列化Java对象。该工具将拦截到的对象中的原语数据转换为XML格式,以便于进行编辑。编辑相关数据后,Dser将重新对对象进行序列化,并对HTTP请求进行相应的更新。

可以在以下URL下载Dser并详细了解它的运行机制:

img121b

img007  Flash序列化

Flash使用自己的可用于在服务器和客户端组件之间传输复杂数据结构的序列化格式。通常,可以通过以下Content-Type消息头辨别动作信息格式(AMF):

img121c

Burp本身支持AMF格式。确定包含序列化AMF数据的HTTP请求或响应后,它会解压缩并以树状形式显示相关内容,以便于查看和编辑,如图5-5所示。在修改结构中的相关原语数据项后,Burp将重新对消息进行序列化,然后就可以将该消息转发给服务器或客户端,由它们进行处理。

img122

图5-5 Burp Suite支持AMF格式并允许查看和编辑去序列化数据

img007  Silverlight序列化

Silverlight应用程序能够利用.NET平台内置的Windows通信基础(WCF)远程框架。使用WCF的Silverlight客户端组件通常采用微软的用于SOAP的.NET二进制格式(.NET Binary Format for SOAP,NBFS)。可以通过以下Content-Type消息头辨别该格式:

img121d

Burp Proxy中的一个插件能够自动对NBFS编辑的数据进行去序列化,然后在Burp的拦截窗口中显示这些数据。在查看或编辑已解码的数据后,该插件会对数据重新进行编辑,然后将数据转发给服务器或客户端,由它们进行处理。

用于Burp的WCF 二进制SOAP插件由Brian Holyfield开发,可以从以下URL下载该插件:

img121e

2.拦截浏览器扩展流量时遇到的障碍

如果浏览器已设置为使用拦截代理服务器,代理服务器可能并不会拦截,或无法拦截浏览器扩展组件提出的请求。之所以出现这种情况,可能是由于组件的HTTP代理或SSL出现问题,或者二者同时出现问题。一般情况下,通过仔细配置代理服务器可解决这个问题。

第一个问题是,客户端组件可能并不执行在浏览器或计算机的设置中指定的代理配置。这是因为组件可能会在浏览器本身或扩展框架提供的API以外发出它们自己的HTTP请求。出现这种情况仍然可以拦截组件的请求,但需要修改计算机的hosts文件以实现拦截目的,同时将代理服务器配置为支持匿名代理,并自动重定向到正确的目标主机。更多详细信息,请参阅第20章。

另一个问题在于,客户端组件可能不接受拦截代理服务器提供的SSL证书。即使代理服务器使用的是一般自签名证书,并且浏览器已配置为接受这类证书,但浏览器扩展组件仍有可能拒绝此类证书。这可能是因为浏览器扩展组件不接受浏览器在暂时可信的证书方面的配置,或者因为组件本身以编程方式要求拒绝接受不可信的证书。无论是哪一种原因,都可以将代理服务器配置为使用一个主CA证书(用于为访问的每个站点的每台主机签署有效的证书),并在计算机的可信证书库中安装该CA证书,从而解决这个问题。更多详细信息,请参阅第20章。

有些时候,客户端组件还使用除HTTP以外的协议进行通信,而拦截代理服务器却无法处理这些协议。在这些情况下,仍然可以通过使用网络嗅探器或功能挂钩工具查看并修改相关流量。 Echo Mirage就是一个这样的工具,它能够注入进程并拦截套接字API调用,以便查看并修改数据,然后通过网络传送修改后的数据。可以从以下URL下载Echo Mirage:

img123a