本章目前介绍的各种技巧在许多应用程序中都可以使用,而不会出现任何问题。但是,在其他情况下,可能存在各种导致无法实施定制自动化攻击的障碍。
会话处理机制,这类机制会防御性地终止响应意外请求的会话,采用因请求而异的反CSRF令牌之类的临时参数值(请参阅第13章了解相关内容),或涉及多阶段过程。
CAPTCHA控件,这类控件旨在阻止自动工具访问特定应用程序功能,如注册新用户账户的功能。
我们将讨论以上每一种情形,并介绍通过优化自动工具或查找应用程序的防御缺陷,从而突破实施自动化的限制的方法。
许多应用程序采用会话处理机制和其他有状态功能来防止自动测试。以下是一些可能会形成限制的情形。
测试请求时,应用程序会出于防御或其他目的,终止用于测试的会话,剩下的测试也随之失效。
某个应用程序功能使用必须随每个请求提供的不断变化的令牌(例如,为防止请求伪造攻击)。
所测试的请求在多阶段过程中显示。只有在首先提出一系列其他请求,应用程序进入适当的状态时,该请求才会得到正确处理。
基本上,通过针对应用程序使用的各种机制来优化自动化技巧,通常可以突破这类妨碍。如果在JAttack代码中写入自己的测试代码,就可以直接突破特定的会话处理或多阶段机制。但是,这种方法可能较为复杂,并且不能有效地移植到大型应用程序中。实际上,如果在处理每一个新问题时都需要编写新的定制代码,这本身就是实施自动化的一大限制,这种方法甚至不如较慢的手动技巧。
Burp Suite的会话处理支持
幸好,Burp Suite提供了一系列功能,可用于尽可能轻松地处理所有这些情形,以便于渗透测试员继续进行测试,而由Burp在后台无缝处理各种限制。这些功能基于以下组件:
cookie库;
请求宏;
会话处理规则。
我们将简要介绍如何组合使用这些功能来克服实施自动化的限制,从而在上述各种情形下继续进行测试。有关详细的帮助信息,请参阅Burp Suite的在线文档。
cookie库
Burp Suite维护自己的cookie库,用于追踪浏览器和Burp自己的工具使用的应用程序cookie。渗透测试员可以配置Burp自动更新cookie库的方式,还可以直接查看和编辑其内容,如图14-10所示。
图14-10 Burp Suitecookie库
就其本身而言,该cookie库并不执行任何操作,但Burp的其他会话处理支持组件需要用到它追踪的关键值。
宏是预先定义的一个或多个请求。宏可用于执行各种会话相关的任务,包括:
提取应用程序页面(如用户的主页),以检查当前会话是否仍然有效;
执行登录,以获取新的有效会话;
获取令牌或nonce,以在其他请求中用作参数;
在多阶段过程中扫描请求或对其进行模糊测试时,需要提前执行一些请求,以便于应用程序进入将接受目标请求的状态。
使用浏览器可以录制宏。在定义宏时,Burp会显示Burp Proxy的历史记录视图,从中可以选择定义宏所需的请求。这时可以选择以前提出的请求,或重新录制宏并从该历史记录中选择新项目,如图14-11所示。
图14-11 在Burp Suite中录制请求宏
图14-12 为宏项目配置cookie和参数处理方式
是否应将cookie库中的cookie添加到请求中;
是否应将在响应中收到的cookie添加到cookie库中;
对于请求中的每个参数,是应使用预设值,还是使用宏内以前的响应获取的值。
在某些多阶段过程以及应用程序大量使用反CSRF令牌的情况下,从宏内以前的响应获取参数值的功能特别有用。在定义新宏时,Burp会通过识别某些参数,尝试自动查找任何此类关系,这些参数的值可以从以前的响应中(表单字段值、重定向目标、链接中的查询字符串)确定。
会话处理规则
用于定义会话处理规则的工具是Burp Suite的主要会话处理支持组件,该工具使用cookie库和请求宏来克服实施自动化的特定限制。
每个规则由范围(规则的应用范围)和操作(规则执行的操作)组成。对于Burp提出的每个出站请求,将确定哪些定义的规则在请求的应用范围内,并按顺序执行所有规则的操作。
每个规则的范围可以基于所处理的请求的以下任何或全部特性进行定义,如图14-13所示:
图14-13 配置会话处理规则的范围
提出请求的Burp工具;
请求的URL;
请求中参数的名称。
每个规则可以执行一项或多项操作,如图14-14所示,包括:
图14-14 配置会话处理规则的操作
从会话处理cookie库中添加cookie;
设置特定的cookie或参数值;
检查当前会话是否有效,并根据结果执行相应的子操作;
提示用户在浏览器中执行会话恢复。
所有这些操作都可以进行灵活配置,并且能够以任意方式组合使用,处理几乎全部会话处理机制。利用运行宏并根据结果更新指定cookie和参数值的功能,渗透测试员可以在注销后重新登录应用程序。利用指示在浏览器中执行会话恢复的提示,渗透测试员可以处理需要键入物理令牌中的数字或破解CAPTCHA拼图的登录机制(将在下一节介绍)。
通过使用不同范围和操作创建多个规则,可以定义一系列Burp将应用于不同URL和参数的行为。例如,已知某应用程序经常终止响应意外请求的会话,并且大量使用一个__csrftoken反CSRF令牌。如果要测试该应用程序,可以定义以下规则,如图14-15所示。
图14-15 一组会话处理规则,可用于处理应用程序使用的会话终止机制和反CSRF令牌
对于所有请求,从Burp的cookie库中添加cookie。
对于指向应用程序的域的请求,验证应用程序的当前会话是否仍处于活动状态。如果是,则运行宏重新登录到该应用程序,并使用生成的会话令牌更新cookie库。
对于指向包含__csrftoken参数的应用程序的请求,首先运行宏来获取有效的__csrftoken值,然后在提出请求时使用该值。
要将Burp的会话处理功能应用于实际的应用程序,通常需要进行复杂的配置,并且易于出错。Burp提供了一项追踪功能,可用于解决会话处理配置问题。此功能将显示Burp对某个请求应用会话处理规则所执行的所有步骤,以便于查看Burp到底如何更新和提出请求,并确定配置是否按预期方式运行。会话处理追踪功能如图14-16所示。
图14-16 Burp的会话处理追踪功能,可用于监控和调试会话处理规则
对测试目标应用程序所需的规则和宏进行配置和测试后,渗透测试员可以正常继续手动和自动测试,就好像测试限制并不存在一样。
CAPTCHA控件用于防止攻击者自动使用某些应用程序功能。注册电子邮件账户和发表博客文章之类的功能通常使用此类控件,以减少垃圾信息。
CAPTCHA是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分人类和计算机的图灵测试)的缩写。通常,这些测试采用一个包含外形扭曲的单词的拼图,用户必须读取并在提交表单的字段中输入该单词。此类拼图还包括识别特定的动物或植物、图像方向等。
对人类而言,解决CAPTCHA拼图相当容易,但对计算机而言却非常困难。由于突破这些控件会给垃圾邮件发送者带来经济利益,因而相关机构不断增加CAPTCHA拼图的难度,导致人类越来越难以读取这些拼图,如图14-17所示。由于人类与计算机解决CAPTCHA拼图的能力相当,因此,作为针对垃圾邮件的一项防御措施,这些拼图可能会逐渐失效,并可能会被废弃。它们还会造成当前并未完全解决的访问性问题。
图14-17 一个CAPTCHA拼图
CAPTCHA拼图可以通过各种方式进行破解,仅一部分拼图适用于执行安全测试。
1.攻击CAPTCHA控件
要了解如何避开CAPTCHA控件,最有效的方法是了解此类拼图如何被传送至用户,以及应用程序如何处理用户的答案。
令人惊奇的是,有大量CAPTCHA控件以文本形式向用户披露拼图答案。披露答案的形式包括:
拼图图像通过URL加载,而拼图答案却为该URL的参数,或将图像名设置为CAPTCHA答案;
拼图答案存储在隐藏表单字段中;
拼图答案出现在HTML注释或其他位置(用于调试目的)。
在这些情况下,攻击者可以通过脚本攻击轻松获取包含拼图答案的响应,并在下一个攻击请求中提交该答案。