第21章
Web应用程序渗透测试方法论


章介绍一种详细的进阶方法论,渗透测试员在攻击Web应用程序时可将其作为指导思想。它涵盖了本书描述的所有漏洞与攻击技巧。虽然执行这个方法论中的所有步骤并不能确保发现某个应用程序中的所有漏洞,但是,它可以帮助探查应用程序受攻击面的所有必要区域,并利用有效的资源发现尽可能多的漏洞,这就为实现渗透测试目的提供了保证。

这种方法论探查的主要区域如图21-1所示。根据这张图,我们将深入分析每一个区域,并举例说明其中的每一项任务。图中的数字与后文中该方法论使用的分级数字目录相互对应,方便读者找到相关内容。

img605

图21-1 本章讨论的方法论中包含的主要区域

这个方法论中的一系列任务根据它们之间的逻辑依赖关系组织和排序。我们将尽可能在任务描述中重点介绍这些依赖关系。但是,实际上,渗透测试员往往需要发挥自己的想象,思考应采取的攻击方向,并根据所发现的有关目标应用程序的信息指导攻击方向,如下所示。

img002 在某一个阶段收集到的信息有助于返回到前一个阶段,以设计更有针对性的攻击。例如,渗透测试员可以利用访问控制漏洞获得所有用户的列表,针对验证功能实施更有效的密码猜测攻击。

img002 在应用程序的某个区域发现的一个关键漏洞可简化对另一个区域的攻击。例如,渗透测试员可以利用文件泄露漏洞对应用程序的关键功能进行代码审查,而不是盲目地探查这些功能。

img002 一些区域的测试结果有助于确定在其他区域可立即探查出的重复出现的漏洞模式。例如,渗透测试员可以利用应用程序输入确认过滤中的常见漏洞,迅速找到在几种不同的攻击中避开应用程序的防御机制的方法。

可以使用这个方法论中列出的步骤作为攻击指导,并把它作为避免疏忽的清单,但不一定要过于严格地遵守这些步骤。请记住以下要点:在很大程度上,我们描述的任务都属于标准的常规性任务;要对Web应用程序实施最有效的攻击,渗透测试员必须充分发挥自己的想象力。

一般规范

当执行攻击Web应用程序所需的详细步骤时,应该始终记住以下注意事项。这些注意事项适用于所有必须测试的区域以及需要采用的各种技巧。

img002 记住,一些字符在HTTP请求的不同部分具有特殊的含义。当修改请求中的数据时,应该对这些字符进行URL编码,以确保应用程序按照想要的方式解释这些字符。

img006 &用于分隔URL查询字符串与消息主体中的参数。要插入一个字面量&字符,必须将其编码为%26。

img006 =用于分隔URL查询字符串与消息主体中每个参数的名称与值。要插入一个字面量=字符,必须将其编码为%3d。

img006 ?用于标记URL查询字符串的起始位置。要插入一个字面量?字符,必须将其编码为%3f。

img006 空格用于在请求的第一行标记URL的结束位置,并可用于在Cookie消息头中表示一个cookie值结束。要插入一个字面量空格字符,必须将其编码为%20或+。

img006 因为+表示一个编码的空格,要插入一个字面量+字符,必须将其编码为%2b。

img006 ;用于在Cookie消息头中分隔单个的cookie。要插入一个字面量 ; 字符,必须将其编码为%3b。

img006 #用于在URL中标记片段标识符。如果在浏览器的URL中输入这个字符,它会将传送给服务器的URL截短。要插入一个字面量#字符,必须将其编码为%23。

img006 %在URL编码方案中作为前缀。要插入一个字面量%字符,必须将其编码为%25。

img006 当然,空字节与换行符等非打印字符必须使用它们的ASCII字符代码进行URL编码。空 字节与换行符的编码分别为%00和%0a。

img002 此外,需要注意,在表单中输入URL编码的数据通常会导致浏览器执行另一层编码。例如,在表单中提交%00可能会导致向服务器发送值%2500。为此,通常最好是在拦截代理服务器中查看最终请求。

img002 许多查找常见Web应用程序的测试需要发送各种专门设计的输入字符串,并监控应用程序的响应,从中搜索表示漏洞存在的反常现象。有时候,无论是否提交某个特定漏洞的触发器,应用程序对一个特殊请求的响应都将包含这个漏洞的签名。只要提交专门设计的特殊输入导致了与某个漏洞有关的行为(如一个特殊的错误消息),就应该重新核查,确定在相关参数中提交良性输入是否也会造成相同的行为。如果两种输入的行为相同,那么最初的发现可能是一个错误警报。

img002 通常,应用程序会从前一个请求中收集一定量的状态,这会影响它们如何响应随后的请求。有时,当调查一个尚未确定的漏洞并隔离某一个反常行为的根源时,必须避免任何收集到的状态信息造成的影响。通常,使用一个新的浏览器进程开始另一个会话,再使用良性请求导航至观测到发生反常的位置,然后重新提交专门设计的输入,就足以达到这个目的。还可以对请求中包含的cookie和缓存信息进行调整,重复利用这种方法。此外,还可以使用Burp Repeater 等工具隔离一个请求,对它进行一些调整,然后根据需要重复多次发布这个请求。

img002 一些应用程序使用一种负载平衡的配置,其中连续的HTTP请求可能会被不同的后端服务器在Web层、展现层、数据层或其他层处理。不同服务器在配置上的细微差异可能会影响到处理结果。另外,一些成功的攻击将改变处理请求的某一台服务器的状态,例如在Web根目录上创建一个新的文件。为隔离特殊操作造成的影响,可能需要连续提交几个相同的请求,测试每个请求的结果,直到请求被相关服务器处理。

假设需要在咨询工作中采用这种方法,渗透测试员应当首先确定测试范围,明确了解测试包含的主机名、URL与功能以及允许执行的测试类型是否存在任何限制。还应当向应用程序所有者告知对一个“黑盒”目标实施任何渗透测试包含的内在风险,并建议他们在开始测试前备份所有重要的数据。