http://mdsec.net/auth/379/
由于应用程序在将生成和处理的会话令牌与令牌所属的用户会话之间进行对应的过程中存在薄弱环节,会话管理机制因此存在各种常见的漏洞。
最简单的漏洞是允许给同一个用户账户同时分配几个有效的令牌。在几乎每一个应用程序中,任何用户都没有正当理由在任何指定的时间拥有多个会话。当然,用户可以终止一个处于活动状态的会话,再开始一个新会话,这很常见,例如,关闭浏览器窗口或转换到另一台计算机上。但是,如果一名用户明显同时在使用两个不同的会话,这通常表示出现了安全问题:要么是因为用户将证书泄露给了第三方,要么是攻击者通过其他某种途径获得了他的证书。无论发生哪一种情况,都不应允许并行会话,因为它允许用户持续执行任何非法操作,同时允许攻击者使用截获的证书,却不存在被检测出来的风险。
应用程序使用“静态”令牌是一种相对较为特殊的缺陷。这些“令牌”看似会话令牌,最初表现的功能和会话令牌一样,但实际并非如此。在这些应用程序中,每名用户都分配有一个令牌,并且用户每次登录,都收到相同的令牌。无论用户是否已经登录并获得令牌,应用程序都应将该令牌视为有效令牌。这种应用程序实际上是对会话的整体概念以及这样做有助于管理和控制应用程序访问存有误解。有些时候,应用程序这样运作,是为了执行设计上存在缺陷的“记住我”功能,并因此将静态令牌保存在一个持久性cookie中(请参阅第6章了解相关内容)。有时,令牌本身易于受到预测攻击,致使这种漏洞造成更加严重的后果,因为一次成功的攻击不仅能够攻破当前登录用户的会话,如果时间允许,还能攻破所有注册用户的账户。
我们偶尔也会观察到应用程序表现出其他奇怪的行为,表明令牌和会话之间的对应关系存在基本的缺陷。根据用户名和一个随机成分构造的有意义令牌就是一个典型的示例。以下面的令牌为例:
对其进行Base64编码,得到:
对成分r1进行仔细分析后,我们可以得出结论:根据样本值无法对其进行预测。然而,如果应用程序的会话处理逻辑存在缺陷,可能攻击者只需向r1和user提交任何有效的值,就可以在指定用户的权限下访问一个会话。从本质上讲,这是一个访问控制漏洞,因为应用程序是根据用户在会话之外提交的数据做出的访问决定(请参阅第8章了解相关内容)。产生这种漏洞是因为应用程序使用会话令牌表明请求者已经与应用程序建立某种有效的会话;然而,处理会话的用户权限并不由会话控制,而是通过其他方式根据每个请求决定。在这种情况下,请求者直接控制决定用户权限的方式。