第8章 攻击访问控制
从逻辑上讲,应用程序的和新安全机制的访问控制建立在验证和会话管理之上。
访问控制漏洞的概念:应用程序允许攻击者执行某种攻击者没有资格执行的操作。
该漏洞普遍的原因:需要对每一个请求,以及特殊用户在特定时刻尝试对资源执行的每一项操作执行访问控制检查。
8.1 常见漏洞
垂直访问控制:允许各种类型的用户访问应用程序的不同功能。
水平访问控制:允许用户访问一组相同类型的、内容极其广泛的资源。
上下文相关的访问控制:确保基于应用程序当前的状态,将用户访问仅限于所允许的内容。
8.1.1 完全不受保护的功能
- 任何人只需访问一个特定的URL即可完全控制它的管理功能。(URL不具有保密性)
- 应用程序披露实际用于远程调用API方法的URL或参数
8.1.2 基于标识符的功能
- 通过资源标识符即可对其进行请求(资源标识符并不具有保密性)
8.1.3 多阶段功能
- 应用程序的许多功能需要通过几个几段执行。而开发者认为,任何到达验证过程后续阶段的用户一定已经拥有相关的权限,因为前面的阶段已经验证了这些权限。攻击者即可直接进入后面的阶段而不需验证。
8.1.4 静态文件
- 用户向Web服务器请求静态资源时,它的内容直接由Web服务器返回。静态资源本身并不能执行任何检查以确认提出请求的用户拥有必要的权限。
8.1.5 平台配置错误
平台级配置基于以下条件允许或拒绝访问请求:
- HTTP请求方法
- URL路径
- 用户角色
若没有正确制定规则,可能易于受到攻击。如使用无法识别的HTTP方法的请求,平台直接将它们交由GET请求处理程序处理。
8.1.6 访问控制方法不安全
如一些基于客户端提交的请求参数或受攻击者控制的其他条件作出访问控制决定:
- 基于参数的访问控制
- 基于Referer的访问控制
- 基于位置的访问控制
8.2 攻击访问控制
8.2.1 使用不用用户账户进行测试
8.2.2 测试多阶段过程
8.3.3 通过有线访问权限进行测试
8.4.4 测试“直接访问方法”
8.2.5 测试对静态资源的控制
8.2.6 测试对HTTP方法试试的限制
8.3 保障访问控制的安全
- URL或标识符并不保密
- 不要信任任何用户提交的表示访问权限的参数
- 不要认为用户将按设定的顺序访问应用程序页面
- 不要相信用户不会篡改客户端传送的数据
- 仔细评估并记录每个应用程序功能单元的访问控制要求
- 通过用户会话作出所有访问控制决定
- 使用一个中央应用程序组件检查访问控制
- 通过这个组件处理每一个客户端请求,确认允许提出请求的用户访问他请求的功能和资源
- 使用编程技巧确保前面的方法没有例外
- 对于特别敏感的功能,可通过IP地址进一步限制访问
- 要保护静态内容,可通过这两个方法:
-
- 通过向执行相关访问控制逻辑的服务器端动态页面传送一个文件名,间接访问静态文件
-
- 通过使用HTTP验证或应用程序服务器的其他特性隐藏进入的请求,并在允许访问前检查资源许可,控制用户访问静态文件
- 服务器应只信任完整的服务器端数据
- 对于安全性很关键的应用程序功能可考虑执行重复验证和双重授权
- 记录每一个访问敏感数据或执行敏感操作的事件
多层权限模型
- 根据在应用程序服务器层面定义的用户角色,使用应用程序服务器对完整URL路径实施访问控制
- 当执行其他用户的操作时,应用程序可使用一个不同的数据库账户
- 应使用一个权限表,对数据库中不同的数据表执行严格的访问控制
- 用于运行基础设施中每个组件的操作系统账户只需分配组件实际所需的最低权限
访问控制概念
- 编程控制
- 自主访问控制
- 基于角色的访问控制
- 声明式控制