好的,这是一个场景:
- Bob 登录 mysite.com,该网站使用 .NET 表单身份验证,并勾选“记住我”。
- 伊芙偷了鲍勃的笔记本电脑
- 鲍勃得到了一台新笔记本电脑,并更改了密码。
现在,Eve 有一台被盗的笔记本电脑,上面存储了一个持久性 cookie,这将使她以 Bob 的身份登录到 mysite.com - 据我所知,这会起作用即使鲍勃更改了密码.
默认情况下,表单身份验证 cookie 不包含 Bob 的密码(无论是纯文本、散列还是以其他方式加密) - 因此 Bob 的密码根本不参与 cookie 身份验证过程,并且上周使用的相同用户名仍然有效今天。
这是一个很容易解决的漏洞 - 只需设置 FormsAuthentication.SetAuthCookie("username:passwordHash") 或其他内容,然后在身份验证处理程序中解密和拆分 cookie - 但我很难相信这个问题存在“开箱即用” ...我错过了什么吗?
EDIT:请注意,我在这里假设“记住我”按钮的目的是让您不必在每次访问网站时输入密码。这适用于 Facebook、Twitter、Gmail 以及我能想到的几乎所有其他网站 - 如果这不是 .NET FormsAuthentication 中“持久 cookie”选项的目的,我会感到非常惊讶。
另外,是的,我接受在every传入请求会产生一定的开销,但实际上,它只比根据用户名从数据库中检索用户稍微昂贵一点,无论如何您可能都会这样做。
EDIT 2:看来至少有一个主要的 .NET 站点 - CodePlex.com - 容易受到此攻击;看http://codeplex.codeplex.com/discussions/350646 http://codeplex.codeplex.com/discussions/350646
也许只接受上次密码重置后发出的 FormsAuth 票证是有意义的。
因此,在 Global.asax AuthenticateRequest 中,从加密票证中提取 FormsAuthenticationTicket.IssueDate,并将其与用户上次重置密码的日期进行比较(当他们重置密码时,您需要将其存储在数据库中)。
如果票证是在该日期之前发出的,则拒绝该票证,不对其进行身份验证并要求他们重新登录。
我自己还没有实现这个,所以我可能在理论中的某个地方遗漏了一个漏洞......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)