文章目录
- 1、web抓取
- 2、发现隐藏内容
- 2.1 蛮力技巧
- 2.2 通过公布的内容进行推测
- 2.3 利用公共信息
- 3、应用程序页面和功能路径
- 4、发现隐藏参数
攻击应用程序的第一步是收集和分析与其有关的一些关键信息,以清楚了解攻击目标。解析过程首先是枚举应用程序的内容与功能,从而了解应用程序的实际功能与运行机制。浏览应用程序的基本方法是从主初始页面开始,然后是每一个链接和所有多阶段功能(如用户注册或密码重置)。
1、web抓取
渗透测试步骤:
- 配置浏览器,使用Burp或WebScarab作为本地代理服务器。
- 以常规方式浏览整个应用程序,访问发现的每一个url,提交每一个表单并执行全部多阶段功能。尝试在JavaScript激活与禁用、cookie激活与禁用的情况下进行浏览。许多应用程序能够处理各种浏览器配置,可以获取应用程序内的不同内容和代码途径。
- 检查由代理服务器/爬虫工具生成的站点地图,确定手动浏览时没有发现的所有应用程序内容和功能。确定爬虫如何枚举每一项内容,例如,在burp spider种,检查“链接自”(Linked From)的详细内容。通过浏览器访问这些内容,以使代理服务器/爬虫工具检查服务器响应,从而确定其他所有内容。
- 另外,还可以要求工具以已经枚举的所有内容为基础,主动抓取站点内容。首先,请确定任何危险的或可能中断应用程序会话的URL,并配置爬虫,将它们排除在抓取范围之外。
2、发现隐藏内容
应用程序常常包含没有直接链接或无法通过可见的主要内容访问的内容和功能。在使用后没有删除测试或调试功能就是一个常见的例子。
2.1 蛮力技巧
假如用户指定的抓取已经确定有以下应用程序内容:
可以通过自动化的方式确定隐藏内容,以定位其他内容:
就是自己有一个目录列表,按照列表里的URL顺序访问,看看服务器上是否存在这些目录。
Burp Intrude可用于循环访问一组常见的目录名称并收集服务器的响应信息,可通过检查这些信息来确定有效的目录。下图表示正在配置Burp Intruder探查web根目录的常见目录:
执行攻击后,单击status和length等标题栏会对其中的结果进行分类。
注意:不要想当然的认为:如果被请求的资源存在,应用程序将会返回200 OK 响应,否则将会返回404 Not Found响应。许多应用程序以自定义的方式处理访问不存在资源的请求,通常返回一个带200状态码的预定义错误信息。而且,一些访问现存资源的请求可能会收到非200响应。
下面简要介绍在使用蛮力技巧查找隐藏内容时可能遇到的响应码的含义:
- 302 Found。如果重定向指向一个登陆页面,那么只要通过验证的用户才能访问该资源;如果指向一个错误信息,就可能披露其他不同的原因;如果指向另一个位置,重定向可能属于应用程序特定逻辑的一部分,应深入分析。
- 400 Bad Request。应用程序可能对URL中的目录和文件名使用定制的命名方案,但特殊的请求并不遵循这一方案。然而,出现这种情况很可能是因为使用的词汇中包含一些空白符或其他无效的语法。
- 401 Unauthorized 或 403 Forbidden。该响应通常表示被请求的资源存在,但不管用户的验证状态或权限等级如何,禁止任何用户访问该资源。请求目录时往往会返回此响应,可以推断所请求的目录确实存在。
- 500 Internal Server Error。在查找内容的过程中,该响应通常表示应用程序希望在请求资源时提交某些参数。
由于各种可能的响应都可表示存在某些重要内容,因此很难编写出一段完全自动化的脚本来输出一组有效资源。最佳方法是在使用蛮力技巧时尽可能多地收集与应用程序有关的信息,并对其进行手动检查。
渗透测试步骤:
- 手动提出一些访问有效与无效资源地请求,并确定服务器如何处理无效资源;
- 使用用户指定地抓取生成地站点地图作为自动查找隐藏内容地基础;
- 自动提出访问应用程序内已知的每个目录或路径中常用文件名和目录的请求。使用Burp Intruder或一段定制脚本,结合常用文件名和目录词汇表,迅速生成大量请求。如果已经确定应用程序处理访问无效资源请求的特定方式(如自定义的file not found页面),应配置Intruder或脚本突出显示这些结果,以便将其忽略;
- 收集从服务器收到的响应,并手动检查这些响应以确定有效的资源;
- 反复执行这个过程,直到发现新内容。
2.2 通过公布的内容进行推测
许多应用程序对其内容与功能使用某种命名方案。通过应用程序中已经存在的资源进行推断,可以调整自动枚举操作,提高发现其他隐藏内容的可能性。
渗透测试步骤
- 检查用户指定的浏览与基本蛮力测试获得的结果。编译枚举出的所有子目录名称、文件词干和文件扩展名列表。
- 检查这些列表,确定应用程序使用的所有命名方案。例如,如果有些页面的名称为AddDocument.jsp和ViewDocument.jsp,那么可能还有叫做EditDocument.jsp和RemoveDocument.jsp的页面。通常,只需要查看几个示例,就能推测出开发者的命名习惯。
根据其个人风格,开发者可能采用各种命名方法,如冗长式(AddANewUser.asp)、简洁式(AddUser.asp)、使用缩写式(AddUsr.asp)或更加模糊的命名方式(AddU.asp)。
- 不同内容的命名方案使用数字和日期作为标识符,通过它们可轻易推测出隐藏的内容。静态内容(而非动态脚本)常常采用这种命名方式。例如,如果一家公司的Web站点含有AnnualReport2009.pdf和AnnualReport2010.pdf这两个文件的链接,应该可以立即确定接下来的报告名称。
- 检查所有客户端代码,如HTTP和JavaScript,确定任何与隐藏服务器端内容有关的线索。这些代码包括与受保护或没有建立链接功能有关的HTML注释以及包含禁用sUBMIT元素的HTML表单等。通常,注释由生成Web内容的软件自动生成,或者由应用程序运行的平台生成。参考服务器端包含文件之类的内容也特别有用。这些文件可被公众下载,并且可能包含高度敏感的信息(如数据库连接字符串和密码)。另外,开发者的注释中可能包含各种有用的信息,如数据库名称、后端组件引用、SQL查询字符串等。厚客户端组件(如Java applet和ActiveX控件)也可能包含可供利用的敏感数据。
- 把已经枚举出的内容添加到其他根据这些列表项推测出来的名称中,并将文件扩展名列表添加到txt、bak、src、inc和old这些常用扩展名中,它们也许能够披露现有页面备份版本的来源以及与所使用的开发语言有关的扩展名,如.Java和.cs;这些扩展名可能揭示已经被编译到现有页面的来源文件。
- 搜索开发者工具和文件编辑器不经意建立的临时文件。例如.DS_Store文件,其中包含一个OS X目录索引,或者file.php~1,它是编辑file.php时临时创建的文件,或者大量软件工具使用的.tmp文件。
- 进一步执行自动操作,结合目录、文件词干和文件扩展名列表请求大量潜在的资源。例如,在特定的目录中,请求每个文件词干和每个文件扩展名;或者请求每个目录名作为已知目录的子目录。
- 如果确定应用程序使用一种统一的命名方案,考虑在此基础上执行更有针对性的蛮力测试。例如,如果已知AddDocument.jsp和ViewDocument.jsp存在,就可以建立一个操作列表(编辑、删除、新建等)并请求XxxDocument.jsp。此外,还可以建立项目类型(用户、账户、文件等)并请求AddXxx.jsp。
- 以新枚举的内容和模式作为深人用户指定抓取操作的基础,反复执行上述每一个步骤,继续执行自动内容查找。
2.3 利用公共信息
应用程序的一些内容与功能现在可能并没有与主要内容建立链接,但过去曾经存在链接。在这种情况下,各种历史记录中可能仍然保存隐藏内容的引用。我们可以利用两类主要的公共资源查找隐藏的内容。
- 搜索引擎,如Google。这些搜索引擎中保存有其使用的强大爬虫所发现的所有内容的详细目录,并且将这些内容保存在缓存中,即使原始内容已被删除,缓存中的内容仍然不变。
- Web档案,如www.archive.org上的WayBack Machine。这些档案保存大量Web站点的历史记录。许多时候允许用户浏览某个站点从几年前到现在于不同时期彻底复制的站点快照。
渗透测试步骤:
- 使用几种不同的搜索引擎和Web档案查找它们编入索引或保存的关于所攻击的应用程序的内容。
- 查询搜索引擎时,可以使用各种高级技巧提高搜索效率。以下建议适用于Google(可以在其他引擎中选择“高级搜索”找到对应的查询)。
- site:www.wahh-target.com。它将返回Google引用的每一个目标站点资源。
- site:www .wahh-target.com login。它将返回所有包含login表达式的页面。在大型而复杂的应用程序中,这个技巧可用于迅速定位感兴趣的资源,如站点地图密码重设功能、管理菜单等。
- link:www.wahh-target.com。它将返回其他Web站点和应用程序中所有包含目标站点链接的页面。其中包括过去内容的链接或仅第三方可用的功能,如合作伙伴链接。
- related:www.wahh-target.com。它将返回与目标站点“相似”的页面,因此可能包含大量无关的资料。
- 每次搜索时,不仅在Google的默认Web部分进行搜索,还要搜索“群组”和“新闻”部分,它们可能会提供不同的结果。
- 浏览到某个查询搜索结果的最后一个页面,并选择**“将省略的结果纳人搜索范围后再重新搜索”**。默认情况下,Google会删除结果中它认为与其他页面非常相似的页面,过滤冗长的结果。
- 查看感兴趣页面的缓存版本,包括任何不再在应用程序中出现的内容。某些情况下,搜索引擎缓存中可能包含如果未通过身份验证或付费就无法直接访问的资源。
- 在属于相同组织的其他域名上执行相同的查询,这些域名中可能包含与所攻击的应用程序有关的有用信息。
如果搜索结果发现主应用程序中不再存有链接的陈旧内容和功能,它们可能仍然有用。陈旧功能中可能包含应用程序其他地方并不存在的漏洞。
即使陈旧内容已经从现有应用程序中删除,但是从搜索引擎缓存或Web档案中发现的相关信息仍然可能包含与应用程序现有功能有关的引用或线索,它们可能有助于攻击者向其实施攻击。
3、应用程序页面和功能路径
在Web应用程序出现之前的万维网时代,当时的Web服务器是静态信息仓库,人们使用实际为文件名的URL获取这类信息。要公布Web内容,只需简单生成一批HTML文件并将其复制到Web服务器上的相应目录即可。当用户单击超链接时,他们浏览由公布者创建的文件,通过服务器上目录树中的文件名请求每个文件。
虽然Web应用程序的急速演变从根本上改变了用户与Web交互的体验,但概念化和分类Web应用程序内容仍然适用于绝大多数的Web应用程序内容和功能。各种功能一般通过不同的URL访问,后者通常是执行该项功能的服务器端脚本的名称。请求参数(位于URL查询字符串或Post请求主体中)并不告知应用程序执行何种功能,而是告知应用程序在执行功能时使用哪些信息。有鉴于此,建立基于URL的解析方法可对应用程序的功能进行有效分类。
在使用REST风格的URL的应用程序中,URL文件路径的某些部分包含实际上用做参数值的字符串。在这种情况下,通过解析URL,爬虫能够解析应用程序功能和这些功能的已知参数值列表。
但是,在某些应用程序中,基于应用程序“页面”的动机并不适用。但是,在许多情况下,另外一种基于功能路径的动机可以更加有效地分类其内容与功能。
渗透测试步骤:
- 确定所有通过在参数中提交某一功能的名称(如/admin.jsp?action=editUser)而非通过请求代表那个功能的一个特殊页面(如/admin/editUser.jsp)访问应用程序功能的情况。
- 修改上述用于查找URL相关内容的自动化技巧,利用它处理应用程序使用的内容-访问机制。例如,如果应用程序使用参数指定servlet和方法名称,首先确定它在请求一个无效servlet或方法以及请求一个有效方法与其他无效参数时的行为。设法确定表示“触点”(即有效servlet和方法)的服务器响应的特点。如果可能,想出办法分两个阶段攻击这个问题,首先枚举servlet,然后枚举其中的方法。对用于查找URL相关内容的技巧使用相似的方法,列出常见项目,通过从实际观察到的名称进行推断,增加这些项目,并根据项目生成大量请求。
- 如果可能,根据功能路径绘制一幅应用程序内容图,说明所有被枚举的功能和逻辑路径以及它们之间的依赖关系。
4、发现隐藏参数
如果应用程序使用其他参数以别的方式控制其逻辑,那么它使用请求参数说明应执行何种功能的情况就会出现变化。例如,如果在URL的查询字符串中加入debug=true参数,应用程序的运作方式就会发生改变:它可能会关闭某些输人确认检查,允许用户避开某些访问控制或者在响应中显示详细的调试信息。许多时候,我们无法从应用程序的任何内容直接推断它如何处理这个参数(例如,它并不在超链接的URL中插人debug=false)。只有通过猜测许多值,才能在提交正确的值之后了解这个参数产生的效果。
渗透测试步骤:
- 使用常用调试参数名称(调试、测试、隐藏、来源等)和常用值(真、是、开通和1等)列表,向一个已知的应用程序页面和功能提出大量请求。重复执行这一操作,直到浏览完所有名/值对组合。在POST请求的URL查询字符串和消息主体中插入增加的参数。
- 监控收到的全部响应,确定任何表明增加的参数给应用程序处理过程造成影响的异常。
- 根据可用时间,在许多不同的页面或功能中查找隐藏的参数。选择开发人员最有可能在其中执行调试逻辑的功能,如登录、搜索、文件上传和下载等。