测试 Logout 功能
ID |
---|
WSTG-SESS-06 |
总结
会话终止是会话生命周期的重要组成部分。将会话令牌的生命周期缩短到最低限度会降低会话劫持攻击成功的可能性。这可以看作是防止其他攻击(如跨站点脚本和跨站点请求伪造)的控制措施。众所周知,此类攻击依赖于存在经过身份验证的会话的用户。没有安全的会话终止只会增加这些攻击的攻击面。
安全会话终止至少需要以下组件:
- 允许用户手动注销的用户界面控件的可用性。
- 在给定时间无活动后会话终止(会话超时)。
- 服务器端会话状态的正确失效。
存在多个问题可能会阻止会话的有效终止。对于理想的安全 Web 应用程序,用户应该能够随时通过用户界面终止。每个页面都应该在直接可见的位置包含一个注销按钮。不清楚或不明确的注销功能可能会导致用户不信任此类功能。
会话终止中的另一个常见错误是,客户端会话令牌设置为新值,而服务器端状态保持活动状态,并且可以通过将会话 cookie 设置回以前的值来重用。有时,系统只会向用户显示一条确认消息,而不会执行任何进一步的操作。应避免这种情况。
某些 Web 应用程序框架仅依赖会话 Cookie 来识别登录用户。用户的 ID 嵌入在(加密的)Cookie 值中。应用程序服务器不会在会话的服务器端执行任何跟踪。注销时,将从浏览器中删除会话 Cookie。但是,由于应用程序不执行任何跟踪,因此它不知道会话是否已注销。因此,通过重用会话 cookie,可以访问经过身份验证的会话。一个众所周知的示例是 ASP.NET 中的 Forms Authentication 功能。
Web 浏览器的用户通常不介意应用程序仍处于打开状态,只需关闭浏览器或选项卡即可。Web 应用程序应该知道这种行为,并在定义的时间后自动在服务器端终止会话。
使用单点登录 (SSO) 系统而不是特定于应用程序的身份验证方案通常会导致多个会话共存,这些会话必须单独终止。例如,终止特定于应用程序的会话不会终止 SSO 系统中的会话。导航回 SSO 门户后,用户可以重新登录到之前执行注销的应用程序。另一方面,SSO 系统中的注销功能不一定会导致已连接应用程序中的会话终止。
测试目标
- 评估注销 UI。
- 分析会话超时,以及注销后会话是否被正确终止。
如何测试
测试 Log Out 用户界面
验证用户界面中注销功能的外观和可见性。为此,请从打算从 Web 应用程序注销的用户的角度查看每个页面。
有一些属性指示良好的注销用户界面:
- 注销按钮存在于 Web 应用程序的所有页面上。
- 想要从 Web 应用程序注销的用户应快速识别注销按钮。
- 加载页面后,注销按钮应该可见,无需滚动。
- 理想情况下,注销按钮放置在页面的某个区域,该区域固定在浏览器的视图端口中,并且不受内容滚动的影响。
测试服务器端会话终止
首先,存储用于标识会话的 Cookie 的值。调用 log out 函数并观察应用程序的行为,尤其是关于会话 cookie 的行为。尝试导航到仅在经过身份验证的会话中可见的页面,例如,通过使用浏览器的后退按钮。如果显示页面的缓存版本,请使用 reload 按钮从服务器刷新页面。如果注销功能导致会话 cookie 设置为新值,请恢复会话 cookie 的旧值,并从应用程序的身份验证区域重新加载页面。如果这些测试在特定页面上没有显示任何漏洞,请至少尝试应用程序的其他一些被视为安全关键的页面,以确保应用程序的这些区域正确识别会话终止。
在执行测试时,不应在检查的页面上看到仅应由经过身份验证的用户看到的数据。理想情况下,应用程序在会话终止后访问已验证的区域时重定向到公共区域或登录表单。对于应用程序的安全性来说,这应该不是必需的,但在注销后将会话 cookie 设置为新值通常被认为是一种很好的做法。
测试会话超时
尝试通过对 Web 应用程序的已验证区域中的页面执行请求来确定会话超时,但延迟会越来越大。如果出现注销行为,则使用的延迟与会话超时值大致匹配。
与前面描述的服务器端会话终止测试相同的结果除外,但因非活动超时而导致的注销除外。
会话超时的适当值取决于应用程序的用途,并且应该是安全性和可用性的平衡。在银行应用程序中,将非活动会话保持 15 分钟以上是没有意义的。另一方面,wiki 或论坛中的短暂超时可能会惹恼那些输入冗长文章和不必要的登录请求的用户。一个小时或更长时间的超时是可以接受的。
在 Single Sign-On 环境中测试会话终止 (Single Sign-Off)
在测试的应用程序中执行注销。验证是否有中央门户或应用程序目录允许用户在不进行身份验证的情况下重新登录到应用程序。测试应用程序是否请求用户进行身份验证,是否请求应用程序的入口点的 URL。登录到测试的应用程序后,在 SSO 系统中执行注销。然后尝试访问已测试应用程序的已验证区域。
预计在连接到 SSO 系统的 Web 应用程序或 SSO 系统本身中调用注销功能会导致所有会话的全局终止。在 SSO 系统和连接的应用程序中注销后,应要求对用户进行身份验证才能访问应用程序。
工具
引用
白皮书
使用表单身份验证时 ASP.NET 中的 Cookie 重播攻击