【问题标题】:How to prevent re-use of authorization after logout注销后如何防止重复使用授权
【发布时间】:2016-04-14 14:17:33
【问题描述】:

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

在最近的一次渗透测试中,我们发现了潜在的攻击:如果用户提交了一个表单,然后退出,并且表单发布被重复(使用 burp 或类似工具),服务器仍然认为他们已经登录并且正确响应。

整个“管理员”控制器设置为[Authorize],并设置了适当的角色。注销时,我正在打电话

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

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

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

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

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

【问题讨论】:

  • 一般来说,为了防止重放攻击,您可以使用带有 nonce 的质询-响应身份验证。
  • Session.Abandon 应该清除服务器端会话;那应该行不通。
  • @SLaks:所以我读过。然而,它仍然发生。我自己进行了测试。
  • 你能改变会话ID吗?
  • @NeilMcGuigan:我当然可以尝试,你能推荐一个我可以使用的方法吗?

标签: c# .net json security forms-authentication


【解决方案1】:

所以经过更多的实验,我找到了解决方案!

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

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);
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2012-12-18
    • 2015-07-16
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多