通常,手动浏览即可确定应用程序的绝大部分内容与功能。浏览应用程序的基本方法是从主初始页面开始,然后是每一个链接和所有多阶段功能(如用户注册或密码重设置)。如果应用程序有一个“站点地图”,可以从它开始枚举内容。
但是,为了仔细检查枚举的内容,全面记录每一项确定的功能,我们有必要使用一些更加先进的技术,而不仅仅是简单浏览。
我们可使用各种工具自动抓取Web站点的内容。这些工具首先请求一个Web页面,对其进行分析,查找连接到其他内容的链接,然后请求这些内容,再继续进行这个循环,直到找不到新的内容为止。
基于这一基本功能,Web应用程序爬虫(spider)以同样的方式分析HTML表单,并使用各种 预先设定值或随机值将这些表单返回给应用程序,以扩大搜索范围、浏览多阶段功能、进行基于表单的导航(如什么地方使用下拉列表作为内容菜单)。一些工具还对客户端JavaScript进行某种形式的分析,以提取指向其他内容的URL。有各种免费工具可以详细枚举应用程序的内容与功能,它们包括Burp Suite、WebScarab、Zed Attack Proxy和CAT(请参阅第20章了解详情)。
提示
许多Web服务器的Web根目录下有一个名为robots.txt的文件,其中列出了站点不希望Web爬虫访问或搜索引擎列入索引的URL。有时,这个文件中还包含敏感功能的参考信息,渗透测试员肯定会对抓取这些信息感兴趣。一些攻击Web应用程序的抓取工具会搜索robots.txt文件,并根据其中列出的URL开始抓取过程。在这种情况下,robots.txt文件可能会危及Web应用程序的安全。
在本章中,我们将以一个虚构的应用程序Extreme Internet Shopping(EIS)为例,说明常见的应用程序解析操作。使用Burp Spider解析EIS的过程如图4-1所示。不需要登录,即可以解析出/shop目录及/media目录中的两件新商品。还要注意的是,图中显示的robots.txt文件引用了/mdsecportal和/site-old目录。这两个目录没有链接到应用程序中的任何位置,Web爬虫仅仅通过访问公开内容中的链接不可能发现这些目录。
图4-1 使用BurpSpider解析应用程序的部分内容
提示
采用REST风格的URL的应用程序使用部分URL文件路径来唯一标识应用程序所使用的数据和其他资源(请参阅第3章了解详情)。在这些情况下,传统Web爬虫的基于URL的应用程序视图非常有用。在EIS应用程序中,/shop和/pub路径采用了REST风格的URL,抓取这些区域即可轻松获取这些路径中的商品的唯一链接。
尽管通常能够进行有效的抓取,但这种完全自动化的方法在内容枚举方面还存在一些重要的限制。
这些工具一般无法正确处理不常用的导航机制(如使用复杂的JavaScript代码动态建立和处理的菜单),因此可能会遗漏应用程序某个方面的功能。
爬虫可能无法抓取到隐藏在编译客户端对象(如Flash和Java applet)中的链接。
多阶段功能往往会严格地执行输入确认检查,因而可能不会接受由自动工具提交的值。例如,用户注册表单中可能包含姓名、电子邮件地址、电话号码和邮政编码字段。自动应用程序爬虫通常会向每一个可编辑的表单字段提交一个单独的测试字符串,而应用程序将返回一条错误消息,称其提交的一个或几个数据无效。由于爬虫并没有能力理解这种错误消息并采取相应行动,所以也就无法成功通过注册,因此无法发现这以后的任何其他内容或功能。
自动化爬虫通常使用URL作为内容标识符。为避免进行连续不确定的抓取,如果爬虫认识到链接内容已被请求,它们会识别出来并且不会再向其发出请求。但是,许多应用程序使用基于表单的导航机制,其中相同的URL可能返回截然不同的内容和功能。例如,一个银行应用程序可能通过一个指向/account.jsp的POST请求执行每一项用户操作,并使用参数传达执行的操作。如果爬虫拒绝向这个URL提交多次请求,它就会遗漏应用程序的大部分功能。一些应用程序爬虫试图解决这一问题(例如,可对Brup Spider进行配置,使其根据参数名称和参数值对提交的表单进行“个性化”处理)。但是,在许多情况下,这种完全自动化的方法并非绝对有效。本章后面我们会讨论解析这一功能的方法。
与前面的情形恰恰相反,一些应用程序在URL中插入实际上并不用于确定资源或功能的可变数据(例如,包含定时器或随机数种子的参数)。应用程序的每个页面中都可能包含一组似乎是爬虫必须请求的新URL,导致它不断进行不确定的抓取。
如果应用程序使用身份验证机制,应用程序爬虫要实现有效抓取,必须能够处理这种机制才能访问它所保护的功能。如果为其手动配置一个通过验证的会话令牌或提交给登录功能的证书,前面提到的爬虫就能实现有效抓取。然而,即使获得令牌或证书,由于各种原因,爬虫执行的一些操作也会让通过验证的会话中断。
由于访问所有URL,爬虫会在某个时候请求退出功能,致使会话中断。
如果爬虫向某个敏感功能提交无效输入,应用程序可能会进行自我防御,终止会话。
如果应用程序在每个页面都使用令牌,爬虫肯定无法按正确的顺序请求页面,这可能引起应用程序结束整个会话。
警告
在一些应用程序中,即使运行一个解析并请求链接的简单Web爬虫也可能极其危险。例如,应用程序可能具有删除用户、关闭数据库、重启服务器等管理功能。如果使用应用程序感知的爬虫,该爬虫发现并使用敏感功能,就可能造成巨大损失。我们曾经遇到一个应用程序具有某种内容管理系统(CMS)功能,它可编辑主应用程序的实际内容。这项功能可通过站点地图发现,并且没有受到任何访问控制的保护。如果针对这个站点运行自动化爬虫,它就会发现编辑功能并开始发送任意数据,致使主Web站点的内容在爬虫运行时就被扭曲。
这是一种更加复杂且可控制的技巧,它比自动化抓取更加先进。用户使用它通过标准浏览器以常规方式浏览应用程序,试图枚举应用程序的所有功能。之后,生成的流量穿过一个组合拦截代理服务器与爬虫的工具,监控所有请求和响应。该工具绘制应用程序地图、集中由浏览器访问的所有URL,并且像一个正常的应用程序感知爬虫那样分析应用程序的响应,同时用它发现的内容与功能更新站点地图。Burp Suite和WebScarab中的爬虫即可用于这种用途(请参阅第20章了解详细信息)。
相比于基本的抓取方法,该技巧具有诸多优点。
如果应用程序使用不常用或复杂的导航机制,用户能够以常规方式使用浏览器来遵循这些机制。用户访问的任何功能和内容将由代理服务器/爬虫工具处理。
用户控制提交到应用程序的所有数据,这样可确保满足数据确认要求。
用户能够以常规方式登录应用程序,确保通过验证的会话在整个解析过程中保持活动状态。如果所执行的任何操作导致会话终止,用户可重新登录并继续浏览。
由于该技巧可从应用程序的响应中解析出链接,因而它能够完整枚举任何危险功能(如deleteUser.jsp),并能将其合并到站点地图中。但是用户可以根据自己的判断决定请求或执行哪些功能。
在Extreme Internet Shopping站点中,以前爬虫无法为/home中的任何内容建立索引,因为这些内容已通过验证。针对/home的请求将导致以下响应:
通过用户指导的抓取,用户可以直接使用浏览器登录应用程序,随后代理服务器/爬虫工具将提取生成的会话,并确定现在对用户可用的所有其他内容。用户成功通过应用程序受保护区域的验证时的EIS站点地图如图4-2所示。
这揭示了主菜单系统中的其他一些资源。该图显示了一个对私有用户资料的引用,此用户资料通过onClick事件处理程序启动的JavaScript函数访问:
由于传统的Web爬虫仅仅抓取HTML中的链接,因此可能会遗漏这种类型的链接。即使是最先进的自动化应用程序爬虫,仍然无法抓取当前应用程序和浏览器扩展所采用的各种导航机制。但是,通过用户指导的抓取,用户只需使用浏览器访问屏幕上可见的链接,代理服务器/爬虫工具就会将生成的内容添加到站点地图中。
相反,值得注意的是,爬虫已成功确定HTML注释中包含的指向/core/sitestats的链接,即使该链接并未在屏幕上向用户显示。
提示
除上面描述的代理服务器/爬虫工具外,在应用程序解析过程中,我们还经常使用一些其他工具,如可从浏览器界面执行HTTP和HTML分析的各种浏览器扩展工具。例如,图4-3所示的IEWatch工具可在Microsoft Internet Explorer中运行,对所有请求和响应(包括消息头、请求参数与cookie)进行监控,并分析每一个应用程序页面,以显示链接、脚本、表单和厚客户端组件。虽然可以在拦截代理服务器中查看所有这些信息,但是,拥有另一份解析数据有助于更好地了解应用程序,并枚举它的所有功能。请参阅第20章了解有关这种工具的详细信息。