会话变量重载(也称为会话谜题Session Puzzling)是一个应用级别的漏洞,他会导致攻击者实施多种恶意行为,包括但不限于:
这个漏洞在应用程序将相同的会话变量用于超过一个以上的目的。攻击者可以通过一个开发者没预料到的顺序访问页面,这样便可以使一个会话变量在一个上下文环境下设置,并在另一个环境下使用。
举例来说,攻击者能够使用会话变量重载来绕过强制实施的认证阶段。比如那些通过对成功认证后的存储在会话变量中的身份相关变量进行验证的强制认证机制。这意味着攻击者首先访问设置会话上下文的页面,然后直接访问检查这些上下文的特权页面。
比如,一个认证绕过攻击向量可能通过访问一个公开的接入点(如,一个密码找回页面)来生产含有身份信息的会话,基于固定变量或者用户自身的输入。
这个漏洞可以通过枚举应用使用的所有会话变量以及检查他们的有效环境来检测和利用。特别是有可能已不同的顺序通过访问一系列的入口点,并仔细检查出口点。在黑盒测试中,这个过程非常困难,需要一些运气,因为每个不同的访问序列可能导致不同的结果。
一个非常简单的例子就是密码重置功能的入口点可能请求用户提供一些身份鉴别信息,比如用户名或者电子邮件的地址等。这个页面通常会生成含有这些身份信息的会话信息,这些会话信息可能通过客户端直接提供,亦或通过这些输入数据进行进行计算和查询得来。此时,就有可能应用程序中的一些页面只需要基于上面的会话信息就能展示私有的数据。通过这种方法,攻击者绕过了认证过程。
最有效的方法是通过源代码评估来检测这些漏洞。
白皮书
会话变量应该只用于单个的一致性的目的上。