参考: The Web Application Hacker’s Handbook Chapter 8
在开始探查应用程序以检测任何实际的访问控制漏洞之前,您应该花一点时间查看应用程序映射练习的结果(请参阅第4章)。 您需要了解应用程序在访问控制方面的实际要求,因此,将精力集中在哪里可能最有成果。
HACK STEPS
在检查应用程序的访问控制时,需要考虑以下几个问题:
- 1.应用程序功能是否使单个用户访问属于他们的特定数据子集?
- 2.是否有不同级别的用户(例如经理,主管,来宾等)被授予访问不同功能的权限?
- 3.管理员是否使用同一应用程序内置的功能来配置和监视它?
- 4.您确定了应用程序中哪些功能或数据资源最有可能使您升级当前特权?
- 5.是否有任何标识符(通过POST正文消息的URL参数)表明正在使用参数来跟踪访问级别?
1.使用不同的用户帐户进行测试(Testing with Different User Accounts)
测试应用程序访问控制有效性的最简单,最有效的方法是使用不同的帐户访问该应用程序。 这样,您可以确定一个帐户可以合法访问的资源和功能是否可以被另一个帐户非法访问。
HACK STEPS
- 1.如果应用程序将用户访问权限划分为不同级别,请首先使用功能强大的帐户查找所有可用功能,然后尝试使用特权较低的帐户访问此功能以测试垂直特权升级。
- 2.如果应用程序将用户对不同资源(例如文档)的访问分开,请使用两个不同的用户级别帐户来测试访问控制是否有效或横向特权升级是否可能。 例如,找到一个可以被一个用户合法访问但不能被另一个用户合法访问的文档,然后尝试使用第二个用户的帐户访问该文档-通过请求相关的URL或从第二个用户的会话中提交相同的POST参数。
彻底测试应用程序的访问控制是一个耗时的过程。 幸运的是,有些工具可以帮助您自动执行某些工作,从而使测试更快,更可靠。 这将使您可以专注于需要人类智能才能有效执行的任务部分。
Burp Suite使您可以使用两个不同的用户上下文来映射应用程序的内容。 然后,您可以比较结果以准确查看每个用户访问的内容在哪里相同或不同。
HACK STEPS
- 1.将Burp配置为代理并禁用拦截后,在一个用户上下文中浏览应用程序的所有内容。 如果要测试垂直访问控制,请为此使用更高权限的帐户。
- 2.查看Burp网站地图的内容,以确保您已确定要测试的所有功能。 然后,使用上下文菜单选择“比较站点地图”功能。
- 3.要选择要比较的第二个站点地图,可以从Burp状态文件中加载它,也可以让Burp在新的会话上下文中动态重新请求第一个站点地图。 要在相同类型的用户之间测试水平访问控件,只需将应用程序映射为其他用户,即可加载之前保存的状态文件。 为了测试垂直访问控制,最好以低特权用户身份请求高特权站点地图,因为这样可以确保完整覆盖相关功能。
- 4.要在其他会话中重新请求第一个站点地图,您需要使用低特权用户会话的详细信息配置Burp的会话处理功能(例如,通过记录登录宏或提供要在请求中使用的特定cookie) 。 第14章将更详细地描述此功能。您可能还需要定义合适的范围规则,以防止Burp请求任何注销功能。
图8-1显示了简单站点地图比较的结果。 它对站点地图之间的差异进行了彩色分析,显示了在两个地图之间已添加,删除或修改的项目。 对于修改后的项目,该表包括“差异计数”列,该列是将第一张地图中的项目修改为第二张地图中的项目所需的编辑次数。 同样,当一个项目被选中时,响应也会被着色以显示这些编辑在响应中的位置。
解释站点地图比较的结果需要人类智慧,并且需要了解特定应用程序功能的含义和上下文。 例如,图8-1显示了每个用户在查看其主页时返回的响应。 这两个响应显示了对登录用户的不同描述,并且管理用户还有一个附加菜单项。 这些差异是意料之中的,并且由于它们仅涉及用户界面,因此对于应用程序访问控制的有效性是中性的。
图8-2显示了每个用户请求顶级管理页面时返回的响应。 在这里,管理用户看到可用选项的菜单,而普通用户看到“未授权”消息。 这些差异表明访问控制已正确应用。 图8-3显示了每个用户请求“列表用户”管理功能时返回的响应。 在这里,响应是相同的,表明该应用程序很容易受到攻击,因为普通用户不应访问此功能,并且在其用户界面中没有与该功能的任何链接。
仅浏览站点地图树并查看项目之间的差异数量不足以评估应用程序访问控制的有效性。两个相同的响应可能表明存在漏洞(例如,在公开敏感信息的管理职能中),也可能是无害的(例如,在未受保护的搜索功能中)。相反,两个不同的响应仍可能表示存在漏洞(例如,在每次访问时返回不同内容的管理功能中)或可能是无害的(例如,在显示有关当前已登录帐户的配置文件信息的页面中)用户)。由于这些原因,全自动工具通常在识别访问控制漏洞方面无效。使用Burp的功能来比较站点地图,您可以使尽可能多的过程自动化,以现成的形式为您提供所需的所有信息,并让您应用该应用程序的知识来识别任何实际的漏洞。
2.测试多阶段过程(Testing Multistage Processes)
在测试某些多阶段过程时,上一节中描述的方法(在不同的用户上下文中访问时比较应用程序的内容)无效。 在这里,要执行一项操作,用户通常必须以正确的顺序发出多个请求,并且应用程序会在执行操作时根据用户的操作建立一些状态。 简单地重新请求站点地图中的每个项目可能无法正确地复制该过程,因此尝试的操作可能由于使用访问控制以外的原因而失败。
例如,考虑添加新的应用程序用户的管理功能。 这可能涉及几个步骤,包括加载表单以添加用户,提交包含新用户详细信息的表单,查看这些详细信息以及确认操作。 在某些情况下,应用程序可能会保护对初始表单的访问,但无法保护处理表单提交的页面或确认页面。 整个过程可能涉及许多请求,包括重定向,而在较早阶段提交的参数是稍后通过客户端重新传输。 此过程的每个步骤都需要单独测试,以确定访问控制是否正确应用。
HACK STEPS
- 1.当以多步方式执行某个动作时,涉及到客户端到服务器的几个不同请求,请分别测试每个请求,以确定是否已对其应用访问控制。 确保包括每个请求,包括表单提交,以下重定向以及所有未参数化的请求。
- 2.尝试找到应用程序有效假定您到达某个特定点的所有位置,而这些位置一定是通过合法途径到达的。 尝试使用特权较低的帐户以其他方式达到此目的,以检测是否可能发生特权升级攻击。
- 3.手动执行此测试的一种方法是在浏览器中多次执行受保护的多阶段过程,并使用代理将不同请求中提供的会话令牌切换为特权较低的用户。
- 4.您通常可以通过使用Burp Suite的“浏览器中的请求”功能来大大加快此过程:
- a.使用特权较高的帐户来完成整个多阶段过程。
- b.使用特权较低的帐户登录到应用程序(或完全不登录)。
- c.在“打扰代理”历史记录中,找到以特权更高的用户身份执行多阶段处理时发出的请求顺序。 对于序列中的每个请求,选择上下文菜单项“当前浏览器会话中的浏览器中的请求”,如图8-4所示。 将提供的URL粘贴到以较低特权用户身份登录的浏览器中。
- d.如果应用程序允许您,请使用浏览器以正常方式执行其余的多阶段过程。
- e.在浏览器和代理历史记录中查看结果,以确定它是否成功执行了特权操作。
当您为特定请求选择Burp的“当前浏览器会话中的浏览器请求”功能时,Burp会为您提供一个针对Burp内部网络服务器的唯一URL,您将该URL粘贴到浏览器的地址栏中。 当浏览器请求此URL时,Burp将重定向到原始指定的URL。 当您的浏览器遵循重定向时,Burp用您最初指定的请求替换请求,同时保留Cookie标头不变。 如果要测试不同的用户上下文,则可以加快此过程。 以不同的用户身份登录到多个不同的浏览器,然后将URL粘贴到每个浏览器中,以查看如何处理使用该浏览器登录的用户的请求。 (请注意,由于Cookie通常是在同一浏览器的不同窗口之间共享的,因此通常需要使用不同的浏览器产品或不同计算机上的浏览器来执行此测试。)
TIP 当您在不同的用户上下文中测试多阶段流程时,有时并排查看不同用户的请求顺序对于确定可能需要进一步调查的细微差别有时会很有帮助。 如果您使用不同的浏览器以不同的用户身份访问应用程序,则可以在Burp中创建不同的代理侦听器,以供每个浏览器使用(您需要在每个浏览器中更新代理配置以指向相关的侦听器)。 然后,对于每个浏览器,使用代理历史记录上的上下文菜单打开一个新的历史记录窗口,并设置一个显示过滤器以仅显示来自相关代理侦听器的请求。
3.使用受限访问进行测试(Testing with Limited Access)
如果您只有一个用于访问应用程序的用户级别帐户(或根本没有帐户),则需要进行其他工作来测试访问控制的有效性。 实际上,要执行全面的测试,无论如何都需要做进一步的工作。 可能存在未得到任何应用程序用户界面明确链接的受保护程度差的功能。 例如,也许旧功能尚未删除,或者新功能已部署但尚未发布给用户。
HACK STEPS
- 1.使用第4章中介绍的内容发现技术来识别尽可能多的应用程序功能。 以低特权用户执行此练习通常足以枚举并直接访问敏感功能。
- 2.如果发现应用程序页面可能呈现不同的功能或指向普通用户和管理用户的链接(例如,控制面板或“我的主页”),请尝试将诸如
admin=true
之类的参数添加到URL查询字符串和POST请求的正文中 。 这将帮助您确定这是发现还是授予对用户上下文无法正常访问的任何其他功能的访问。 - 3.测试应用程序是否使用Referer标头作为做出访问控制决策的基础。 对于您有权访问的关键应用程序功能,请尝试删除或修改Referer标头,然后确定您的请求是否仍然成功。 如果不是,则应用程序可能以不安全的方式信任Referer标头。 如果您使用Burp的活动扫描程序扫描请求,Burp会尝试从每个请求中删除Referer标头,并通知您这是否对应用程序的响应产生系统的,相关的影响。
- 4.查看所有客户端HTML和脚本,以查找对隐藏功能或可在客户端上操纵的功能的引用,例如基于脚本的用户界面。 另外,按照第5章中的描述反编译所有浏览器扩展组件,以发现对服务器端功能的任何引用。
枚举所有可访问的功能后,您需要测试是否正确实施了按用户的资源访问隔离。 在应用程序向用户授予对同一类型的更广泛资源的子集(例如文档,订单,电子邮件和个人详细信息)的访问权限的每种情况下,一个用户都有机会获得未经授权的访问权限 其他资源。
HACK STEPS
- 1.如果应用程序使用任何类型的标识符(文档ID,帐号,订单参考)来指定用户正在请求的资源,请尝试发现您没有授权访问权限的资源的标识符。
- 2.如果可以快速连续生成一系列此类标识符(例如,通过创建多个新文档或订单),请使用第7章中介绍的会话令牌技术尝试发现应用程序生成的标识符中的任何可预测序列 。
- 3.如果无法生成任何新的标识符,那么您将只能分析已经发现的标识符,甚至使用简单的猜测方法。 如果标识符具有GUID形式,则基于猜测的任何尝试均不太可能成功。 但是,如果它是一个相对较小的数字,请尝试近距离范围内的其他数字,或者尝试使用具有相同数字位数的随机数字。
- 4.如果发现访问控制已损坏,并且资源标识符是可预测的,则可以发起自动攻击以从应用程序中收集敏感资源和信息。 使用第14章中介绍的技术来设计定制的自动攻击,以检索所需的数据。
当“帐户信息”页面显示用户的个人详细信息以及用户名和密码时,就会发生这种灾难性漏洞。 尽管密码通常在屏幕上被屏蔽,但仍将其完全传输到浏览器。 在这里,您通常可以快速遍历所有帐户标识符,以获取包括管理员在内的所有用户的登录凭据。 图8-5显示了Burp入侵者正在用来成功进行这种攻击。
TIP 当您检测到访问控制漏洞时,立即采取的后续攻击是试图通过损害具有管理特权的用户帐户来进一步提升特权。您可以使用各种技巧来找到管理帐户。使用如图所示的访问控制漏洞,您可能会收获数百个用户凭据,而不会讨厌以每个用户身份手动登录的任务,直到您找到管理员为止。但是,当用顺序数字ID标识帐户时,通常会发现分配给管理员的帐号最少。以最初在该应用程序中注册的少数几个用户身份登录通常可以识别管理员。如果此方法失败,则一种有效的方法是在应用程序中找到一个功能,在该功能中,访问被适当地水平隔离,例如呈现给每个用户的主页。编写脚本以使用每组捕获的凭据登录,然后尝试访问自己的主页。管理用户很可能可以查看每个用户的主页,因此您将立即检测到何时使用管理帐户。
Chapter 8 Attacking Access Controls(1)-Common Vulnerabilities(2)
Chapter 8 Attacking Access Controls(2)-Attacking Access Controls(2)