一、常见漏洞
访问控制分为三大类:垂直访问控制、水平访问控制、上下文相关的访问控制
(1)完全不受保护的功能
敏感功能和数据可被任何知道相关URL的用户访问;一些应用程序的敏感功能隐藏在各种不太容易猜测的URL之后,有时候通过审计客户端的代码即可发现。
直接访问方法:如通过API、通过命名规律猜测其他页面
(2)基于标识符的功能
URL中的id可能连续也可能随机,但都是易于攻击的,其次是应用程序日志中包含大量可被用作标识符的数据项
(3)多阶段功能
请求分成多个阶段执行,某些阶段可能能被跳过或水平越权
(4)静态文件
(5)平台配置错误
HTTP请求方法(如可以通过HEAD请求访问GET/POST请求的关键信息)、URL路径、用户角色等
(6)访问控制方法不安全
a. 基于参数的访问控制
b. 基于Referer的访问控制
c. 基于(地理)位置的访问控制
——突破方法:使用位于所需位置的WEb代理服务器;使用在所需位置终止的VPN;使用支持数据漫游的移动设备;直接修改客户端用于确定地理位置的机制
二、攻击访问控制
步骤:
应用程序的功能是否允许用户访问属于他们的特定数据?
是否存在各种级别的用户,是否允许他们访问不同的功能?
管理员是否使用内置在相同应用程序中、以对其进行配置和监控的功能?
发现应用程序的哪些功能或数据资源最有可能帮助攻击者提升当前的权限?
是否存在任何标识符表明正使用某一参数追踪访问控制级别?
(1)使用不同的用户帐户进行测试
步骤 :先使用高级别的帐户确定所有可用的功能,然后使用权限较低的帐户访问这些功能——测试垂直权限提升
如果应用程序隔离用户对不同资源的访问,使用不同的用户级帐户测试访问控制是否有效,或水平权限提升
使用Burp的compare site maps功能,对比两个用户分别登录时的相同点与不同点!
(2)测试多阶段过程
a. 应单独测试每一个请求
b. 尝试发现应用程序确定你是否到达特定阶段的任何位置,尝试使用权限较低的帐户到达该阶段,检测是否可以实施任何权限提升攻击
c. 手动方法:在浏览器中多次完成受保护的多阶段过程,并使用proxy在不同请求中提供的会话令牌切换为权限较低的用户的令牌
d. 快速方法:
使用权限较高的帐户遍历整个多阶段过程;使用权限较低的帐户或不使用帐户登录应用程序;在http history中找到权限较高的用户执行多步骤过程时提出的请求序列,右键选择
request in browser - in current session ,将提供的URL粘贴到以权限较低的用户身份登录的浏览器中;如果应用程序允许,则使用浏览器以正常方式完成剩下的多阶段过程;查看历史记录确定是否可以成功执行特权操作; 以上操作时burp返回的是一个URL的重定向,以不同的用户登录几个不同的浏览器,并将URL粘贴到每个浏览器中进行测试(同一浏览器的窗口会共享cookie)
(3)通过有限访问权限进行测试
a. 尝试找到没有权限访问的资源的标识符
b. 在标签符中查找任何可预测的序列
c. 发现自动攻击的可能
(4)测试“直接访问方法”(API)
a. 确定任何遵循Java命名约定(如get,set,add,update,is has等)或明确指定包结构的参数,记下所有你能够发现的被引用的方法
b. 找到某个列举可用接口或方法的方法,在代理服务器历史记录中进行搜索,看应用程序的正常通信是否调用了该方法。如果该方法未被调用,则尝试使用观察到的命名约定猜测该方法
c. 在公共资源中查找,以确定任何其他可以访问的方法
d. 猜测其他方法名称
e. 使用各种帐户(含未授权访问)访问收集到的所有方法
f. 如果不知道某些方法需要的参数的数量或类型,可以寻找那些不大可能使用参数的方法,如listInterfaces和getAllUsesrsInRoles
(5)测试对静态资源的控制
使用不同帐户访问,了解命名方案,猜测其他静态文件
(6)测试对HTTP方法实施的限制
a. 使用一个权限较高的帐户,确定一些执行敏感操作的特权请求,如添加新用户或更改用户的安全角色的请求
b. 如果这些请求未受到任何反CSRF令牌或类似功能的保护,可以使用权限较高的帐户确定,如果HTTP方法被修改,应用程序是否仍然执行请求的操作。应测试的HTTP方法包括POST/GET/HEAD/任何无效 的HTTP方法
c. 如果应用程序执行任何使用与最初的方法不同的HTTP方法的请求,则应使用上述标准技巧,通过权限较低的帐户对针对这些请求实施的访问控制进行测试
三、保障访问控制的安全
假设用户知道每个应用程序的URL和标识符,确保应用程序的访问控制足以防止未授权访问
不要信任何用用户提交的表示访问权限的参数
不要认为用户将按设定的顺序访问页面
不要相信用户不会篡改通过客户端传送的数据
仔细评估并记录每个应用程序功能单元的访问控制要求
通过用户会话做出所有访问控制决定
使用一个中央应用程序组件检查访问控制
使用编程技巧确保前面的方法没有例外,均交由中央访问控制机制查询是有效的方法
对于特别敏感的页面,可以通过IP地址进一步限制访问
保护静态页面,方法有:向执行相关访问控制逻辑的服务器端动态页面传送一个文件名,间接访问静态文件,其次,通过HTTP验证或应用程序服务器的其他特性隐藏进入的请求,并在允许访问前检查资源许可,控制用户直接访问静态文件。
任何时候对客户端传送的标识符,都需要对它们进行重新确认
对安全性很关键的应用程序功能,执行重复验证和双重授权
记录执行敏感操作的事件
多层权限模型:
编程控制:数据库权限保存在一个数据库表中,并以编程的形式来做出访问控制决定
自主访问控制DAC:管理员可将自己的权限分配给其他与拥有特殊资源有关的用户
基于角色的访问控制RBAC
声明式控制:应用程序使用有限的数据库帐户访问数据库,权限是由另一个组件赋予应用程序的。
渗透测试步骤:
a. 应用程序层面的编程检查易于受到注入类攻击
b. 在应用程序服务器层面定义的角色,其定义既不全面,也不完整
c. 低权限操作系统帐户通常仍然能阅读主机文件系统 中保存的各种敏感数据,任何准许他人访问任意文件的漏洞都可以加以利用
d. 应用程序软件本身的漏洞 有助于突破访问控制
e. 在适当位置的一个可供利用的访问控制漏洞可成为重大权限提升攻击的起点