ARTICLE / 安全

web应用渗透测试方法论

WEB应用程序渗透测试方法论

指导思想:方法论中一系列任务根据他们之间的逻辑依赖关系组织和排序。实际上,渗透测试过程往往需要发挥自己的想象,思考可采取的攻击方向,并根据所发现的有关目标应用程序的信息指导攻击方向。

某一个阶段收集到的信息有助于返回到 前一个阶段,以设计更具有针对性的攻击。

在应用程序的某个区域发现的一个关键漏洞可简化对另一个区域的攻击。

一些区域的测试结果有助于确定在其他区域可立即探查出的重复出现的漏洞模式。

一般规范:适用于所有必须测试的区域以及需要采用的各种技巧

假设需要在咨询工作中采用这种方法,渗透测试员应当首先确定测试范围,明确了解测试包含的主机名、URL与功能以及允许执行的测试类型是否存在任何限制。还应当向应用程序所有者告知对一个“黑盒”目标实施任何渗透测试包含的内在风险,并建议他们在开始测试前备份所有重要数据。

  • 一些字符在HTTP请求(HTTP请求头)的不同部分具有特殊的含义。应对这些字符进行URL编码,以确保应用程序按照想要的方式解释这些字符。
  • &用于分隔URL查询字符串与消息主体中的参数。要插入一个&字符,必须将其编码为%26.
  • =用于分隔URL查询字符串与消息主体中每个参数的名称和值。要插入一个字面量=字符,必须将其编码为%3d.
  • ?用于标记URL查询字符串的起始位置。要插入一个字面量?字符,必须将其编码为%3f。
  • 空格用于在请求的第一行标记URL的结束位置,并可用于在cookie消息头中表示一个cookie值结束。要插入一个字面变量空格字符,必须将其编码为%20或+。
  • +表示一个编码的空格,要插入一个字面量+字符,必须将其编码为%2b
  • ;用于在cookie消息头中分隔单个cookie。要插入一个字面量;字符,必须将其编码为%3b
  • #用于在URL中标记片段标识符。如果在浏览器的URL中输入这个字符,它会传给服务器的URL截短。要插入一个字面量#字符,必须将其编码为%23。
  • %在URL编码方案中作为前缀。要插入一个字面量%字符,必须将其编码为%25。
  • 空字节和换行符等,非打印字符必须使用他们的ASCII字符代码进行URL编码。空字节和换行符的编码分别为%00和%0a。

2. 表单中输入URL编码的数据通常会导致浏览器执行另一层编码。例如,在表单中提交%00可能会导致向服务器发送值%2500。为此,通常最好在拦截代理服务器中查看最终请求。

3. 许多查找常见Web应用程序的测试需要发送各种专门设计的输入字符串,并监控应用程序响应,从中搜索表示漏洞存在的反常现象。判断漏洞存在不应仅判断正向特征,还应包含反向特征比对多角度确认,有时候,无论是否提交某个特定漏洞的触发器,应用程序对一个特殊请求的响应都将包含这个漏洞的签名。只要提交专门设计的特殊输入导致了与某个漏洞相关的行为(如一个特殊的错误消息),应该重新核查,确定在相关参数中提交良性输入是否也会造成相同的行为。

4. 前一个请求数据的返回状态会对接下来的请求以及返回造成影响。有时,当调查一个尚未确定的漏洞并隔离某一个反常行为的根源时,必须避免任何收集到的状态信息造成的影响。通常,使用一个新的浏览器进程开始另一个会话,再使用良性请求导航至观测到发生反常的位置,然后重新提交专门设计的输入,即可。还可以对请求中包含的cookie和缓存信息进行调整,重复利用这种方法。此外,还可以使用burp reqeater等工具隔离一个请求。

5. 一些应用程序使用一种负载平衡的配置,其中连续的HTTP请求可能会被不同的后端服务器在Web层,展现层,数据层或其它层处理。不同服务器在配置上的细微差异可能会影响到处理结果。另外,一些成功的攻击将改变处理请求的某一台服务器的状态,例如在web根目录上创建一个新的文件。为隔离特殊操作造成的影响,可能需要连续提交几个相同的请求,测试每个请求的结果,直到请求被相关服务器处理。

1. 解析应用程序内容

1.1 搜索可见的内容

    1. 配置浏览器。BURP、webscarab监控抓包。
    1. 如果有用,配置浏览器,使用一个扩展监控和分析被浏览器处理的HTTP与HTML内容。
    • burp
    1. 以常规方式浏览整个应用程序,访问发现的每一个连接和URL,提交每一个表单并执行全部多阶段功能。尝试在JS激活与禁用,Cookie激活与禁用情况下浏览。许多应用程序能够处理各种浏览器配置,渗透测试员可以获得应用程序内的不同内容和代码路径。
    1. 如果应用程序使用身份验证,并且渗透测试员已经拥有或可以建立一个登陆账户,那么他应具有账户访问保护功能。
    1. 当浏览、监控通过拦截代理服务器的请求与响应时,了解被提交的数据种类,了解客户端如何控制服务器端应用程序的行为。
    1. 检查被动抓取生成的站点地图,确定任何尚未使用浏览器访问到的内容或功能。根据抓取结果,确定发现每一项内容的位置。使用浏览器访问以上内容,以便爬虫解析服务器的响应,确定其他任何内容。重复执行上述步骤,知道无法确定其他内容或功能。
    1. 完成手动浏览和被动抓取后,可以用一组发现的URL作为种子,使用爬虫抓取应用程序。有时,这样可发现其他在手动浏览时忽略的内容。在进行自动抓取前,首先应确定任何危险的或可能会中断应用程序会话的URL,并配置爬虫,将他们排除在抓取范围之外。

1.2 浏览公共资源

    1. 使用因特网搜索引擎和历史档案确定他们编入索引或保存与目标应用程序有关的内容。
    1. 使用高级搜索选项提高搜索的效率。例如,在Google中,可以使用site:获取所有与目标站点有关的内容;使用link:获取连接到目标站点的其他站点。如果搜索过程中找到现有应用程序已经删除的内容,仍然可以从搜索引擎的缓存中查看这些内容。这些已被删除的内容中可能包含尚未删除的其他资源的连接。
    1. 搜索在应用程序内容,【如联系信息,姓名,身份证号,邮件,地址】。除web搜索外还应进行新闻和分组搜索。在论坛中寻找与目标应用程序及其支持基础架构有关的所有技术信息。
    1. 检查已发布的任何WSDL(web服务描述性语言)文件,以生成应用程序可能采用的功能名称和参数值列表。

1.3 发现隐藏的内容

    1. 确定应用程序如何处理访问不存在的资源请求。手动提出请求,访问一致有效和无效的资源,比较应用程序对这些请求的响应,找到确定资源不存在的简单方法。
    1. 获取常见文件与目录名以及常见的文件扩展名列表。根据存在的名猜测推测可能存在的页面。
    1. 审查所有客户端代码,确定任何与服务器端内容(包括html注释和禁用的表单元素)有关的线索。
    1. 使用自动化技巧,根据目录名,文件名以及文件扩展名列表大量请求,监控应用的响应,确定存在的可访问的内容。
    1. 以枚举内容和模式作为用户指导的抓取以及自动化深入搜索的基础,重复进行内容查找。

1.4 查找默认的内容

    1. 针对web服务器运行nikto,探查所有默认或抑制存在的内容。使用nikto的选项提高探查效率。例如,使用-root选项制定查找默认内容的目录,或者使用-404选项指定一个标识定制化“文件未发现”页面的字符串。
    1. 手动核查所有可能有用的发现,减少探查结果中的错误警报。
    1. 请求服务器的根目录,在host消息头中指定IP地址,确定应用程序是否使用任何不同的内容作出响应。如果是,则针对该IP地址及服务器名称运行Nikto扫描。
    1. 向服务器的根目录提出请求,指定一系列User-Agent消息头。

1.5 枚举标识符指定的功能

    1. 确定任何通过在请求参数中提交一个功能标识符,访问特殊应用程序功能的情况。传参的参数进行猜测确定。
    1. 对用于访问单项功能的机制,应用内容查找技巧。例如,如果应用程序使用一个包含功能名称的参数,首先应该确定指定无效功能时应用程序的行为,设法找到一个确定被请求的功能缺失有效的简单方法。列出常用的功能名称或遍历所使用的标识符的语法范围。使枚举有效功能的操作自动化,使其尽可能迅速高效地完成。
    1. 如果适用,根据功能路径而非URL编制一副应用程序内容地图,列出所有枚举出的功能和逻辑路径以及他们之间的依赖关系。

1.6 调试参数

    1. 选择一个或几个使用隐藏调试参数(如debug=true)的应用程序页面功能。他们最有可能出现在登录、搜索、文件上传或下载等关键功能中。
    1. 使用常用调试参数名(如debug、test、hide和source)与常用参数值(如true、yes、on和1)列表,排出这些名称与值的全部组合,向每一个目标功能提交每个名称参数值对。对于POST请求,在URL查询字符串和请求主体中提交参数。Burp Intruder可以实现自动化。
    1. 在应用程序的响应中查找任何表示添加的参数对应用程序的行为造成影响的反常现象。

2. 分析应用程序

2.1 确定功能

    1. 确定为使应用程序正常运行而建立的核心功能以及每项功能旨在执行的操作。
    1. 确定应用程序采用的核心安全机制以及他们的工作机制。重点了解处理身份验证、会话管理与访问控制的关键机制以及支持他们的功能,如用户注册和账户恢复。
    1. 确定所有较为外围的功能和行为,如重定向使用、站外链接、错误消息、管理与日志功能。
    1. 确定任何与应用程序在其他地方使用的标准GUI外观、参数命名或导航机制不一致的功能。然后将其挑选出来以进行深入测试。

2.2 确定数据进入点

    1. 确定在应用程序中引入用户输入的所有进入点,包括URL/查询子字符串参数、POST数据、cookie与其他由应用程序处理的HTTP消息头。
    1. 分析应用程序使用的所有定制数据传输或编码机制,如非常规的检查字符串格式。了解被提交的数据是否包含参数名或参数值,或者是否使用了其他表示方法。
    1. 确定所有在应用程序中引入用户可控制或其他第三方数据的带外通道,例如,处理和显示通过SMTP收到的消息的Web邮件应用程序。

2.3 确定所使用的技术

    1. 确定客户端使用的各种不同技术,如表单、脚本、cookie、java applet、activeX空间与Flash对象。
    1. 尽可能确定服务器端使用的技术,包括脚本语言,应用程序平台以及与数据库和电子邮件系统等后端组件的交互。
    1. 检查在应用程序响应中返回的HTTP server消息头,查找指定HTTP消息头或HTML源代码注释中出现的其他任何软件标识符。注意,有时候,不同的应用程序区域由不同的后端组件处理,因此渗透测试员可能会受到不同的标识符。
    1. 运行Httprint工具,为web服务器做“指纹标识”。
    1. 检查内容解析过程中获得的结果,确定所有有助于了解服务器端所使用的技术的文件扩展名、目录或其它URL序列。检查所有会话令牌和其他cookie的名称。同时,使用Coogle搜索与这些内容有关的技术。
    1. 确定任何看似有用的、属于第三方代码组建的脚本名称与查询字符串参数。在Google中使用inurl:限定词搜索这些内容,查找所有适用相同脚本与参数、并因此使用相同第三方组件的应用程序。对这些站点进行非入侵式的审查,这样可能会发现其他在攻击的应用程序中没有明确连接的内容和功能。

2.4 解析受攻击面

    1. 设法确定服务器端应用程序的内部结构与功能以及用于实现客户端可见行为的后台机制。例如,获取客户订单的功能可能与数据库进行交互。
    1. 确定各种与每一项功能有关的常见漏洞。例如,文件上传功能可能易于受到目录遍历攻击;用户通信可能受到XSS攻击;联络我们功能可能易于受到SMTP注入 攻击。
    1. 制定一个攻击计划,优先考虑最有用的功能以及与他有关的最严重的潜在漏洞。使用这份计划作为指导,决定应对本章讨论的方法的其他区域投入多少时间和精力。

3. 测试客户端控件

3.1 通过客户端传送数据

    1. 在应用程序中,确定隐藏表单字段、cookie和URL参数明显用于通过客户端传送数据的所有情况。
    1. 根据以上数据出现的位置及其名称与值,尝试确定它在应用程序逻辑中发挥的作用。
    1. 修改数据在应用程序相关功能中的值。确定应用程序是否处理字段中提交的任意值,以及是否可以通过这样做干扰应用程序的逻辑或破坏任何安全控件。
    1. 如果应用程序通过客户端传送模糊数据,渗透测试员可以以各种方式攻击这种传输机制。如果数据被模糊处理,渗透测试员可以破译所使用的模糊算法,从而在模糊数据中提交任意数据。即使它进行了安全加密,仍然可以在其他情况下重新提交这个数据,干扰应用程序的逻辑。
    1. 如果应用程序使用ASP.NET ViewState,对其进行测试,确定是否可以破坏它,或者其中是否包含任何敏感信息。注意,不同应用程序页面使用viewstate的方式可能有所不同。
    • a. 使用BurpSuit中的ViewState分析器确定EnableViewStateMac选项是否被激活该选项表示ViewState的内容不能被修改。
    • b.审查解码后的ViewState,确定它包含的所有敏感数据。
    • c. 修改一个被解码的参数值,重新对其编码,然后将它提交给ViewState。如果应用程序接受修改后的参数值,那么应当把ViewState当做在应用程序中引入任意数据的一个输入渠道,并对它包含的数据执行与其他请求参数相同的测试。

3.2 客户端输入控件

    1. 在将用户输入提交给服务器之前,确定使用长度限制和JS检查等客户端控件对其进行确认的任何情况。当然,这些客户端控件可悲轻易避开,因为渗透测试员可以向服务器发送任意请求。
    1. 通过提交通常被客户端控件阻止的输入,轮流测试每一个受影响的字段,确定服务器是否使用相同的输入确认。
    1. 能够避开客户端确认并不表示存在任何漏洞。因此,应该仔细审查应用程序实施的确认机制,弄清应用程序是否依赖客户端控件保护自身,防止畸形输入,以及这些输入是否可触发任何可被利用的条件。
    1. 检查每一个HTML表单,确定所有禁用的元素,如灰色提交按钮,例如:。 如果发现任何禁用的元素,就与其他表单参数一起提交这些元素,确定该元素是否会对应用程序的处理逻辑造成影响,渗透测试员可在攻击过程中利用这些影响。或者使用自动糊代理服务器规则,自动启用禁用的字段,如BurpProxy的Response Modification“HTML修改”规则Unhide hidden form fields。

3.3 测试浏览器扩展组件