黑客攻防技术宝典:Web实战篇(第2版)
上QQ阅读APP看书,第一时间看更新

2.1 处理用户访问

几乎任何应用程序都必须满足一个中心安全要求,即处理用户访问其数据与功能。在通常情况下,用户一般分为几种类型,如匿名用户、正常通过验证的用户和管理用户。而且,许多情况下,不同的用户只允许访问不同的数据,例如,Web邮件应用程序的用户只能阅读自己的而非他人的电子邮件。

大多数Web应用程序使用三层相互关联的安全机制处理用户访问:

❑ 身份验证;

❑ 会话管理;

❑ 访问控制。

上述每一个机制都是应用程序受攻击面的一个关键部分,对于应用程序的总体安全状况极其重要。由于这些机制相互依赖,因此根本不能提供强大的总体安全保护,任何一个部分存在缺陷都可能使攻击者自由访问应用程序的功能与数据。

2.1.1 身份验证

从理论上说,身份验证机制是应用程序处理用户访问的最基本机制。验证用户是指确定用户的真实身份。如果不采用这个机制,应用程序会将所有用户作为匿名用户对待,这是最低一级的信任。

今天,绝大多数Web应用程序都采用传统的身份验证模型,即要求用户提交用户名与密码,再由应用程序对其进行核实,确认其合法性。一种典型的登录功能如图2-1所示。在安全性至关重要的应用程序(如电子银行使用的应用程序)中,通常使用其他证书与多阶段登录过程强化这个基本模型。在安全要求更高的情况下,可能需要基于客户端证书、智能卡或质询—响应令牌(challenge-response token)使用其他身份验证模型。除核心登录过程外,身份验证机制往往还要采取一系列其他支持功能,如自我注册、账户恢复和密码修改工具。

图2-1 一种典型的登录功能

尽管表面看似简单,但无论是设计方面还是执行方面,身份验证机制都存在大量缺陷。常见的问题可能使得攻击者能够确定其他用户的用户名、推测出他们的密码,或者利用其逻辑缺陷完全避开登录功能。攻击Web应用程序时,渗透测试员应当投入大量精力,攻击应用程序采用的各种与身份验证有关的功能。出人意料的是,这种功能中存在的缺陷往往允许攻击者非法访问敏感数据与功能。

2.1.2 会话管理

处理用户访问的下一项逻辑任务是管理通过验证用户的会话。成功登录应用程序后,用户会访问各种页面与功能,从浏览器提出一系列HTTP请求。与此同时,应用程序还会收到各类用户(包括通过验证的用户与匿名用户)发出的无数请求。为实施有效的访问控制,应用程序需要识别并处理每一名用户提交的各种请求。

为满足以上要求,几乎所有的Web应用程序都为每一位用户建立一个会话,并向用户发布一个标识会话的令牌。会话本身是一组保存在服务器上的数据结构,用于追踪用户与应用程序的交互状态。令牌是一个唯一的字符串,应用程序将其映射到会话中。当用户收到一个令牌时,浏览器会在随后的HTTP请求中将它返回给服务器,帮助应用程序将请求与该用户联系起来。虽然许多应用程序使用隐藏表单字段(hidden form field)或URL查询字符串(query string)传送会话令牌(session token),但HTTP cookie才是实现这一目的的常规方法。如果用户在一段时间内没有发出请求,会话将会自动终止,如图2-2所示。

图2-2 一个实施会话超时的应用程序

就受攻击面而言,会话管理机制的有效性基本上取决于其令牌的安全性,绝大多数针对它的攻击都企图攻破其他用户的令牌。如果令牌被攻破,攻击者就可以伪装成被攻破的用户,像已经通过验证的用户一样使用应用程序。令牌生成过程中存在的缺陷是主要的漏洞来源,使攻击者能够推测出发布给其他用户的令牌;随后,攻击者再利用令牌中的缺陷截获其他用户的令牌。

少数应用程序不向用户发布会话令牌,而是通过其他方法在多个请求中重复确认用户身份。如果使用HTTP的内置身份验证机制,那么浏览器会自动在每个请求中重复提交用户证书,帮助应用程序直接通过这些请求识别用户。在其他情况下,应用程序会将状态信息保存在客户端而非服务器上,通常还需要对这些信息进行加密,以防遭到破坏。

2.1.3 访问控制

处理用户访问的最后一个逻辑步骤是做出并实施正确的决策,决定允许或拒绝每一个请求。如果前面的机制运作正常,应用程序即可从收到的每一个请求确认用户的身份。在此基础上,应用程序需要决定是否授权用户执行其所请求的操作或访问相关数据(见图2-3)。

图2-3 应用程序正实施访问控制

访问控制机制一般需要实现某种精心设计的逻辑,并分别考虑各种相关应用程序领域与不同类型的功能。应用程序可支持无数不同的用户角色,每种角色都拥有特定的权限,每名用户只允许访问应用程序中的部分数据。应用程序可能需要根据用户的身份,通过特殊功能实现交易限制与其他检查。

由于典型访问控制的要求相当复杂,因此这种机制中一般存在大量的安全漏洞,使得攻击者能够获得对应用程序的数据与功能的未授权访问。开发者经常会对用户与应用程序的交互方式做出错误假设,并常常会有所疏忽,在某些应用程序功能中省略访问控制检查。探查这些漏洞是一件费力的工作,因为需要对每一项功能重复进行相同的检查。然而,因为访问控制机制中存在大量漏洞,所以在测试Web应用程序时付出这样的努力总是值得的。第8章我们会讲述在执行严格的访问控制试测时,如何将某些操作自动化。