14.4 常见漏洞模糊测试

定制自动化技巧的第三个主要用途并不包含利用任何已知的漏洞枚举或提取信息,而是使用各种旨在造成反常行为的、专门设计的攻击字符串来探查应用程序中是否存在任何常见的漏洞。因为以下原因,与前面描述的攻击相比,这种类型的攻击更加缺乏针对性。

img002 无论每个参数的正常功能是什么,或者应用程序希望收到何种类型的数据,在这种攻击中,往往需要提交与测试应用程序每个页面的每一个参数相同的攻击有效载荷。这些有效载荷有时叫作模糊测试字符串(fuzz string)。

img002 事先并不知道如何确定“触点”。与其监控应用程序的响应,在其中查找特殊的指标,还不如系统性地截取尽可能多的数据并对其进行审查,确定攻击字符串在应用程序中触发反常行为的情形,然后再做深入调查。

当探查各种常见的Web应用程序漏洞时,一些漏洞会通过特别明显的应用程序行为表现出来,这些行为包括特定的错误消息或HTTP状态码。有时可以根据这些漏洞签名来探查常见的漏洞;而且,自动化应用程序漏洞扫描器也使用这种方法来确定绝大多数的漏洞(请参阅第20章了解相关内容)。然而,从理论上讲,向应用程序提交的任何测试字符串都会产生某种可以预料的行为,在特定的条件下,表明应用程序存在某种漏洞。为此,经验丰富的攻击者使用定制自动化技巧,就比单单使用全自动化工具更有效率。这类攻击者会对应用程序响应中的每一个相关细节进行全面分析;他能够从应用程序设计者与开发者的角度考虑问题。此外,他能够发现并调查请求与响应之间不寻常的联系,而当前还没有任何工具能够做到这一点。

功能复杂的大型应用程序中包含大量动态页面,且每个页面都能接受各种参数,这时,使用自动化技巧查找漏洞就非常有用。手动测试每一个参数,并追踪应用程序对相关请求响应中的有关细节,是一个几乎无法完成的任务。使用自动化工具代替完成需要手动执行的任务,是在这种应用程序中探查漏洞的唯一实用的方法。

确定上一个示例中的访问控制不完善并对其加以利用后,我们还可以实施模糊测试攻击来检查各种基于输入的漏洞。作为对受攻击面的初步测试,我们决定在每个参数中轮流提交以下字符串。

img002 ′,如果存在SQL注入漏洞,某些情况下,提交这个字符串将造成一个错误。

img002 ;/bin/ls,如果存在命令注入漏洞,提交这个字符串可能导致无法预料的行为。

img002 ../../../../../etc/passwd,如果存在路径遍历漏洞,提交这个字符串可能生成一个不同的响应。

img002 xsstest,如果这个字符串被复制到服务器的响应中,那么应用程序就容易受到跨站点脚本攻击。

我们将对JAttack工具进行扩展,通过创建一个新的有效载荷源,生成这些有效载荷,如下所示:

img455a

img001  注解  任何探查应用程序安全漏洞的重要攻击都需要使用许多其他攻击字符串,以确定其他薄弱环节和前面提到的漏洞的其他变化形式。我们将在第21章提供一个更加全面的列表,列出在对Web应用程序进行模糊测试时需要的所有字符串。

为使用JAttack进行模糊测试,还需要扩展它的响应分析代码,使其能够提供更多与应用程序响应有关的信息。显著提高这种分析能力的一个简单办法,就是在每个响应中搜索指示出现某种反常行为的常见字符串和错误消息,并记录它们在工具的输出结果中出现的每一种情况。

首先,在攻击配置数据中添加想要搜索的字符串列表:

img455b

然后插入下面的parseResponse方法,以在响应中搜索前面提到的每一个字符串,并记录任何发现的字符串:

img456a

img004  提示  事实证明,枚举应用程序中的标识符时,在JAttack中合并这种搜索功能往往非常有用。通常,在应用程序的响应中是否存在某个特殊的表达式是出现“触点”的最可靠指标。

我们可以利用这些代码建立一个基本的Web应用程序漏洞测试器。当实施具体的攻击时,测试员只需用相关的请求细节对JAttack进行配置,指示它攻击每一个参数。代码如下所示:

img456b

配置这些细节后就可以开始实施攻击。在几秒钟内,JAttack就已经向所有请求参数提交了攻击有效载荷。而手动提交至少需要几分钟时间,审查并分析应用程序收到的响应则需要更长时间。

接下来再对JAttack的输入结果进行手动检查,尝试确定任何表示漏洞存在的反常行为。分析下面这段输出摘录:

img456c

对于修改SessionId参数的请求,应用程序返回一个始终为相同长度的重定向响应。这种行为并不表示存在任何漏洞。这并不奇怪,因为在登录时修改会话令牌通常会使当前会话失效,用户将被重定向到登录页面。