首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使aspx身份验证cookie无效

使aspx身份验证cookie无效
EN

Stack Overflow用户
提问于 2015-07-22 22:11:39
回答 4查看 3.2K关注 0票数 8

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

uppon logout,我调用这两个方法

代码语言:javascript
复制
FormsAuthentication.SignOut(); 
Session.Abandon()

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

我已经用谷歌搜索过了,但是我找不到那个安全漏洞的答案。

EN

回答 4

Stack Overflow用户

发布于 2015-07-22 22:27:05

微软已经在这里承认了这个问题:https://support.microsoft.com/en-us/kb/900111

他们提供了几个减轻此漏洞的想法:

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

中使用成员资格类<代码>G210

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

在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属性的指示进行登录,则必须执行以下操作:

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

通过使用此方法,只有当用户尚未显式注销并且窗体身份验证票证尚未过期时,才会接受窗体身份验证cookie。

票数 4
EN

Stack Overflow用户

发布于 2015-07-22 22:21:57

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

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

票数 3
EN

Stack Overflow用户

发布于 2020-10-30 01:58:44

这仍然是.NET框架中的一个问题。似乎每个人都认为Session.Abandon()就是答案,但令人遗憾的是,命令并不会使服务器端的会话失效。根据Web.config设置(默认值=20分钟),任何具有正确令牌值的用户仍可以恢复已停止的会话,直到该会话过期。

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

这些链接大部分都失效了,微软在这个话题上没有新的消息。https://forums.asp.net/t/2154458.aspx?Preventing+Cookie+Replay+Attacks+MS+support+article+is+now+a+dead+link

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

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

  • 当用户登录时,在会话数据中设置一个布尔值,如存储在服务器端的Session["LoggedIn"] = true;
  • 当用户注销时,将该值设置为在每次请求时重放会话值--尝试重放会话的攻击者不会对您友好并且只通过登录页面进入。在controller/method).

文件中使用custom filterregistering it globally可能是最简单的方法(这样您就不必在任何地方复制代码,或者在每个global.asax文件中都设置属性

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31565632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档