如何防止注销后重新使用授权

How to prevent re-use of authorization after logout

我有一个 C# 项目,它在登录屏幕后面有一些管理功能。

在最近的一次渗透测试中,我们遇到了潜在的攻击:如果用户提交表单,注销,然后重复表单 post(使用 burp 或类似工具),服务器仍然将他们视为已登录并正确响应。

整个 'Admin' 控制器设置为 [Authorize],并设置了适当的角色。注销时,我正在调用

FormsService.SignOut();
Session.Clear();
Session.Abandon();

并将用户重定向到起始页。

我所读的一切都表明,这应该是我需要做的一切,以防止这种情况发生。也就是说,我可以执行以下操作:

  1. 登录我的管理区
  2. 执行搜索(JSON POST 操作,在 burp 中捕获)
  3. 查看搜索结果
  4. 注销
  5. 在 burp 中重复 JSON POST(其中包含一个“.ASPXAUTH”cookie)
  6. 在 burp 中查看与先前响应匹配的服务器响应

我能做些什么来防止这种情况发生?

经过多次试验,我找到了解决办法!

当用户登录时,我执行以下操作:

System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true;
System.Web.HttpContext.Current.Application.UnLock();

我在用户注销时撤消它(在终止 Session 可以让他们退出 FormsService 之前)。

然后,我利用我们已经有一个 custom AuthorizeAttribute override 在 'OnAuthorization' 方法中执行此操作的事实:

/* Some other customer stuff that isn't relevant */

base.OnAuthorization(filterContext);

if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null &&
    ((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true)
{
    //The user is ok to log in, and should be validated now.
}
else
{
    HandleUnauthorizedRequest(filterContext);
}

通过在应用程序状态中存储用户的登录状态,我可以确认他们的登录状态。

有些人似乎认为静态 class 会比在 MVC 中访问应用程序状态更好,但在这种情况下应用程序对我来说更好(主要是因为其他人更熟悉它)谁将维护代码并简化单元测试)。