有时,测试员需要测试使用在浏览器以外运行的厚客户端的应用程序。许多这类客户端并不提供任何用于配置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)。可以过滤和搜索拦截历史记录,从而迅速查找特定数据项,还可以标注感兴趣的条目,以便将来引用。
用于动态修改请求与响应内容的自动匹配与替换规则。这项功能的用途广泛,例如,在所有请求中修改某个cookie或其他参数的值,删除缓存指令,用User-Agent消息头模拟某个特殊的浏览器,等等。
除客户端UI外,直接通过浏览器访问代理服务器的功能。渗透测试员可以使用这项特性浏览代理历史,从浏览器中重新发布请求,从而以正常方式处理并拦截响应。
操纵HTTP消息格式的实用工具,如在不同的请求方法与内容编码之间进行转换。有时,渗透测试员还可以使用这些工具优化跨站点脚本之类的攻击。
能够实时自动地修改某些HTML特性,如显示隐藏表单字段,删除输入字段限制以及删除JavaScript表单确认。
2.Web应用程序爬虫
Web应用程序爬虫的工作机制与传统的Web爬虫类似:请求Web页面,解析这些页面,从中查找指向其他页面的链接,然后向它们提出请求;继续这个过程,直到查明一个站点的全部内容。为适应功能性Web应用程序与传统Web站点之间的差异,应用程序爬虫不仅需要实现其核心功能,还要应对其他各种挑战,如下所示。
基于表单的导航,使用下拉列表、文本输入和其他方法。
基于 JavaScript的导航,如动态生成的菜单。
要求按预定顺序执行操作的多阶段功能。
验证与会话。
使用基于参数的标识符,而非URL,指定不同的内容与功能。
在URL查询字符串中出现令牌和其他易变参数,导致确定特殊内容出现问题。
集成测试套件通过在拦截代理服务器与爬虫组件之间共享数据,解决了上述几个问题。这样,渗透测试员就能够以正常方式使用目标应用程序,由代理服务器处理所有请求,并将其提交给爬虫进行深入分析。因此,浏览器将会留意任何不常见的导航、验证与会话处理机制,允许渗透测 试员完全控制爬虫,彻底搜索应用程序的内容。这种由用户指导的抓取技巧已在第4章详细介绍了。收集到尽可能多的信息后,爬虫就可以自行进行深入调查,进而发现其他内容与功能。
下面是Web应用程序爬虫所执行的常用功能。
使用通过拦截代理服务器访问的URL自动更新站点地图。
被动抓取代理服务器处理的内容,从中解析出链接,无须请求这些链接就将它们添加到站点地图中(见图20-7)。
图20-7 被动抓取结果,以灰色显示的条目没有经过请求,但通过被动抓取确认了
以表格和树状形式呈现所发现的内容,方便对这些结果进行搜索。
对自动抓取的范围进行细化控制。这样就可以指定爬虫抓取的主机名称、IP地址、目录路径、文件类型等,以对某一个特殊的功能区域进行抓取,防止爬虫访问目标应用程序基础架构之内或之外的无关链接。这项功能还有助于防止爬虫抓取管理接口之类的强大功能,因为这样做可能会导致危险的负面影响,如删除用户账户。它还可用于防止爬虫请求退出功能,使当前会话失效。
自动解析HTML表单、脚本、注释和图像,并在站点地图内分析这些内容。
解析JavaScript内容,查找URL与资源名称。即使应用程序并没有使用完整的JavaScript引擎,这项功能也有助于爬虫发现基于JavaScript的导航,因为它们通常以字面量的形式出现在脚本中。
使用适当的参数根据用户的指导自动提交表单(见图20-8)。
探查自定义的“文件未发现”响应。当请求一个无效的资源时,许多应用程序返回一条HTTP 200消息。如果爬虫无法识别这种消息,得到的内容地图就可能包含错误信息。
检查robots.txt文件,该文件提供一份列出禁止抓取的URL黑名单,但攻击爬虫可以利用它发现其他内容。
自动获取所有枚举出的目录的根目录。这些内容可用于检查目录列表或默认内容(请参阅第17章了解相关内容)。
自动处理和使用由应用程序发布的cookie,在通过验证的会话中进行抓取。
自动测试每个页面的会话依赖性。这包括使用和不使用收到的cookie请求的每个页面。如果提出的两种请求得到相同的内容,那么该页面不需要会话或验证即可访问。这种功能可用于探查一些访问控制漏洞(请参阅第8章了解相关内容)。
发布请求时自动使用正确的Referer消息头。一些应用程序可能会检查这个消息头的内容,这项功能可确保爬虫尽可能以类似于普通浏览器的方式运行。
控制在自动抓取过程中使用的其他HTTP消息头。
控制提出的自动抓取请求的速度与顺序,避免这些请求令攻击目录崩溃;如有必要,确保抓取在隐秘状态下进行。
3.应用程序测试器
虽然仅使用手动技巧也可以成功实施攻击,但是,要成为一名真正成熟的Web应用程序渗透测试员,必须在攻击过程中利用自动化工具,提高攻击速度与效率。第14章已经详细介绍了如何使用自动化工具。集成测试套件中的每一个工具都具有自动完成各种常见任务的功能。以下是各种工具套件的主要功能。
手动配置常见漏洞扫描。渗透测试员可以利用这项功能准确控制使用哪些攻击字符串,以及如何将它们合并到请求中并审查其结果,确定任何有助于深入调查的不常见的或反常的响应。
一组内置的攻击有效载荷和易变函数,以用户定义的方式生成任意有效载荷。例如,根据畸形编码、字符置换、蛮力、从前某个攻击中获得的数据等。
能够保存扫描响应数据,将其用在报告中,或者合并到其他攻击中。
查看和分析响应的定制化功能。例如,可根据特定表达式或有效载荷自身是否出现查看和分析响应(参见图20-9)。
图20-9 使用Burp Intruder测试漏洞练习的结果
从应用程序的响应中提取有用数据的功能。例如,从“用户资料”页面解析用户名和密码字段。当利用会话处理和访问控制等漏洞时可以用到这项功能。
4.Web漏洞扫描器
一些集成测试套件提供扫描常见Web应用程序漏洞的功能,所执行的扫描主要分为以下两类。
被动扫描,包括监视通过本地代理服务器传递的请求和响应,以确定各种漏洞,如提交明文密码、cookie配置错误以及跨域Referer泄露。可以以非入侵的方式对使用浏览器访问的任何应用程序执行此类扫描。在确定渗透测试的效果时,此功能往往非常有用,通过它可以确定应用程序相对于上述漏洞的安全状态。
主动扫描,包括向目标应用程序发送请求来探查各种漏洞,如跨站点脚本、HPPT消息头注入和文件路径遍历。和任何其他主动测试一样,此类测试可能会非常危险,只有在获得应用程序所有者的同意后才可以实施。
相比于本章后面部分讨论的独立扫描器,测试套件中包含的漏洞扫描器需要用户执行更多配置。用户不能仅仅提供起始URL并让扫描器抓取和测试应用程序,相反,用户可以指示扫描器如何测试应用程序,精确控制扫描哪些请求,并收到有关单个请求的实时反馈。以下是集成测试套件扫描功能的一些典型用法。
手动解析应用程序的内容后,可以选择站点地图中感兴趣的功能区域并由扫描器扫描这些区域。这有助于将可用时间用于扫描最关键的区域,并更迅速地获得扫描结果。
手动测试单个请求时,作为补充,可以在测试时扫描每个特定的请求。这样做可以立即获得与这些请求包含的常见漏洞有关的反馈,从而为手动测试提供指导并对其进行优化。
可以使用自动抓取工具抓取整个应用程序,然后扫描发现的所有内容。这个过程与独立Web扫描器的基本行为类似。
在Burp Suite中,可以在浏览器中激活实时扫描,然后使用浏览器指导扫描器的扫描范围,并迅速收到与提出的每个请求有关的反馈,而无须手动确定要扫描的请求。图20-10显示了实时扫描的结果。
图20-10 使用BurpScanner浏览时的实时扫描结果
虽然集成测试套件中的扫描器的设计用途不同于独立扫描器,但是,我们将在本章后面部分讲到,在某些情况下,这些扫描器的核心扫描引擎非常强大,其能力甚至优于主流的独立扫描器。
5.手动请求工具
发布一个请求并查看它的响应是集成测试套件中的手动请求组件的基本功能。虽然非常简单,但在以下情况下,这项功能可提供极大帮助:尝试性地探查一个漏洞,需要多次手动发布同一个请求,并调整请求元素以确定应用程序的行为所受到的影响。当然,也可以使用一个独立的工具(如Netcat)来完成这项任务。但是,如果将这项功能内置在套件中,就可以迅速从其他组件(代理服务器、爬虫或漏洞测试器)中获取感兴趣的请求,对其进行手动调查。而且,手动请求工具还可以得益于套件执行的各种共享功能,如HTML呈现、支持下行代理(downstream proxy)与验证、自动上传Content-Length消息头。图20-11是一个手动重新发布的请求。
图20-11 使用BurpRepeater手动重新发布的请求
以下是各种手动请求工具的主要功能。
与其他套件组件相互整合,能够与其他组件相互传递任何请求,以进行深入调查。
保存所有请求与响应的历史记录,完整记录所有手动请求,以方便进一步审查。同时还能够获取一个之前已经修改的请求,以进行深入分析。
能够自动跟踪重定向。
6.会话令牌分析器
一些测试套件提供各种分析功能,可用于分析应用程序使用的需要不可预见性的会话cookie和其他令牌的随机性。Burp Sequencer是一种强大的工具,可以对任意大小的令牌样本的随机性进行标准的统计测试,并以可访问的格式提供详细结果。图20-12显示了Burp Sequencer工具,有关该工具的详情,请参阅第7章。
图20-12 使用BurpSequencer测试应用程序会话令牌的随机性
7.共享功能与实用工具
除核心组件外,集成测试套件还提供大量其他“附加值”功能,以满足渗透测试员在攻击Web应用程序时面临的特殊需求。以下是各种套件的主要功能。
分析HTTP消息结构,包括解析消息头与请求的参数,以及解压常见序列化格式(见图20-13)。
在响应中呈现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都有大量扩展,它们的功能基本相似。我们将分别举出一个示例, 同时也建议测试员首先试用各种扩展,然后再从中选择最适合自己的一种。
还要注意,与主要的工具套件相比,当前浏览器扩展的功能有限。它们不能进行任何抓取、模糊测试或漏洞扫描,而且使用它们必须完全手动操作。但是,在某些情况下仍然需要使用它们,因为它们可帮助渗透测试员对攻击目标实施仅使用标准浏览器无法实现的全面攻击。
1.Tamper Data
Tamper Data是一个Firefox浏览器扩展。任何时候,只要提交一个表单,Tamper Data就会弹出一个对话框,显示与请求有关的所有信息(包括HTTP消息头与参数),并允许查看和修改这些内容,如图20-15所示。
图20-15 在Firefox中使用TamperData修改HTTP请求
2.TamperIE
TamperIE是一个Internet Explorer浏览器扩展,它的功能与Firefox浏览器的Tamper Data扩展的功能基本相同,如图20-16所示。
图20-16 在Internet Explorer中使用TamperIE修改HTTP请求