【问题标题】:invalidate aspx authentication cookie使 aspx 身份验证 cookie 无效
【发布时间】:2015-10-12 11:25:31
【问题描述】:

我有一个 asp.net 网络表单。当用户进行身份验证时,它会创建一个名为 .aspxauth 的 Secured cookie

uppon注销,我调用这2个方法

FormsAuthentication.SignOut(); 
Session.Abandon()

问题是我们进行了渗透测试,如果我窃取了 cookie,注销并手动重新插入 cookie,我会再次登录。所以 .aspauth 不会在服务器端失效。

我在谷歌上搜索过,但找不到该安全漏洞的答案。

【问题讨论】:

  • 您无法停用它。 Session.Abandon() 会将其从您的用户中删除,而不是从浏览器/客户端中删除。
  • 好的,这个 cookie 重放错误没有解决方案吗?我不想更改整个代码以切换到会员等级。
  • 我的意思是,一定有办法告诉服务器会话令牌现在无效?!!
  • 我认为这个问题还没有解决?这样做的任何方法都是使 sessionID 无效?有一篇关于它的好文章How to secure your ASP.NET Azure Web App

标签: c# asp.net security


【解决方案1】:

Microsoft 已在此处确认此问题:https://support.microsoft.com/en-us/kb/900111

他们提供了一些减轻此漏洞的想法:

  1. 使用 SSL 保护应用程序
  2. 强制 TTL 和绝对过期
  3. 在 ASP.NET 2.0 中使用 HttpOnly cookie 和表单身份验证
  4. 在 ASP.NET 2.0 中使用 Membership 类

关于最后一个,为了方便/保存,我将粘贴网站上的内容:

当您在 ASP.NET 2.0 中实现表单身份验证时,您可以选择将用户信息存储在成员资格提供程序中。此选项是 ASP.NET 2.0 中引入的一项新功能。 MembershipUser 对象包含特定用户。

如果用户已登录,您可以将此信息存储在 MembershipUser 对象的 Comment 属性中。如果使用此属性,您可以开发一种机制来减少 ASP.NET 2.0 中的 cookie 重放问题。该机制将遵循以下步骤:

  1. 您创建一个挂钩 PostAuthenticateRequest 事件的 HttpModule。
  2. 如果 FormsIdentity 对象在 HttpContext.User 属性中,FormsAuthenticationModule 类会将表单身份验证票证识别为有效。
  3. 然后,自定义 HttpModule 类获取对与经过身份验证的用户关联的 MembershipUser 实例的引用。 您检查 Comment 属性以确定用户当前是否已登录。

重要提示:您必须在 Comment 属性中存储指示用户何时明确退出的信息。此外,当客户最终再次登录时,您必须清除 Comment 属性中的信息。

如果用户当前没有按照 Comment 属性的指示登录,您必须采取以下措施:

  1. 清除 cookie。
  2. 将 Response.Status 属性设置为 401。
  3. 调用 Response.End 方法,该方法会将请求隐式重定向到登录页面。

通过使用此方法,只有在用户尚未明确退出且表单身份验证票证尚未过期时,才会接受表单身份验证 cookie。

【讨论】:

    【解决方案2】:

    阅读这篇关于会话固定以及如何一劳永逸地摆脱它的文章:

    http://www.dotnetfunda.com/articles/show/1395/how-to-avoid-the-session-fixation-vulnerability-in-aspnet

    【讨论】:

    • 这不是一个有效的解决方案。这里的主要问题是用户注销后会话 ID 在服务器端继续处于活动状态。如果攻击者可以访问 cookie(正如上面@Yannick Richard 所报告的那样),添加另一个带有单独“身份验证令牌”的 cookie 不会使任何事情更安全。然后,攻击者可以窃取两个 cookie,我们就会回到第一方。
    【解决方案3】:

    这仍然是 .NET Framework 中的一个问题。每个人似乎都认为Session.Abandon() 是答案,但可悲的事实是该命令不会使服务器端的会话无效。任何拥有正确令牌值的人仍然可以恢复死会话,直到基于Web.config 设置的会话到期(默认 = 20 分钟)。

    很久以前,一个类似的提问者在这里提出了这个问题: Session Fixation in ASP.NET

    其中大部分链接已失效,Microsoft 没有关于该主题的新消息。 https://forums.asp.net/t/2154458.aspx?Preventing+Cookie+Replay+Attacks+MS+support+article+is+now+a+dead+link

    更糟糕的是,即使您正在实现一个完全无状态的 MVC 应用程序并且不使用 Session 对象在视图之间存储数据,您仍然容易受到这种 cookie 重放攻击。您甚至可以在 web.config 设置中关闭会话状态并仍然重播 cookie 以访问已注销的会话。

    真正的解决方案是 hack-y 并描述为 here,并且您需要启用会话数据 InProc 才能使用它。

    • 用户登录时,在会话数据中设置一个布尔值,如Session["LoggedIn"] = true;,存储在服务器端。
    • 当用户注销时,将该值设置为false
    • 检查每个请求的会话值——试图重放会话的攻击者不会对你好,并且只能通过登录页面进入。在global.asax 文件中使用custom filterregistering it globally 可能是最简单的方法(因此您不必到处复制代码,或为每个控制器/方法分配属性)。

    即使攻击者拥有所有的cookie值,他们也无法重复使用相同的会话ID,一旦达到指定的超时时间,服务器会自动删除它。

    【讨论】:

      【解决方案4】:
      if you are using the FormsAuthentication, you can use this code. By using this code you can destroy the created cookies by setting the Expire property of HttpCookie. It will help you:
      FormsAuthentication.SignOut();
      Session.Clear();
      Session.Abandon();
      Session.RemoveAll();
      // clear authentication cookie
      HttpCookie httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, "");
      httpCookie.Expires = DateTime.Now.AddYears(-1);
      Response.Cookies.Add(httpCookie);
      

      【讨论】:

      • 这根本没有解决 cookie 重放问题。这只是要求远程浏览器丢弃其拥有的密钥的一种更复杂的方法。
      • @Mark :我的目的是帮助 Yannick,以便我的回答可以帮助他以更安全、更可靠的方式删除 cookie。感谢您的反馈!
      • 这很公平,只是没有回答真正的问题。
      猜你喜欢
      • 2020-05-07
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多