使aspx身份验证cookie无效

时间:2015-07-22 14:11:39

标签: c# asp.net security

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

的安全cookie

uppon logout,我称这两种方法

FormsAuthentication.SignOut(); 
Session.Abandon()

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

我用Google搜索了,我无法找到安全漏洞的答案。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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类
  5. 关于最后一个,为了方便/保存,我会粘贴网站上的内容:

      

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

         

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

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

      重要:您必须在“注释”属性中存储信息,该信息指示用户何时明确注销。此外,当客户最终再次登录时,您必须清除“注释”属性中的信息。

           

      如果用户当前未按“注释”属性的指示登录,则必须执行以下操作:

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

        通过使用此方法,只有在用户尚未明确注销并且表单身份验证票证尚未过期的情况下,才会接受表单身份验证cookie。

答案 2 :(得分:0)

.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设置中关闭会话状态,然后重播 still cookie以获取对已注销会话的访问权限。

真正的解决方案是骇人听闻的,描述为here,并且需要启用InProc会话数据才能使用它。

  • 用户登录时,在会话数据中设置一个布尔值,例如Session["LoggedIn"] = true;,该值存储在服务器端。
  • 用户注销后,将该值设置为false
  • 每个请求中检查会话值-尝试重播会话的攻击者对您不利,只能通过“登录”页面进入。使用global.asax文件中的custom filterregistering it globally进行此操作可能是最简单的(因此,您不必到处重复代码,也不必为每个控制器/方法赋予属性)。

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

答案 3 :(得分:-1)

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