第5章 攻击Web授权

我们刚刚在第4章中看到验证是如何确定用户是否可以登录到Web应用。授权(Authorization)确定已验证的用户所能访问的应用部分,以及在应用中他们可以进行的操作。因为无状态的HTTP协议缺乏每个已验证用户独立会话的最基本概念,Web授权难以实施,因此对于攻击来说是有利可图的。

注意  我们有时候将验证缩写为“authn”,授权缩写为“authz”。

授权的经典实现是为已验证用户的会话提供一个访问令牌,使应用能唯一地识别该用户。然后,应用根据令牌中的标识符和对象之上的访问控制列表(ACL),做出授予或者拒绝对内部对象访问的决策。如果所提供的标识符与对象配置的权限匹配,访问得到授权;如果不匹配,访问被拒绝。这个令牌实际上作为持续的重新验证机制和每次请求一同提供,使用户不再需要持续地手工重新验证。当注销或者会话超时,这个令牌一般被删除、过期或者变为无效。

注意  通常用于唯一区分的会话标识符称作会话ID,和访问令牌是一回事。它通常存储于一个cookie中。

注意  HTTP基本验证采用老式的方法——它在同一领域中每次请求的HTTP Authorize首部中提交以Base64编码的用户名:密码。

显然,访问令牌为用户提供了很大的方便,但是和平常一样,方便总是有代价的。通过猜测、窃取或者重放别人的令牌,恶意的黑客可能假冒其他用户查看数据,或者代替目标用户(水平权限提升)甚至目标管理员(垂直权限提升)执行事务。当服务器端出现授权漏洞时,往往是错误定义的ACL或者业务逻辑和确定应用资源和功能的授权检查中的缺陷所致。

瞄准应用授权功能的攻击者会把他们的精力集中在两个目标之一:劫持应用使用的有效授权/会话令牌以及/或者绕过服务器端ACL。本章主要围绕授权的这两个方面组织,分为如下主要部分:

·授权指纹识别

·攻击ACL

·攻击令牌

·授权攻击案例研究

·授权最佳实践

在许多方面,授权是任何系统安全控制的核心和灵魂,在本章结束时你可能会同意,没有一个Web应用能够在授权被熟练的对手剥离时还能生存。