Web应用程序黑客工具包

只需要使用一个标准的Web浏览器即可实施一些针对Web应用程序的攻击;然而,绝大多数攻击要求使用其他一些工具。许多这样的工具需要与浏览器组合在一起使用,以扩展的形式修改浏览器自身的功能,或者作为外部工具与浏览器同时运行,并修改它与目标应用程序的交互。

黑客工具包中最重要的工具属于后者,它作为Web拦截代理服务器运行,允许查看并修改浏览器与目标应用程序之间传送的所有HTTP消息。近些年来,基本的拦截代理服务器已经发展成为功能强大的集成工具套件,拥有大量旨在帮助黑客攻击Web应用程序的功能。本章将介绍这类工具的作用原理,并说明如何充分利用它们的功能。

第二类主要的工具为Web应用程序扫描器。这种产品旨在将攻击Web应用程序过程中的许多任务自动化,涵盖初步解析一直到探查漏洞等过程。我们将分析Web应用程序扫描器的内在优缺点,并简要介绍这个领域内几款当前市场领先的产品。

最后,还有很多定制的小型工具都可在测试Web应用程序时执行特定的任务。虽然渗透测试员可能只是偶尔使用这些工具,但事实证明,在特殊情况下,它们极其有用。

Web 浏览器

Web浏览器其实并不是一种攻击工具,而是访问Web应用程序的标准方法。然而,在攻击Web应用程序时,渗透测试员选择的Web浏览器会影响攻击效率。此外,还有各种针对不同类型浏览器的扩展可帮助渗透测试员实施攻击。本节将简要介绍3种流行的浏览器以及它们的一些扩展。

Internet Explorer

Microsoft的Internet Explorer(IE)是当前应用最广泛的Web浏览器。据估计,现在依然如此,IE市场占有率大约为45%。几乎所有的Web应用程序都针对IE设计,并通过IE进行测试,这使得它成为攻击者的首选浏览器,因为大多数应用程序的内容与功能都能够在IE中正确显示和使用。而且,其他浏览器本身并不支持ActiveX控件;因此,如果一个应用程序使用这种控件,就必须使用IE来浏览它。使用IE的局限性在于,与使用其他浏览器不同,它必须在Microsoft Windows平台上运行。

由于IE被人们广泛使用,因此,当测试跨站点脚本与其他针对应用程序用户的攻击时,应该始终确保攻击能够在这种浏览器上成功实施(请参阅第12章了解相关内容)。

 注解 Internet Explorer 8引入了一个默认处于启用状态的反XSS筛选器。如第12章所述,此筛选器会尝试阻止大多数标准的XSS攻击,因此,在针对目标应用程序测试XSS入侵程序时,该筛选器可能会导致问题。通常,在测试过程中应禁用该XSS筛选器。在确认某个XSS漏洞后,最好是重新启用该筛选器,看是否可以利用发现的漏洞找到避开该筛选器的方法。

以下IE扩展有助于攻击Web应用程序。

HttpWatch可分析所有HTTP请求与响应,提供消息头、cookie、URL、请求参数、HTTP状态码与重定向等信息(如图20-1所示)。

图20-1 HttpWatch对Internet Explorer发布的HTTP请求进行分析

IEWatch的功能与HttpWatch类似,同时还可分析HTTP文档、图像、脚本等。

Firefox

Firefox是当前第二大Web浏览器,据估计,市场占有率大约为35%。绝大多数Web应用程序可在Firefox上正常运行;但是,它本身并不支持ActiveX控件。

不同的浏览器在处理HTML方面存在许多细微的差异,特别是当HTML并不严格符合标准时。通常,如果一个应用程序针对跨站点脚本实施防御,这意味着针对它的攻击并不会对每种浏览器平台有效。Firefox的普及使得这种浏览器成为XSS攻击的主要目标;因此,如果在IE上实施XSS攻击遇到困难,应该尝试在Firefox上测试这些攻击。此外,之前,针对IE无效的许多攻击能够对Firefox实施,主要因为它的某些特有功能,参见第13章了解这方面的内容。

当攻击Web应用程序时,有大量Firefox浏览器扩展可供使用,如下所示。

Http Watch也适用于Firefox。

FoxyProxy能够灵活管理浏览器的代理设置,可实现迅速切换以及为不同的URL设置不同的代理等。

LiveHTTPHeaders可修改请求与响应,并重新发布个别请求。

使用PrefBar可启用或禁用cookie、快速进行访问控制检查、在不同代理服务器之间切换、清除缓存,以及打开浏览器的用户代理。

Wappalyzer可确定当前页面使用的各种技术,并在URL栏为发现的每一种技术显示一个图标。

Web Developer工具栏提供了大量有用功能。其中最重要的功能包括查看页面上的所有链接、更改HTML使表单字段可写、取消最大长度限制、显示隐藏表单字段,以及将请求方法由GET更改为POST。

Chrome

在浏览器领域,Chrome是一款相对较新的浏览器,但它迅速赢得用户的欢迎,并占领了约15%的市场。

攻击Web应用程序可能会用到各种Chrome浏览器扩展,如下所示。

XSS Rays,该扩展可用于测试XSS漏洞和DOM检测。

cookie编辑器,用于在浏览器中查看和编辑cookie。

Wappalyzer也可以用于Chrome。

Web Developer 工具栏也可以用于Chrome。

Chrome可能包含一些奇怪的功能,在构建针对XSS和其他漏洞的攻击时,这些功能可能会有用。由于Chrome是一款相对较新的浏览器,因此,在未来数年中,研究这些功能可能会取得一定的成果。

集成测试套件

当攻击Web应用程序时,除基本的Web浏览器外,工具包中最有用的工具为拦截代理服务器。在Web应用程序发展的早期,拦截代理服务器是一种独立的工具,它提供最基本的功能,Achilles代理服务器是尤其受推崇的一种,它显示每一个请求与响应,以方便对其进行编辑。虽然这款工具极其简单,存在许多缺陷,而且使用起来也不方便,但经验丰富的攻击者仍然可以利用它攻破许多Web应用程序。

近年来,这款简单的拦截代理服务器已经发展成为许多功能强大的工具套件,包含几种相互补充的工具,能够完成攻击Web应用程序过程中的常见任务。Web应用程序安全测试仪常用的测试套件如下所示:

Burp Suite

WebScarab

Paros

Zed Attack Proxy

Andiparos

Fiddler

CAT

Charles

这些工具包的功能各不相同,其中一些相对较新,并更具实验性。单纯就功能而言,Burp Suite是其中最为复杂全面的工具。当前,它是唯一包含以下几节介绍的所有功能的工具包。在某种程度上,选择使用哪些工具因个人喜好而异。我们建议没有任何喜好的测试员在现实应用中先选择几种套件,然后确定哪些工具最适合自己的需求。

本节介绍这些工具的工作原理,并说明在测试Web应用程序时充分利用这些工具的常用工作流程。

工作原理

上述每一种集成测试套件都由几种相互补充的工具组成,它们共享与目标应用程序有关的信息。通常,攻击者通过浏览器以正常方式攻击应用程序,这些工具监控生成的请求与响应,保存所有与目标应用程序有关的信息,并提供大量有用的功能。每一种套件由以下核心组件构成:

拦截代理服务器

Web应用程序爬虫

自定义Web应用程序漏洞测试器

漏洞扫描器

手动请求工具

分析会话cookie与其他令牌的工具

各种共享功能与实用工具

拦截代理服务器

拦截代理服务器是工具套件的核心,至今仍然是最基本的组件。要使用拦截代理服务器,必须配置浏览器,将它的代理服务器作为本地机器上的一个端口。同时配置代理工具监听这个端口,并接收由浏览器发布的所有请求。由于代理服务器能够访问浏览器与目标Web服务器之间的双向通信,因而它能够拦截它们之间传送的每一条消息,以方便用户审查和修改,并执行其他有用的功能,如图20-2所示。

图20-2 使用拦截代理服务器动态处理HTTP请求

配置浏览器

浏览器的配置过程相当简单。首先,确定拦截代理服务器默认使用哪一个本地端口监听连接(通常为8080端口),然后在浏览器上执行以下步骤。

在Internet Explorer中,选择“工具”→“Internet选项”→“连接”→“局域网设置”。确保没有选中“自动检测设置”与“使用自动配置脚本”复选框。确保选中“为LAN使用代理服务器”复选框。在“地址”栏中输入127.0.0.1;在“端口”栏中输入代理服务器使用的端口。单击“高级”按钮,确保选中“对所有协议均使用相同的代理服务器”复选框。如果所攻击的主机名称与“对于以下列字符开头的地址不使用代理服务器”框中的任何一个表达式相匹配,删除这些表达式。在所有对话框上单击“确定”按钮,确认重新配置。

在Firefox中,选择“工具”→“选项”→“高级”,选择“网络”选项卡,单击“连接”栏的“设置”按钮,确保选中“手动配置代理”选项。在“代理”栏中输入127.0.0.1;在“端口”栏中输入代理服务器使用的端口。如果所攻击的主机名称与“不使用代理”框中的任何一个表达式相匹配,删除这些表达式。在所有对话框上单击“确定”按钮,确认重新配置。

Chrome使用其所在的操作系统附带的本地浏览器的代理设置。在Chrome中,可以通过选择“选项”→“高级选项”→“网络”→“更改代理设置”访问这些设置。

处理“不支持代理”的客户端

有时,测试员需要测试使用在浏览器以外运行的厚客户端的应用程序。许多这类客户端并不提供任何用于配置HTTP代理服务器的设置。它们只是尝试直接连接到托管应用程序的Web服务器。这种行为导致测试员根本无法使用拦截代理服务器来查看和修改应用程序的流量。

幸好,在这种情况下,测试员可以利用Burp Suite提供的一些功能继续完成测试。为此,测试员需要执行以下步骤:

(1)修改操作系统hosts文件,将应用程序使用的主机名解析为测试员自己的回环地址(127.0.0.1)。例如:127.0.0.1 www.wahh-app.com这会导致厚客户端的请求被重定向到测试员自己的计算机。

(2)对于应用程序使用的每个目标端口(通常为80和443端口),在回环接口的这些端口上配置一个Burp Suite监听器,并将该监听器设置为支持匿名代理。匿名代理功能指监听器将接受厚客户端发送的非代理类型的请求(这些请求已被重定向到测试员的回环地址)。

(3)匿名模式代理支持HTTP和HTTPS请求。为防止SSL遇到致命的证书错误,可能需要将匿名代理监听器配置为显示包含厚客户端期望的特定主机名的SSL证书。下文将详细说明如果避免拦截代理服务器导致的证书问题。

(4)对于已使用hosts文件重定向的每个主机名,配置Burp将主机名解析为其原始的IP地址。这些设置位于Options→Connections→Hostname Resolution(选项→连接→主机名解析)下。测试员可以通过这些设置指定域名到IP地址的定制映射,以覆盖计算机自己的DNS解析。这样,Burp提出的出站请求将指出正确的目标服务器。(如果不执行此步骤,请求将在无限循环中重定向到测试员自己的计算机。)

(5)在匿名模式下运行时,Burp Proxy将确定应使用在请求中显示的Host消息头将每个请求转发到的目标主机。如果所测试的厚客户端未在请求中包含Host消息头,Burp将无法正确转发请求。如果只需处理一个目标主机,可以通过将匿名代理监听器配置为将所有请求重定向到所需目标主机来解决这一问题。但如果要处理多个目标主机,则需要在多台计算机上运行多个Burp实例,并使用hosts文件将每个目标主机的流量重定向到其他拦截服务器。

拦截代理服务器与HTTPS

如第3章所述,当处理未加密的HTTP通信时,拦截代理服务器与普通的Web代理服务器的工作原理基本相同。浏览器首先向代理服务器发送标准的HTTP请求,不同之处在于,请求第一行的URL包含目标Web服务器的完整主机名称。代理服务器将这个主机名称解析成一个IP地址,把请求转换为标准的非代理形式,然后将它转发给目标服务器。当该服务器做出响应时,代理服务器就会将响应转发给客户端浏览器。

对于HTTPS通信,浏览器首先使用CONNECT方法向代理服务器提出一个明文请求,指定目标服务器的主机名称与端口。如果使用普通的(非拦截)代理服务器,代理服务器就会以一个HTTP 200状态码做出响应,一直开放TCP连接,从此以后(对该连接而言)作为目标服务器的TCP级中继。然后,浏览器将与目标服务器进行一次SSL握手,建立一条安全信道,通过它传送HTTP消息。当使用拦截代理服务器时,为使代理服务器访问浏览器通过信道传送的HTTP消息,这个过程会稍有不同。如图20-3所示,用一个HTTP 200状态码响应CONNECT请求后,拦截代理服务器并不作为一个中继,而是在服务器端与浏览器进行SSL握手。它还作为一个SSL客户端,与目标Web服务器进行另一次SSL握手。因此,这个过程建立两条SSL信道,代理服务器则作为它们之间的“中间人”。这样,代理服务器就能够解密从每条信道收到的所有消息,以明文形式访问它们,然后重新对其进行加密,以通过另一条信道传送。

图20-3 通过拦截代理服务器查看和修改HTTPS通信

当然,如果攻击者处在适当的位置,他就能够拦截浏览器与目标服务器之间的通信,并且不会被发现;这时,由于SSL无法保护浏览器与服务器之间通信的隐秘性与完整性,它也就失去了作用。为此,当进行SSL握手时,就必须使用加密证书来验证每一方的身份,这点尤为关键。为了在服务器端与浏览器进行SSL握手,拦截代理服务器必须使用它自己的SSL证书,因为它并不知道目标服务器所使用的私钥。

在这种情况下,为防止攻击,浏览器会向用户提出警告,提醒他们检查伪造的证书,并自行决定是否信任该证书。图20-4为IE显示的警告。当然,当使用拦截代理服务器时,浏览器与代理服务器都完全由攻击者控制,因此它们将接受伪造的证书,并允许代理服务器建立两条SSL信道。

图20-4 使用采用HTTPS通信的拦截代理服务器将在攻击者的浏览器中生成警告

使用浏览器测试使用单一域的应用程序时,以这种方式处理浏览器安全警告和接受代理服务器的自造证书通常不会遇到问题。但是,在其他情况下仍有可能出现问题。当前的许多应用程序需要针对图像、脚本代码和其他资源提出大量跨域请求。在使用HTTPS时,每一个指向外部域的请求都会导致浏览器收到代理服务器的无效SSL证书。在这种情况下,浏览器通常不会向用户提出警告,因此也不会为用户提供接受每个域的无效SSL证书的选项。相反,浏览器通常会丢弃跨域请求,要么直接丢弃,要么显示一条警告,指出请求已被丢弃。

使用在浏览器以外运行的厚客户端时,代理服务器的自造SSL证书也会导致问题。通常,如果收到无效SSL证书并且无法接受该证书,将无法与这些客户端建立连接。

幸好,有一个简单的方法可以解决上述问题。在安装时,Burp Suite会为当前用户生成一个唯一的CA证书,并将该证书存储在本地计算机上。当Burp Proxy收到指向新域的HTTPS请求时,它会为这个域动态创建新的主机证书,并使用以上CA证书签署此证书。这意味着用户可以在其浏览器(或其他信任库)中将Burp的CA证书安装为可信根证书。这样,为所有主机生成的证书被视为有效证书,因而避免了代理服务器导致的所有SSL错误。

安装CA证书的精确方法因浏览器和平台而异。基本上,安装过程包括以下步骤。

(1)使用浏览器通过代理服务器访问任何HPPTS URL。

(2)在生成的浏览器警告中,展开证书链,在证书树(称为PortSwigger CA)中选择根证书。

(3)将此证书作为可信根证书或证书颁发机构导入浏览器。可能需要先导出此证书,然后再单独将其导入(因浏览器而异)。

有关在不同浏览器上安装Burp CA证书的详细说明,请参阅位于以下URL的Burp Suite在线文档:

http://portswigger.net/burp/help/servercerts.html

共同特性

除拦截和修改请求与响应这种核心功能外,拦截代理服务器还包含大量其他特性(如下所示),可帮助渗透测试员提高攻击Web应用程序的效率。

详细的拦截规则。根据目标主机、URL、方法、资源类型、响应码或出现的特殊表达式(见图20-5)等标准拦截消息,然后审查或暗中转发这些消息。在一般的应用程序中,渗透测试员对绝大多数的请求与响应都不感兴趣,他可以利用这项功能配置代理服务器仅标记感兴趣的消息。

图20-5 Burp代理服务器支持详细的请求与响应拦截规则

所有请求与响应的详细历史记录。通过它可审查之前传送的消息,并可将它们传送给套件中的其他工具,以进行深入分析(参见图20-6)。可以过滤和搜索拦截历史记录,从而迅速查找特定数据项,还可以标注感兴趣的条目,以便将来引用。

图20-6 代理服务器历史记录,允许攻击者通过代理服务器查看、过滤、搜索和标记请求和响应

用于动态修改请求与响应内容的自动匹配与替换规则。这项功能的用途广泛,例如,在所有请求中修改某个cookie或其他参数的值,删除缓存指令,用User-Agent消息头模拟某个特殊的浏览器,等等。

除客户端UI外,直接通过浏览器访问代理服务器的功能。渗透测试员可以使用这项特性浏览代理历史,从浏览器中重新发布请求,从而以正常方式处理并拦截响应。

操纵HTTP消息格式的实用工具,如在不同的请求方法与内容编码之间进行转换。有时,渗透测试员还可以使用这些工具优化跨站点脚本之类的攻击。

能够实时自动地修改某些HTML特性,如显示隐藏表单字段,删除输入字段限制以及删除JavaScript表单确认。

Web应用程序爬虫

Web应用程序爬虫的工作机制与传统的Web爬虫类似:请求Web页面,解析这些页面,从中查找指向其他页面的链接,然后向它们提出请求;继续这个过程,直到查明一个站点的全部内容。为适应功能性Web应用程序与传统Web站点之间的差异,应用程序爬虫不仅需要实现其核心功能,还要应对其他各种挑战,如下所示。

基于表单的导航,使用下拉列表、文本输入和其他方法。

基于 JavaScript的导航,如动态生成的菜单。

要求按预定顺序执行操作的多阶段功能。

验证与会话。

使用基于参数的标识符,而非URL,指定不同的内容与功能。

在URL查询字符串中出现令牌和其他易变参数,导致确定特殊内容出现问题。

集成测试套件通过在拦截代理服务器与爬虫组件之间共享数据,解决了上述几个问题。这样,渗透测试员就能够以正常方式使用目标应用程序,由代理服务器处理所有请求,并将其提交给爬虫进行深入分析。因此,浏览器将会留意任何不常见的导航、验证与会话处理机制,允许渗透测试员完全控制爬虫,彻底搜索应用程序的内容。这种由用户指导的抓取技巧已在第4章详细介绍了。收集到尽可能多的信息后,爬虫就可以自行进行深入调查,进而发现其他内容与功能。

下面是Web应用程序爬虫所执行的常用功能。

使用通过拦截代理服务器访问的URL自动更新站点地图。

被动抓取代理服务器处理的内容,从中解析出链接,无须请求这些链接就将它们添加到站点地图中(见图20-7)。

图20-7 被动抓取结果,以灰色显示的条目没有经过请求,但通过被动抓取确认了

以表格和树状形式呈现所发现的内容,方便对这些结果进行搜索。

对自动抓取的范围进行细化控制。这样就可以指定爬虫抓取的主机名称、IP地址、目录路径、文件类型等,以对某一个特殊的功能区域进行抓取,防止爬虫访问目标应用程序基础架构之内或之外的无关链接。这项功能还有助于防止爬虫抓取管理接口之类的强大功能,因为这样做可能会导致危险的负面影响,如删除用户账户。它还可用于防止爬虫请求退出功能,使当前会话失效。

自动解析HTML表单、脚本、注释和图像,并在站点地图内分析这些内容。

解析JavaScript内容,查找URL与资源名称。即使应用程序并没有使用完整的JavaScript引擎,这项功能也有助于爬虫发现基于JavaScript的导航,因为它们通常以字面量的形式出现在脚本中。

使用适当的参数根据用户的指导自动提交表单(见图20-8)。

图20-8 Burp爬虫根据用户的指导提交表单

探查自定义的“文件未发现”响应。当请求一个无效的资源时,许多应用程序返回一条HTTP 200消息。如果爬虫无法识别这种消息,得到的内容地图就可能包含错误信息。

检查robots.txt文件,该文件提供一份列出禁止抓取的URL黑名单,但攻击爬虫可以利用它发现其他内容。

自动获取所有枚举出的目录的根目录。这些内容可用于检查目录列表或默认内容(请参阅第17章了解相关内容)。

自动处理和使用由应用程序发布的cookie,在通过验证的会话中进行抓取。

自动测试每个页面的会话依赖性。这包括使用和不使用收到的cookie请求的每个页面。如果提出的两种请求得到相同的内容,那么该页面不需要会话或验证即可访问。这种功能可用于探查一些访问控制漏洞(请参阅第8章了解相关内容)。

发布请求时自动使用正确的Referer消息头。一些应用程序可能会检查这个消息头的内容,这项功能可确保爬虫尽可能以类似于普通浏览器的方式运行。

控制在自动抓取过程中使用的其他HTTP消息头。

控制提出的自动抓取请求的速度与顺序,避免这些请求令攻击目录崩溃;如有必要,确保抓取在隐秘状态下进行。

应用程序测试器

虽然仅使用手动技巧也可以成功实施攻击,但是,要成为一名真正成熟的Web应用程序渗透测试员,必须在攻击过程中利用自动化工具,提高攻击速度与效率。第14章已经详细介绍了如何使用自动化工具。集成测试套件中的每一个工具都具有自动完成各种常见任务的功能。以下是各种工具套件的主要功能。

手动配置常见漏洞扫描。渗透测试员可以利用这项功能准确控制使用哪些攻击字符串,以及如何将它们合并到请求中并审查其结果,确定任何有助于深入调查的不常见的或反常的响应。

一组内置的攻击有效载荷和易变函数,以用户定义的方式生成任意有效载荷。例如,根据畸形编码、字符置换、蛮力、从前某个攻击中获得的数据等。

能够保存扫描响应数据,将其用在报告中,或者合并到其他攻击中。

查看和分析响应的定制化功能。例如,可根据特定表达式或有效载荷自身是否出现查看和分析响应(参见图20-9)。

图20-9 使用Burp Intruder测试漏洞练习的结果

从应用程序的响应中提取有用数据的功能。例如,从“用户资料”页面解析用户名和密码字段。当利用会话处理和访问控制等漏洞时可以用到这项功能。

Web漏洞扫描器

一些集成测试套件提供扫描常见Web应用程序漏洞的功能,所执行的扫描主要分为以下两类。

被动扫描,包括监视通过本地代理服务器传递的请求和响应,以确定各种漏洞,如提交明文密码、cookie配置错误以及跨域Referer泄露。可以以非入侵的方式对使用浏览器访问的任何应用程序执行此类扫描。在确定渗透测试的效果时,此功能往往非常有用,通过它可以确定应用程序相对于上述漏洞的安全状态。

主动扫描,包括向目标应用程序发送请求来探查各种漏洞,如跨站点脚本、HPPT消息头注入和文件路径遍历。和任何其他主动测试一样,此类测试可能会非常危险,只有在获得应用程序所有者的同意后才可以实施。

相比于本章后面部分讨论的独立扫描器,测试套件中包含的漏洞扫描器需要用户执行更多配置。用户不能仅仅提供起始URL并让扫描器抓取和测试应用程序,相反,用户可以指示扫描器如何测试应用程序,精确控制扫描哪些请求,并收到有关单个请求的实时反馈。以下是集成测试套件扫描功能的一些典型用法。

手动解析应用程序的内容后,可以选择站点地图中感兴趣的功能区域并由扫描器扫描这些区域。这有助于将可用时间用于扫描最关键的区域,并更迅速地获得扫描结果。

手动测试单个请求时,作为补充,可以在测试时扫描每个特定的请求。这样做可以立即获得与这些请求包含的常见漏洞有关的反馈,从而为手动测试提供指导并对其进行优化。

可以使用自动抓取工具抓取整个应用程序,然后扫描发现的所有内容。这个过程与独立Web扫描器的基本行为类似。

在Burp Suite中,可以在浏览器中激活实时扫描,然后使用浏览器指导扫描器的扫描范围,并迅速收到与提出的每个请求有关的反馈,而无须手动确定要扫描的请求。图20-10显示了实时扫描的结果。

图20-10 使用BurpScanner浏览时的实时扫描结果

虽然集成测试套件中的扫描器的设计用途不同于独立扫描器,但是,我们将在本章后面部分讲到,在某些情况下,这些扫描器的核心扫描引擎非常强大,其能力甚至优于主流的独立扫描器。

手动请求工具

发布一个请求并查看它的响应是集成测试套件中的手动请求组件的基本功能。虽然非常简单,但在以下情况下,这项功能可提供极大帮助:尝试性地探查一个漏洞,需要多次手动发布同一个请求,并调整请求元素以确定应用程序的行为所受到的影响。当然,也可以使用一个独立的工具(如Netcat)来完成这项任务。但是,如果将这项功能内置在套件中,就可以迅速从其他组件(代理服务器、爬虫或漏洞测试器)中获取感兴趣的请求,对其进行手动调查。而且,手动请求工具还可以得益于套件执行的各种共享功能,如HTML呈现、支持下行代理(downstream proxy)与验证、自动上传Content-Length消息头。图20-11是一个手动重新发布的请求。

图20-11 使用BurpRepeater手动重新发布的请求

以下是各种手动请求工具的主要功能。

与其他套件组件相互整合,能够与其他组件相互传递任何请求,以进行深入调查。

保存所有请求与响应的历史记录,完整记录所有手动请求,以方便进一步审查。同时还能够获取一个之前已经修改的请求,以进行深入分析。

包含多个选项卡的界面,一次可以处理几个不同的项目。

能够自动跟踪重定向。

会话令牌分析器

一些测试套件提供各种分析功能,可用于分析应用程序使用的需要不可预见性的会话cookie和其他令牌的随机性。Burp Sequencer是一种强大的工具,可以对任意大小的令牌样本的随机性进行标准的统计测试,并以可访问的格式提供详细结果。图20-12显示了Burp Sequencer工具,有关该工具的详情,请参阅第7章。

图20-12 使用BurpSequencer测试应用程序会话令牌的随机性

共享功能与实用工具

除核心组件外,集成测试套件还提供大量其他“附加值”功能,以满足渗透测试员在攻击Web应用程序时面临的特殊需求。以下是各种套件的主要功能。

分析HTTP消息结构,包括解析消息头与请求的参数,以及解压常见序列化格式(见图20-13)。

图20-13 分析请求与响应的HTTP结构与参数

在响应中呈现HTML内容,就像在浏览器中那样。

能够以文本和十六进制格式显示和编辑消息。

所有请求与响应中的搜索功能。

手动编辑消息内容后,自动上传HTTP Content-Length消息头。

内置编码器与解码器,能够迅速分析cookie与请求参数中的应用程序数据。

比较两个响应,突出显示其不同之处。

自动化内容发现与攻击面分析。

能够在磁盘上保存当前测试会话,并检索已保存的会话。

支持“下行”代理和SOCKS代理,允许将不同的工具组合在一起,或者通过所在的组织或ISP使用的代理服务器访问应用程序。

在工具内支持HTTP验证方法,允许在应用这些方法的环境(如企业局域网)中使用套件的所有功能。

支持客户端SSL证书,允许攻击使用这些证书的应用程序。

处理更隐蔽的HTTP特性,如gzip内容编码、块传输编码与状态码为100的过渡响应。

可扩展性,使用第三方代码可任意修改和扩展内置功能。

可以安排各种常规任务,如抓取和扫描,而无须手动控制。

保留工具选项配置,帮助在下次运行套件时恢复到某个特殊设置。

平台独立性,可在所有常用操作系统上运行这些工具。

测试工作流程

使用集成测试套件的典型工作流程如图20-14所示。每个测试阶段所涉及的关键步骤将在整本书中详细介绍,并在第21章的方法论中列出。此处介绍的工作流程说明了测试套件的不同组件与该方法论之间的对应关系。

图20-14 使用集成测试套件的典型工作流程

在此工作流程中,测试员将使用浏览器推动整个测试流程。在通过拦截代理服务器浏览应用程序时,测试套件将编译以下两类关键信息。

代理服务器历史记录,记录通过代理服务器传送的每一个请求和响应。

站点地图,记录在目标的目录树视图中发现的所有项目。

(注意,在以上两种情况下,显示器的默认过滤器可能会隐藏某些通常在测试时没有用处的项目。)

如第4章所述,在测试应用程序时,测试套件通常会对发现的内容进行被动抓取。这一操作将使用通过代理服务器传送的所有请求更新站点地图,并添加基于代理服务器传送的响应确定(通过解析链接、表单、脚本等)的项目。使用浏览器手动确定应用程序的可见内容后,还可以使用“爬虫”和“内容查找”功能主动探查应用程序的其他内容。这些工具的输出表单也将添加到站点地图中。

解析应用程序的内容和功能后,就可以开始评估它的受攻击面。受攻击面是各种功能和请求的集合,测试员应对其进行仔细检查,以尝试发现和利用相关漏洞。

通常,在测试漏洞时,可以从代理服务器拦截窗口、代理服务器历史记录或站点地图中选择项目,然后将这些项目传送给其他工具,以执行特定的任务。如前所述,可以使用模糊测试探查基于输入的漏洞,并实施其他攻击,如截取敏感信息;可以通过漏洞扫描器使用被动和主动技巧自动查找常见漏洞;可以使用令牌分析器工具测试会话cookie和其他令牌的随机性;还可以使用请求Repeater修改单个请求,然后不断提出这个请求,以探查漏洞或利用已发现的缺陷。通常,测试员需要在这些不同的工具之间来回传送各个项目。例如,测试员可以从模糊测试攻击中选择某个感兴趣的项目,或选择由漏洞扫描器报告的问题,并将其传送给请求Repeater,以验证漏洞是否存在,或对攻击进行优化。

通常,对于许多类型的漏洞,测试员需要返回浏览器以作进一步调查,确认某个明显的漏洞是否确实存在,或测试正在进行的攻击。例如,使用漏洞扫描器或请求Repeater发现跨站点脚本漏洞后,可以将生成的URL粘贴到浏览器中,以确认概念验证攻击是否会执行。测试可能的访问控制漏洞时,可以查看当前浏览器会话中特定请求的结果,以在特定用户权限下确认这些结果。如果发现可用于提取大量信息的SQL注入漏洞,浏览器是显示相关结果的最有利的位置。

测试员并不需要严格遵循本节介绍的工作流程,也不应受到该流程的任何限制。在许多情况下,可以直接在浏览器或代理服务器拦截窗口中输入意外输入来测试漏洞。一些漏洞可能会立即在请求和响应中表露出来,而无须使用任何更具针对性的工具。为实现特定的目的,可以引入其他工具,还可以以本节并未介绍的创新性方式,甚至连工具开发者都未想到的方式组合使用测试套件的各个组件。利用各种相互关联的特性,集成测试套件可发挥非常强大的功能。在使用它们时越有创造性,就越有可能发现最隐秘的漏洞。

拦截代理服务器替代工具

应该在工具包中始终保留一个工具,以备在极少数常用的基于代理服务器的工具无法使用的情况下使用。在需要使用非标准的验证方法直接或通过企业代理服务器访问应用程序,或者应用程序使用不常用的客户端SSL证书或浏览器扩展时,往往需要使用替代工具。在这些情况下,因为拦截代理服务器会中断客户端与服务器之间的HTTP连接,使用基于代理服务器的工具可能无法访问应用程序的一部分或全部功能。

这时,常规的替代方法是使用内嵌在浏览器内的工具监控和操纵浏览器生成的HTTP请求。从理论上讲,此时客户端执行的全部操作以及向服务器提交的所有数据,仍然由测试员完全控制。如果希望拥有控制权,可以编写完全定制的浏览器来执行所需的任何任务。使用这些浏览器扩展的目的在于帮助标准浏览器迅速高效地实现其功能,而不会干扰浏览器与服务器之间的网络层通信。因此,测试员可以通过这种方法向应用程序提交任意请求,同时使用浏览器与存在问题的应用程序进行正常通信。

Internet Explorer与Firefox都有大量扩展,它们的功能基本相似。我们将分别举出一个示例,同时也建议测试员首先试用各种扩展,然后再从中选择最适合自己的一种。

还要注意,与主要的工具套件相比,当前浏览器扩展的功能有限。它们不能进行任何抓取、模糊测试或漏洞扫描,而且使用它们必须完全手动操作。但是,在某些情况下仍然需要使用它们,因为它们可帮助渗透测试员对攻击目标实施仅使用标准浏览器无法实现的全面攻击。

Tamper Data

Tamper Data是一个Firefox浏览器扩展。任何时候,只要提交一个表单,Tamper Data就会弹出一个对话框,显示与请求有关的所有信息(包括HTTP消息头与参数),并允许查看和修改这些内容,如图20-15所示。

图20-15 在Firefox中使用TamperData修改HTTP请求

TamperIE

TamperIE是一个Internet Explorer浏览器扩展,它的功能与Firefox浏览器的Tamper Data扩展的功能基本相同,如图20-16所示。

图20-16 在Internet Explorer中使用TamperIE修改HTTP请求

独立漏洞扫描器

有许多工具可自动对Web应用程序进行漏洞扫描。这些扫描器的主要优点是,能够在相对较短的时间内测试大量功能,并且能够发现常见应用程序中存在的各种重要漏洞。

Web应用程序漏洞扫描器能够自动执行本书中介绍的各种测试技巧,包括应用程序抓取,查找默认与常见内容,以及探查常见的漏洞。在解析应用程序的内容后,扫描器将浏览它的功能,在每个请求的每一个参数中提交一系列测试字符串,然后分析应用程序的响应,从中查找常见漏洞的签名。接下来,扫描器生成一个报告,描述它发现的每一个漏洞。通常,这份报告中包括用于诊断每一个被发现的漏洞的请求与响应,允许经验丰富的用户对它们进行手动调查,确认漏洞是否存在。

决定是否以及何时使用一个漏洞扫描器的关键在于,理解这些工具的内在优缺点与在开发它们的过程中面临的挑战。这些考虑事项还会影响能否充分利用一个自动扫描器,以及如何解释与是否信任它的扫描结果。

扫描器探测到的漏洞

使用扫描器可以相当可靠地探测到几种常见的漏洞。这些漏洞都有非常明显的签名。有些情况下,这些签名就在应用程序的常见请求与响应中。还有些情况下,如果确定漏洞已经存在,扫描器会发送一个专门设计的请求,以触发它的签名。如果签名出现在应用程序对这个请求的响应中,那么扫描器就可据此推断,漏洞确实存在。

下面列出几个可以通过这种方法探测到的漏洞。

反射型跨站点脚本漏洞。如果用户提交的输入未经过适当的净化,在应用程序的响应中“反射”回来,就会出现这种漏洞。自动扫描器通常会发送包含HTML标记的测试字符串,然后在响应中搜索这些字符串,从而确定许多这种类型的漏洞。

一些SQL注入漏洞可通过某个签名确定。例如,提交一个单引号可能会导致应用程序返回一条ODBC错误消息;或者,提交字符串'; waitfor delay ‘0:0:30’-- 可能会造成时间延迟。

一些路径遍历漏洞可通过提交一个针对某个已知文件(如win.ini或/etc/passwd)的遍历序列,然后在请求中搜索该文件是否出现,从而进行确定。

一些命令注入漏洞可通过注入一个引起时间延迟,或者将某个特殊的字符串“反射”到应用程序的响应中的命令确定。

直接目录列表可通过请求目录路径,然后寻找一个包含看似为目录列表的文本的响应,从而加以确定。

明文密码提交、范围宽泛的cookie、激活自动完成的表单等漏洞可通过审查应用程序提出的常见请求与响应有效确定。

通常,使用不同的文件扩展名请求每个枚举出的资源,可以发现在主要的公布内容中没有提供链接的数据,如备份文件和资源文件。

对上面的许多漏洞而言,有时候,使用一个标准的攻击字符串和签名无法有效探测到相同类型的漏洞。例如,为阻止基于输入的漏洞,应用程序会执行某种使用专门设计的输入即可避开的不完善的输入确认。普通的攻击字符串将被阻止或净化;但是,经验丰富的攻击者能够探查到应用程序实施的输入确认,并找到避开这种确认的方法。其他情况下,标准的攻击字符串可能会触发一个漏洞,但不会生成想要的签名。例如,许多SQL注入攻击并不会导致应用程序向用户返回任何数据或错误消息;同样,路径遍历漏洞也不会让目标文件的内容在应用程序的响应中直接返回。

此外,有几种重要的漏洞并没有明确的签名,使用一组标准的攻击字符串也无法发现它们。通常,自动扫描器并不能发现这种类型的漏洞。下面是一些扫描器无法准确判定的漏洞。

不完善的访问控制。这种漏洞可使用户能够访问其他用户的数据,或者允许低权限用户访问管理功能。扫描器不了解应用程序的访问控制要求,也不能评估使用任何特殊的用户账户发现的各种功能和数据的重要性。

通过修改参数值给应用程序的行为造成影响的攻击。例如,修改一个表示商品价格或订单状态的隐藏字段。扫描器并不了解任何参数在实现应用程序功能过程中所发挥的作用。

其他逻辑错误,如使用负值突破交易限额,或者通过省略一个关键的请求参数避开账户恢复过程的某个阶段。

应用程序功能设计方面的漏洞,如脆弱密码强度规则,从登录失败消息中枚举用户的功能,以及保密性不强的忘记密码提示。

会话劫持攻击。攻击者可在应用程序的会话令牌中找到一个序列,伪装成其他用户。即使扫描器能确定某个参数在连续登录过程中使用了一个可以预测的值,但它仍然不能理解修改该参数导致出现的不同内容的意义。

泄露敏感信息,如用户名列表和包含会话令牌的日志。

一些漏洞扫描器尝试检查上述某些漏洞。例如,某些扫描器尝试以两个不同的用户身份登录,并确定一名用户无须正确授权即可访问的数据和功能,以此确定访问控制漏洞。根据笔者的经验,这些类型的检查通常会生成大量错误警报和漏报。

在前面列出的两组漏洞中,每一组都包含明显的漏洞,也就是那些可被技术尚不熟练的攻击者发现和利用的漏洞。因此,虽然自动扫描器能够探查到应用程序中存在的大部分明显的漏洞,但它还是会遗漏许多这类漏洞,其中包括一些非常明显的漏洞,只要进行手动扫描即可探测到。自动扫描器根本不能提供任何保证,证明应用程序中不存在一些可被攻击者轻易发现和利用的严重漏洞。

同样,对于当前必须经过严格测试的、更注重安全的应用程序而言,其中存在的漏洞更多的是那些出现在第二个列表而不是第一个列表中的漏洞。

扫描器的内在限制

市场上最优秀的漏洞扫描器是由那些认真思考如何探查各种Web应用程序漏洞的专家所设计和执行的。无疑,他们设计的扫描器仍不能有效发现许多类型的漏洞。要设计一个完全自动化的Web应用程序测试方法,我们面临着各种内在的障碍。只有拥有成熟的人工智能引擎,远远超越当前扫描器性能的系统,才能有效突破这些障碍。

Web应用程序各不相同

Web应用程序与网络和基础架构截然不同。通常,后者大多采用标准配置的非定制产品。从理论上讲,我们可以提前为所有可能的目标构建一个数据库,然后创建一个工具探查网络和基础架构中存在的漏洞。但是,我们却不能以这种方式探查定制Web应用程序中的漏洞;因此,任何高效的扫描器必须能够预见意外的情况。

扫描器不理解语法

计算机擅长分析应用程序响应的语法内容,能够识别常见的错误消息、HTTP状态码与被复制到Web页面中的用户提交的数据。然而,今天的扫描器并不能理解这些内容的语法意义,也不能根据这些意义做出合理的判断。例如,在更新购物篮的功能中,扫描器能够查看提交给该功能的大量参数。扫描器并不知道哪个参数表示数量,哪个参数表示价格。另外,它也不能判定修改订单的数量并不符合逻辑,而可修改其价格则代表一个严重的漏洞。

扫描器不会“即兴”处理

许多Web应用程序使用非标准的机制处理会话与导航,传送和处理数据,例如,通过查询字符串、cookie或其他参数。人类立即能够注意到并解析这些不常用的机制,但计算机会继续遵循它的标准规则。而且,许多针对Web应用程序的攻击需要某种“即兴”处理,例如,部分避开有效的输入过滤,或者利用应用程序行为的几个不同方面为攻击创造条件。通常,扫描器没有能力实施这些攻击。

扫描器并无直觉

计算机并不能凭直觉发现最佳的攻击方法。今天的扫描器采用的攻击方法,是对每一项功能尝试每一种攻击。这种方法在所能执行的检查种类以及组合这些检查的方式上存在着诸多限制。在许多情况下,这种方法往往会忽略漏洞的存在,如下所示。

一些攻击需要在一个多阶段处理过程的一个或几个阶段提交专门设计的输入,然后完成整个处理过程,并观察处理结果。

一些攻击需要改变应用程序执行某个多阶段处理的预定顺序。

一些攻击需要以专门设计的方式修改多个参数的值。例如,一个XSS攻击需要在一个参数中插入一个特殊的值,使得应用程序生成错误消息;并在另一个参数中插入被复制到错误消息中的XSS有效载荷。

由于扫描器所使用的探查漏洞的蛮力方法存在的实际限制,它们并不能向每一个参数或者每一个处理阶段提交所有攻击字符串。当然,也没有人能够做到这一点;但是,人类往往能够“察觉”可能存在的漏洞、开发者做出的某种假设以及似乎有什么不太正常的位置。因此,渗透测试员会选择这一小部分可能的攻击进行实际调查,并且通常能够成功发现漏洞。

扫描器面临的技术挑战

前面介绍的自动控制面临的障碍导致创建一个有效的漏洞扫描器必须解决许多特殊的技术挑战。这些挑战不仅会损害扫描器探查某些类型的漏洞的能力(如前所述),而且会损害它执行解析应用程序内容、探查漏洞等核心任务的能力。

其中一些挑战并非无法克服,如今的扫描器已新增了各种功能,可在一定程度上克服这些挑战。但是,扫描并不是一种完美的解决方案,现代扫描技术的效率因不同应用程序而异。

验证与会话处理

扫描器必须能够处理各种应用程序使用的验证与会话处理机制。通常,应用程序的绝大多数功能只有使用通过验证的会话才能访问;如果扫描器不能获得这样的会话,它就会遗漏许多可以探测的漏洞。

当前,扫描器用户通过提供一段登录脚本,或者使用内置的浏览器完成验证过程,帮助扫描器按照特定的步骤获得通过验证的会话,从而解决验证方面的问题。

会话处理方面的挑战更难以解决,包括以下两个问题。

扫描器必须能够与应用程序使用的会话处理机制交互。这可能要求在cookie、隐藏表单字段或URL查询字符串中传送会话令牌。令牌可能在整个会话过程中保持静态,或者根据每个请求而发生变化,或者应用程序可能会采用一种完全不同的定制机制。

如果会话已经失效,扫描器必须能够了解这一情况,并返回到验证阶段获得一个新的会话。造成会话失效的原因很多,例如,因为扫描器请求了退出功能,或者因为扫描器进行了反常导航或提交了某种无效的输入,导致应用程序终止了会话。在最初解析应用程序及随后探查漏洞的过程中,扫描器必须能够探测到这两种情况。如果会话失效,不同的应用程序会表现出不同的行为;而扫描器也只会分析应用程序响应的语法内容。通常而言,这可能是一个难以应对的挑战,应用程序使用非标准的会话处理机制时尤其如此。

公平地讲,今天的一些扫描器能够检测出应用程序采用的绝大多数验证和会话处理机制。但是,仍然存在许多扫描器无法处理的情况。因此,它们可能无法抓取或扫描应用程序的主要受攻击面。由于独立扫描器完全以自动方式运行,用户通常难以察觉这种缺陷。

危险的后果

在许多应用程序中,不遵循任何指导而进行无限制的扫描,可能会给应用程序及其包含的数据带来极大的风险。例如,扫描器可能会发现一个包含重设密码、删除账户等功能的管理页面。扫描器盲目地请求每一项功能可能会导致应用程序拒绝所有用户的访问请求。同样,扫描器可能会发现一个可被用于严重破坏应用程序数据的漏洞。例如,在一些SQL注入漏洞中,提交标准的SQL攻击字符串(如or 1=1--)可能会使应用程序的数据遭受无法预料的操作。这时,知道某项特殊功能的作用的人会谨慎行事,但自动扫描器却缺乏这种认识。

个性化功能

许多时候,纯粹对应用程序进行语法分析并不能准确判定它的核心功能:

一些应用程序虽包含数目庞大的内容,但它们体现的却是一组相同的核心功能。例如,eBay、MySpace与Amazon这些应用程序含有数百万个包含不同URL与内容的不同应用程序页面,但这些页面仅对应少数几个应用程序功能。

如果仅从语法角度分析,一些应用程序可能并没有明确的边界。例如,日历应用程序允许用户导航至任何日期。同样,一些内容有限的应用程序在不同的场合采用易变的URL或请求参数访问相同的内容,导致扫描器继续对应用程序的内容进行不确定的解析。

扫描器本身的操作可能会导致一些似乎是全新的内容出现。例如,提交一个表单可能会使应用程序在界面上显示一个新的链接,访问这个链接可能会获得另外一个作用相同的表单。

在上述任何一种情况下,渗透测试员能够立即“看透”应用程序的请求内容,确定需要测试的核心功能;但不了解语法的自动扫描器却很难做到这一点。

除上述解析和探查应用程序过程中出现的明显问题外,在报告已发现的漏洞过程中也出现了一个相关的问题:纯粹基于语法进行分析的扫描器很可能会重复报告同一个漏洞。例如,一个扫描报告确定了200个XSS漏洞,其中有195个出现在扫描器多次探查的同一项应用程序功能中,因为这个漏洞通过不同的语法内容出现在不同的场合中。

其他自动控制挑战

我们在第14章讲过,一些应用程序会实施专门的防御措施,防止自动化客户端程序访问它们。这些措施包括:遇到反常行为时反应性地终止会话,使用CAPTCHA和其他控件确保一些特殊的请求由某一名用户提出。

通常,扫描器的抓取功能面临和Web应用程序爬虫相同的挑战,如定制化“未发现”响应,能够解释客户端代码。许多应用程序对特殊的输入项(例如,用户注册表单中的字段)进行严格的确认。如果爬虫向表单提交无效的输入,并且不能理解应用程序生成的错误消息,那么它就无法通过这个表单访问它之后的一些重要功能。

Web技术的快速发展,特别是各种浏览器扩展组件和其他框架在客户端上的应用,使大多数扫描器都落后于最新的技术发展趋势。这会导致扫描器无法确定在应用程序中提出的所有相关请求,或无法确定应用程序请求所需的准确格式和内容。

此外,当前Web应用程序高度状态化,以及复杂数据在客户端和服务器端上保存并通过这二者之间的异步通信进行更新的特点,都会为大多数倾向于单独处理每个请求的全自动扫描器制造问题。为完全涵盖这些应用程序,通常有必要了解它们采用的多阶段请求过程,并确保应用程序处于所需的状态,以处理特定的攻击请求。我们在第14章介绍了在定制的自动化攻击中实现这一目标的技巧。通常,采用这些技巧需要进行人为干预,以了解相关要求、对测试工具进行适当地配置,并监视它们的性能。

当前产品

近年来,自动化Web扫描器市场有了很大发展,出现了各种创新,并涌现出一系列不同的产品。以下是一些最主要的扫描器:

Acunetix

AppScan

Burp Scanner

Hailstorm

NetSparker

N-Stalker

NTOSpider

Skipfish

WebInspect

虽然大多数成熟扫描器都具备相同的核心功能,但是,在如何检测不同漏洞区域,以及向用户提供的功能方面,这些扫描器之间仍然存在差异。有关不同扫描器的优点的公开讨论大多以供应商之间的口水战而结束。尽管人们进行了各种测试来评估不同扫描器在检测不同类型的安全漏洞方面的性能,但是,这类测试始终仅限于将扫描器用于扫描一小段存在缺陷的示例代码,因此,这些测试结果并不足以推断扫描器在各种实际情况下的性能。

最有效的测试方法,是针对大量源自真实应用程序的示例代码运行扫描器,而不是在分析之前为供应商提供基于示例代码调整其产品的机会。加州大学圣芭芭拉分校的一项此类学术研究声称其“在所测试的工具数量……以及所分析的漏洞类型方面,是最大规模的Web应用程序扫描器评估”。有关此项研究的报告,请从以下URL下载:

www.cs.ucsb.edu/~adoupe/static/black-box-scanners-dimva2010.pdf

这项研究的主要结论如下:

即使是最先进的扫描器,也无法检测出所有类型的漏洞,包括脆弱密码、访问控制不完善和逻辑缺陷。

由于对常用客户端技术支持不完全,以及当前应用程序的复杂状态化特点,就目前的Web漏洞扫描器而言,抓取现代Web应用程序可能是一项严峻的挑战。

价格与性能之间并没有明显的对应关系。一些免费或价格非常低廉的扫描器与那些售价数千美元的扫描器的性能相当。

基于扫描器确定不同类型漏洞的能力,这项研究对扫描器进行了打分。每种扫描器的总得分和价格如表20-1所示。

表20-1 UCSB针对不同扫描器的漏洞检测性能与价格的研究报告

扫 描 器 分 数 价 格

Acunetix 14 4995~6350美元

WebInspect 13 6000~30 000美元

Burp Scanner 13 191美元

N-Stalker 13 899~6299美元

AppScan 10 17 550~32 500美元

w3af 9 免费

Paros 6 免费

HailStorm 6 10 000美元

NTOSpider 4 10 000美元

MileSCAN 4 495~1495美元

Grendel-Scan 3 免费

需要注意的是,近年来,扫描器的扫描能力已有了显著提高,并可能会继续改进。个体扫描器的性能和价格可能会随时间而变化。表20-1中的报告信息于2010年6月公布。

由于有关Web漏洞扫描器性能的公开信息相对较少,因此,在做出购买决策之前,渗透测试员需要自己进行这方面的调查。大多数扫描器供应商都提供详细的产品文档及其软件的试用版本,渗透测试员可以利用这些信息做出产品选择。

使用漏洞扫描器

现实情况下,使用漏洞扫描器的效率高低很大程度上取决于所针对的是何种应用程序。根据应用程序的功能及其包含的漏洞种类,我们上面介绍的扫描器的内在优缺点会以不同的方式影响不同的应用程序。

对于Web应用程序中存在的各种常见漏洞,自动扫描器能够发现其中大约一半的漏洞,它们大多都带有一个标准签名。在扫描器能够探测到的各种漏洞中,尽管会遗漏那些难以发现与不常见的漏洞,但它们能够很好地确认特定的漏洞。总之,进行自动扫描能够确定一个常见应用程序中存在的一些但并非全部明显的漏洞。

如果是一名渗透测试新手,或者需要在有限的时间内攻击一个大型应用程序,那么进行自动扫描的好处极其明显,因为它能够迅速确定一些需要进行深入手动调查的线索,并帮助初步确定应用程序的安全状态以及其中存在的漏洞类型。它还可帮助全面了解目标应用程序,并确定任何需要仔细分析的特殊区域。

如果是一名Web应用程序渗透测试专家,并且希望从目标应用程序中发现尽可能多的漏洞,那么,需要认识漏洞扫描器的内在局限性,并且不能完全相信它们,认为它们能够发现每一个漏洞。虽然扫描结果会有所帮助,并提示手动调查一些特殊的问题;但是,通常我们希望对应用程序的每个功能区域进行测试,查找每一种类型的漏洞,以确信对其进行了全面的扫描。

当使用漏洞扫描器时,必须始终记住以下一些要点,以充分利用这种工具。

了解扫描器能够确定和不能够确定的漏洞类型。

熟悉扫描器的功能,知道如何对其进行配置,对某个应用程序进行有效扫描。

在运行扫描器之前全面了解目标应用程序,以充分利用扫描器的功能。

了解抓取强大的功能和自动探查危险漏洞蕴含的风险。

始终手动核实扫描器报告的所有潜在的漏洞。

还要意识到,扫描器可能会造成极大的混乱,在服务器与IDS防御中留下大量“指纹”。如果想要保持隐秘,不要使用扫描器。

全自动化扫描与用户指导的扫描

在使用Web扫描器时,一个主要的考虑事项,是渗透测试员希望在多大程度上指导扫描器完成各种工作。这方面的两个极端用例如下。

为扫描器提供应用程序的URL,单击“开始”(Go),然后等待结果。

进行手动操作,使用扫描器单独测试每个请求,同时进行手动测试。

独立Web扫描器更适于第一种用例。整合到集成测试套件中的扫描器更适于第二种用例。也就是说,如果需要,可以结合采用这两类扫描器。

如果用户对于Web应用程序安全不甚了解,或需要快速评估某个应用程序,或需要经常处理大量应用程序,则可以通过全自动化扫描了解应用程序的一部分受攻击面。这样做有助于用户在确定更全面测试的效率时做出明智的决策。

如果用户了解Web应用程序安全测试的整个过程,以及全自动化测试的限制,则最好是使用集成测试套件中的扫描器,从而为手动测试过程提供支持,并提高手动测试的效率。这种方法有助于避免全自动扫描器面临的诸多技术挑战。渗透测试员可以使用浏览器指导扫描器进行操作,以确保不会遗漏关键的功能区域。渗透测试员可以直接测试应用程序生成的、其中包含应用程序所需的正确内容和请求格式。由于能够完全控制测试过程,因此能够避开危险功能、识别重复功能,并避开自动扫描器可能会遇到困难的任何输入确认。此外,由于可以收到有关扫描器活动的直接反馈,因而可以确保避免与验证和会话处理机制有关的问题,并确保正确处理多阶段过程和有状态功能造成的问题。通过以这种方式使用扫描器,可以覆盖一系列可以自动进行检测的重要漏洞,从而能够查找需要智慧和经验才能发现的漏洞类型。

其他工具

除前面讨论的工具外,在特殊情况下或执行特殊任务时渗透测试员还可以使用许多其他工具。在本章的剩余部分,我们将介绍其他几种攻击应用程序时可能遇到或需要使用的工具。需要注意的是,以下内容仅仅简要介绍了笔者曾使用的一些工具。建议渗透测试员调查各种可用的工具,并选择最适合自己需求和测试风格的那些工具。

Wikto/Nikto

Nikto可确定Web服务器上默认或常见的第三方内容。它包含一个大型文件和目录数据库,其中含有Web服务器上的默认页面与脚本以及购物篮之类的第三方软件。基本上,这个工具轮流请求上述每一种项目,然后探查它们是否存在。

数据库会频繁更新,这意味着Nikto能够比其他任何自动或手动技巧更有效地确定这种类型的内容。

Nikto包含大量可通过命令行或基于文本的配置文件指定的配置选项。如果应用程序使用定制化“未发现”页面,渗透测试员可以通过使用–404设置避免错误警报,该设置允许指定一个出现在定制错误页面中的字符串。

Wikto是Nikto的Windows版本,该版本新增了一些功能,如增强了对“未发现”响应的检测和Google辅助的目录挖掘。

Firebug

Firebug是一种浏览器调试工具,使用它可以在当前显示的页面上调试和编辑HTML及JavaScript脚本,还可以通过它浏览和编辑DOM。

Firebug具有非常强大的功能,可用于分析和利用一系列客户端攻击,包括各种跨站点脚本、请求伪造、UI伪装和跨域数据捕获攻击(如第13章所述)。

Hydra

Hydra是一种用途广泛的密码猜测工具,可用于攻击Web应用程序常用的基于表单的验证。当然,也可以使用Burp Intruder之类的工具以完全定制的方式实施这种攻击;但是,在许多情况下,Hydra也一样有用。

可以使用Hydra指定目标URL、相关请求参数、攻击用户名和密码字段的单词列表,以及登录失败后返回的错误消息细节。–t设置可用于指定在攻击中使用的并行线程的数量。例如:

定制脚本

根据我们的经验,现有的各种非定制工具足以帮助渗透测试员完成在攻击Web应用程序时所需执行的绝大多数任务。但是,在各种反常情况下,需要自行建立完全定制的工具和脚本来解决特定的问题,如下所示。

应用程序使用一种不常见的会话处理机制,例如,需要使用必须按正确顺序重新提交的每页面令牌。

希望利用一个需要重复执行几个特殊步骤的漏洞,将在一个响应中获取的数据合并到随后的请求中。

如果确定一个潜在恶意的请求,应用程序会立即终止会话;同时,获得一个新的通过验证的会话需要采取几个非标准的步骤。

需要向应用程序所有者提供“指向并单击”利用过程,以演示该漏洞及其风险。

如果会编程,那么解决这个问题的最简单方法,就是创建一个完全定制的小型程序,使用它发布相关请求并处理应用程序的响应。可以把这个程序作为一个独立的工具,或者作为前面描述的集成测试套件的扩展,例如,通过使用Burp Extender接口扩展Burp Suite或Bean Shell接口扩展WebScarab。

Perl等脚本语言包含许多可用于迅速建立HTTP通信的库;通常,仅使用几行代码就可以执行定制任务。即使编程经验有限,也可以在因特网上找到一段脚本,然后对其进行调整,以满足需求。下面以一段简单的Perl脚本为例,它利用一个登录表单中的SQL注入漏洞进行递归查询,获取数据表中指定列中的所有值,并将获得的值从大到小排列(请参阅第9章了解这种攻击的更多详情):

尝试访问

http://mdsec.net/addressbook/32/

除内置命令与库外,还可以从Perl脚本与操作系统shell脚本中调用各种简单的工具和实用工具。下面分别介绍几个这样的工具。

Wget

Wget是一个有用的工具,可使用HTTP或HTTPS获取一个特殊的URL。它支持“下行”代理服务器、HTTP验证和其他各种配置选项。

curl

curl是一个用于发布HTTP与HTTPS请求的最灵活的命令行工具。它支持GET方法、POST方法、请求参数、客户端SSL证书和HTTP验证。在下面的示例中,重复检索页面标题,以获得10~40之间的页面ID值。

尝试访问

http://mdsec.net/app/

netcat

netcat是一个功能非常强大的工具,可用于执行各种与网络有关的任务;它还是许多初学者攻击教程的基础。可以使用它与服务器建立TCP连接,发送一个请求并获得它的响应。除以上用途外,netcat还可用于在计算机上创建网络监听器,接收所攻击的服务器建立的连接。请参阅第9章,了解使用这种技巧在数据库攻击中创建一个带外通道的实例。

netcat本身并不支持SSL连接;但将它与下面描述的stunnel工具结合,即可建立SSL连接。

stunnel

stunnel在使用自己的脚本或其他本身并不支持HTTPS连接的工具时非常有用。stunnel可帮助渗透测试员与任何主机或服务器SSL套接字建立客户端SSL连接,以监听任何客户端提出的连接请求。由于HTTPS只是一种通过SSL传送的简单HTTP协议,因此可以使用stunnel为任何其他工具提供HTTPS能力。

例如,下面的命令配置stunnel在本地回环接口的88端口上建立一个简单的TCP服务器套接字。当收到一个连接时,它再与位于wahh-app.com的服务器进行SSL协议,通过SSL信道将进入的明文连接转送到这个服务器:

现在,可以将任何没有SSL能力的工具指向回环接口的88端口,使它通过HTTPS与目标服务器建立通信,代码如下:

小结

本书主要介绍的是攻击Web应用程序时渗透测试员可以使用的实用技巧。尽管只需要使用一个浏览器就可以完成其中一些任务,但是,要对应用程序实施全面有效的攻击,需要使用一些有用的工具。

拦截代理服务器是工具包中最重要、也是必不可少的工具,可以使用它查看和修改浏览器与服务器之间传送的所有流量。今天的代理服务器还与大量其他集成工具相互补充,这些工具可帮助渗透测试员自动完成所需要执行的许多任务。除使用上述工具套件外,还需要使用一个或几个浏览器扩展,帮助渗透测试员在无法使用代理服务器的情况下继续实施攻击。

Web应用程序扫描器是另一种重要工具。这些工具能够迅速有效地发现一系列常见的漏洞,并且能够解析和分析应用程序的功能。即便如此,还是有许多安全漏洞它们根本无法确定;因此,绝不能依赖它来确保任何应用程序的安全。

最后,要成为一名技术熟练的Web应用程序渗透测试员,还必须了解Web应用程序的运行机制、它们的防御机制的弱点,并了解如何探查其中存在的可被利用的漏洞。为了有效地完成这些任务,需要一些工具,以了解应用程序的逻辑,准确控制与应用程序的交互,并在必要时利用自动控制迅速可靠地实施攻击。那些对实现这些目标最有帮助的工具,就是最适合使用的工具。此外,如果现有的工具并不能满足需求,也可以建立自己的工具。事实上,做到这一点并不是很困难!

浙ICP备11005866号-12