3.2.2 漏洞发掘技巧
攻击应用程序的第一步是收集和分析与其有关的一些关键信息,以清楚了解攻击目标。解析过程首先是枚举应用程序的内容与功能,从而了解应用程序的实际功能与运行机制。我们可轻松确定应用程序的大部分功能,但其中一些功能并不明显,需要进行猜测和凭借一定的运气才能查明。
列出应用程序的功能后,接下来的首要任务就是仔细分析应用程序运行机制的每一个方面、核心安全机制及其(在客户端和服务器上)使用的技术。这样就可以确定应用程序暴露的主要受攻击面并因此确定随后探查过程的主要目标,进而发现可供利用的漏洞。随着应用程序变得越来越复杂,功能越来越强大,有效的解析将成为一种重要技能。经验丰富的专家能够迅速对所有功能区域进行分类,参照各种实例查找不同类型的漏洞,同时花费大量时间测试其他特定区域,以确定高风险的问题。
1.枚举内容和功能
通常,手动浏览即可确定应用程序的绝大部分内容与功能。浏览应用程序的基本方法是从主初始页面开始,然后是每一个链接和所有多阶段功能(如用户注册或密码重设置)。如果应用程序有一个“站点地图”,可以从它开始枚举内容。
但是,为了仔细检查枚举的内容,全面记录每一项确定的功能.我们有必要使用一些更加先进的技术,而不仅仅是简单浏览。
(1)Web抓取
我们可使用各种工具自动抓取Web站点的内容。这些工具首先请求一个Web页面,对其进行分析,查找连接到其他内容的链接,然后请求这此内容,再继续进行这个循环,直到找不到新的内容为止。
基于这一基本功能,Web应用程序爬虫(spider)以同样的方式分析HTML表单,并使用各种预先设定值或随机值将这些表单返回给应用程序,以扩大搜索范围,浏览多阶段功能,进行基于表单的导航(如什么地方使用下拉列表作为内容菜单)。一些工具还对客户端JavaScript进行某种形式的分析,以提取指向其他内容的URL。现在有各种免费工具可以详细枚举应用程序的内容与功能,它们包括BurpSuite、WebScarab、Zed Attack Proxy和CAT。
1)用户的指定抓取
这是一种更加复杂且可控制的技巧,它比自动化抓取更加先进。用户使用它通过标准浏览器以常规方式浏览应用程序,试图枚举应用程序的所有功能。之后,生成的流量穿过一个组合拦截代理服务器与爬虫的工具,监控所有请求和响应。该工具绘制应用程序地图、集中由浏览器访问的所有URL,并且像一个正常的应用程序感知爬虫那样分析应用程序的响应,同时用它发现的内容与功能更新站点地图。BurpSuite和WebScarab中的爬虫即可用于这种用途。
相比于基本的抓取方法,该技巧具有诸多优点。
如果应用程序使用不常用或复杂的导航机制,用户能够以常规方式使用浏览器来遵循这些机制。用户访问的任何功能和内容将由代理服务器/爬虫工具处理。
用户控制提交到应用程序的所有数据,这样可确保满足数据确认要求。
用户能够以常规方式登录应用程序,确保通过验证的会话在整个解析过程中保持活动状态。如果所执行的任何操作导致会话终止,用户可重新登录并继续浏览。
由于该技巧可从应用程序的响应中解析出链接,因而它能够完整枚举任何危险功能(如deleteuser.jsp),并能将其合并到站点地图中。但是用户可以根据自己的判断决定请求或执行哪些功能。
2)发现隐藏的内容
应用程序常常包含没有直接链接或无法通过主要内容访问的内容和功能。在使用后没有删除测试或调试功能就是一个常见的示例。
另一个例子是,应用程序为不同类型的用户(如匿名用户、通过验证的常规用户和管理员)提供不同的功能。在某种权限下对应用程序进行彻底抓取的用户会遗漏拥有另一种权限的用户可使用的功能。发现相关功能的攻击者可利用这些功能提升其在应用程序中的权限。
(2)分析应用程序
枚举尽可能多的应用程序内容只是解析过程的一个方面。分析应用程序的功能、行为及使用的技术,确定它暴露的关键受攻击面,并开始想出办法探查其中可供利用的漏洞,这项任务也同样重要。
值得研究的一些重要方面如下。
应用程序的核心功能:用于特定目的时可利用它执行的操作。
其他较为外围的应用程序行为,包括站外链接、错误消息、管理与日志功能、重定向使用等。
核心安全机制及其运作方式,特别是会话状态、访问控制以及验证机制与支持逻辑(用户注册、密码修改、账户恢复等)。
应用程序处理用户提交的输入的所有不同位置:每个URL、查询字符串参数、POST数据、cookie以及类似内容。
客户端使用的技术。包括表单、客户端脚本、客户端组件(Java applet、ActiveX控件和Flash)和cookie。
服务器端使用的技术,包括静态与动态页面、使用的请求参数类型、SSL使用、Web服务器软件、数据库交互、电子邮件系统和其他后端组件。
任何可收集到的关于服务器端应用程序内部结构与功能的其他信息(客户端可见的功能和行为的后台传输机制)。
(3)确定用户输入入口点
在检查枚举应用程序功能时生成的HTTP请求的过程中,可以确定应用程序获取用户输入(由服务器处理)的绝大部分位置。需要注意的关键位置包括以下几项。
每个URL字符串,包括查询字符串标记。
URL查询字符串中提交的每个参数。
POST请求主体中提交的每个参数。
每个cookie。
极少情况下可能包括由应用程序处理的其他所有HTTP消息头,特别是User-Agent、Referer、Accept、Accept-Language和Host消息头。
(4)确定服务器端技术
通常,我们可以通过各种线索和指标确定服务器所采用的技术。
1)提取版本信息
许多Web服务器公开与Web服务器软件本身和所安装组件有关的详细版本信息。例如,HTTP Server消息头揭示大量与安装软件有关的信息。
2)HTTP指纹识别
从理论上说,服务器返回的任何信息都可加以定制或进行有意伪造,Server消息头等内容也不例外。大多数应用程序服务器软件允许管理员配置在Server HTTP消息头中返回的旗标。尽管采取了这些防御措施,但通常而言,蓄意破坏的攻击者仍然可以利用Web服务器的其他行为确定其所使用的软件,或者至少缩小搜索范围。HTTP规范中包含许多可选或由执行者自行决定是否使用的内容。另外,许多Web服务器还以各种不同的方式违背或扩展该规范。因此,除通过Server消息头判断外,还可以使用大量迂回的方法来识别Web服务器。
URL中使用的文件扩展名往往能够揭示应用程序执行相关功能所使用的平台或编程语言。
一些子目录名称常常表示应用程序使用了相关技术。
许多Web服务器和Web应用程序平台默认生成的会话令牌名称也揭示其所使用技术的信息。
3)第三方代码组件
许多Web应用程序整合第三方代码组件执行常见的功能,如购物车、登录机制和公告牌。这些组件可能为开源代码,或者从外部软件开发者购买而来。如果是这样,那么相同的组件会出现在互联网上的大量其他Web应用程序中,可以根据这些组件了解应用程序的功能。通常,其他应用程序会利用相同组件的不同特性,确保攻击者能够确定目标应用程序的其他隐藏行为和功能。而且,软件中可能包含其他地方已经揭示的某些已知漏洞,攻击者也可以下载并安装该组件,对它的源代码进行分析或以受控的方式探查其中存在的缺陷。
(5)确定服务器端功能
通过留意应用程序向客户端破解的线索.通常可推断与服务器端功能和结构有关的大量信息,或者至少可做出有根据的猜测。
1)检查提交到应用程序的全部参数的名称和参数值,了解它们支持的功能。
2)从程序员的角度考虑问题,想象应用程序可能使用了哪些服务器端机制和技术来执行能够观察到的行为。
通常应用程序以统一的方式执行其全部功能。这可能是因为不同的功能由同一位开发者编写,或者可遵循相同的设计规范,或者共享相同的代码组件。在这种情况下,我们可轻松推断出服务器端某个领域的功能,并以此类推其他领域的功能。
有时情况可能恰恰相反。许多可靠或成熟的应用程序采用一致的框架来防止各种类型的攻击。如跨站点脚本、SQL注入和未授权访问。在这类情况下,最可能发现漏洞的区域是应用程序中后续添加或“拼接”而其常规安全框架不会处理的部分。此外,这些部分可能没有通过验证、会话管理和访问控制与应用程序进行正确连接。一般情况下,通过GUI外观、参数命名约定方面的差异,或者直接通过源代码中的注释即可确定这些区域。
(6)解析受攻击面
解析过程的最后一个步骤是确定应用程序可能的各种受攻击面,以及与每个受攻击面有关的潜在漏洞。下面简要说明渗透测试员能够确定的一些主要行为和功能,以及其中最有可能发现的漏洞。
客户端确认——服务器没有采用确认检查。
数据库交互——SQL注入。
文件上传与下载——路径遍历漏洞、保存型跨站点脚本。
显示用户提交的数据——跨站点脚本。
动态重定向——重定向与消息头注入攻击。
社交网络功能——用户名枚举、保存型跨站点脚本。
登录——用户名枚举、脆弱密码、能使用蛮力破解。
多阶段登录——登录缺陷。
会话状态——可推测出的令牌、令牌处理不安全。
访问控制——水平权限和垂直权限提升。
用户伪装功能——权限提升。
使用明文通信——会话劫持、收集证书和其他敏感数据。
站外链接——Referer消息头中查询字符串参数泄露。
外部系统接口——处理会话与/或访问控制的快捷方式。
错误消息——信息泄漏。
电子邮件交互——电子邮件与命令注入。
本地代码组件或交互——缓冲区溢出。
使用第三方应用程序组件——已知漏洞。
已确定的Web服务器软件——常见配置薄弱环节、已知软件程序缺陷。