(1)配置浏览器,使用Burp或WebScarab作为本地代理服务器(如果不确定,请参阅第20章了解相关信息)。
(2)以常规方式浏览整个应用程序,访问发现的每一个链接/URL,提交每一个表单并执行全部多阶段功能。尝试在JavaScript激活与禁用、cookie激活与禁用的情况下进行浏览。许多应用程序能够处理各种浏览器配置,可以获取应用程序内的不同内容和代码路径。
(3)检查由代理服务器/爬虫工具生成的站点地图,确定手动浏览时没有发现的所有应用程序内容或功能。确定爬虫如何枚举每一项内容,例如,在Burp Spider中,检查“链接自”(Linked From)的详细内容。通过浏览器访问这些内容,以使代理服务器/爬虫工具检查服务器响应,从而确定其他所有内容。继续递归执行上述步骤,直到无法再确定其他内容或功能。
(4)另外,还可以要求工具以已经枚举的所有内容为基础,主动抓取站点内容。首先,请确定任何危险的或可能会中断应用程序会话的URL,并配置爬虫,将它们排除在抓取范围之外。运行爬虫并检查它发现的结果以查找其他所有内容。
在代理服务器/爬虫工具生成的站点地图中包含大量关于目标应用程序的信息,稍后可以利用它们确定应用程序暴露的各种受攻击面。
应用程序常常包含没有直接链接或无法通过可见的主要内容访问的内容和功能。在使用后没 有删除测试或调试功能就是一个常见的示例。
另一个例子是,应用程序为不同类型的用户(如匿名用户、通过验证的常规用户和管理员)提供不同的功能。在某种权限下对应用程序进行彻底抓取的用户会遗漏拥有另一种权限的用户可使用的功能。发现相关功能的攻击者可利用这些功能提升其在应用程序中的权限。
还存在许多前面描述的解析技巧无法确定的重要内容和功能,如下所示。
备份文件。如果使用动态页面,它们的文件扩展名可能已变成不可执行文件扩展名,可通过审查页面源代码查找可在主页中加以利用的漏洞。
包含Web根目录下(或根目录外)完整文件快照的备份档案,可以使用它迅速确定应用程序的所有内容与功能。
部署在服务器上、用于测试目的但尚未在主应用程序中建立链接的新功能。
定制应用程序中的默认应用程序功能对用户不可见,但在服务器端仍然可见。
尚未从服务器中删除的旧版本文件。如果使用动态页面,这些文件中可能包含当前版本已经修复、但仍然可以在旧版本中加以利用的漏洞。
配置和包含敏感数据(如数据库证书)的文件。
编译现有应用程序功能的源文件。
极端情况下,源代码中可能包含用户名和密码等信息,但更可能提供有关应用程序状态的信息。如果某个位置出现“测试此功能”(test this function)或类似的关键短语,应立即从此处开始探查漏洞。
包含有效用户名、会话令牌、被访问的URL以及所执行操作等敏感信息的日志文件。
发现隐藏的内容需要组合使用自动和手动技巧,而且往往需要一定的运气。
1.蛮力技巧
第14章将介绍攻击者如何利用自动技巧提高攻击应用程序的效率。现在可以利用自动技巧向Web服务器提出大量请求,尝试猜测隐藏功能的名称或标识符。
例如,假设用户指定的抓取已经确定有以下应用程序内容:
首先,试图确定隐藏内容的自动化工具将提出下列请求,以定位其他目录:
Burp Intruder可用于循环访问一组常见的目录名称并收集服务器的响应信息,可通过检查这些信息来确定有效的目录。图4-4表示正在配置Burp Intruder探查Web根目录中的常见目录。
图4-4 配置Burp Intruder探查常见目录
执行攻击后,单击status和length等标题栏会对其中的结果进行相应分类,有助于迅速发现异常,如图4-5所示。
图4-5 Burp Intruder显示目录蛮力攻击结果
对目录和子目录进行蛮力攻击后,就可以查找应用程序中的其他页面。这时,/auth目录特别有用,其中包含在抓取过程中确定的登录资源,对未通过验证的攻击者而言,这可能是一个不错的起点。同样,攻击者可以请求该目录中的一系列文件:
此攻击的结果如图4-6所示,它确定了/auth目录中的一些资源:
图4-6 Burp Intruder显示文件蛮力攻击结果
值得注意的是,针对Profile的请求返回了HTTP状态码302。这表示如果未经验证访问此链接,用户将被重定向到登录页面。此外,虽然Login页面已在抓取过程中被发现,但Register页面尚未被发现。这可能说明此功能可以运行,攻击者能够在该站点上注册一个用户账户。
注解
不要想当然地认为:如果被请求的资源存在,应用程序将返回200 OK响应,否则将返回404 Not Found响应。许多应用程序以自定义的方式处理访问不存在资源的请求,通常返回一个带200响应码的预定义错误消息。而且,一些访问现存资源的请求可能会收到非200响应。下面简要说明在使用蛮力技巧查找隐藏内容时可能遇到的响应码的含义。
302 Found。如果重定向指向一个登录页面,那么只有通过验证的用户才能够访问该资源;如果指向一个错误消息,就可能披露其他不同的原因;如果指向另一个位置,重定向可能属于应用程序特定逻辑的一部分,应深入分析。
400 Bad Request。应用程序可能对URL中的目录和文件名使用定制的命名方案,但特殊的请求并不遵循该方案。然而,出现这种情况很可能是因为使用的词汇中包含一些空白符或其他无效的语法。
401 Unauthorized或403 Forbidden。该响应通常表示被请求的资源存在,但不管用户的验证状态或权限等级如何,禁止任何用户访问该资源。请求目录时往往会返回此响应,可以据此推断所请求的目录确实存在。
500 Internal Server Error。在查找内容的过程中,该响应通常表示应用程序希望在请求资源时提交某些参数。
由于各种可能的响应都可表示存在某些重要内容,因而很难编写出一段完全自动化的脚本来输出一组有效资源。最佳方法是在使用蛮力技巧时尽可能多地收集与应用程序有关的信息,并对其进行手动检查。