ASP.NET Membership 使用-如何避免 SignOut() 后,重放凭据

作者:vkvi 来源:ITPOW(原创) 日期:2023-8-10

FormsAuthentication 登录后,会有一个凭据,这个凭据通过 Cookie 写入客户端。

用户退出登录时,服务端调用 FormsAuthentication.SignOut() 退出登录。

通常,一切运转正常。

但是如果数据被拦截(比如使用 Burp Suite 软件),在用户退出登录后,重放之前的请求,仍然能正常请求。

这就是重放攻击。在微软的文档中也有提到:FormsAuthentication.SignOut Method (System.Web.Security) | Microsoft Learn

为什么会怎样?

我们可以这样理解,登录成功后,有一个票据写入 Cookie,这个票据包含失效时间。

  • 正常情况下,用户退出后,Cookie 被清除,票据丢失,所以退出了。

  • 重放攻击时,拿起之前的 Cookie,服务器解开后,找到其中的票据,发现票据中的时间未过期,Ok,登录有效。

即,核心问题是:服务器只是验证票据,服务器上并没有一份存根来对比

解决办法

上面微软的文档中,有解决办法。

但是我觉得更好、更简便的方法是双重验证,即在前述验证的基础上,再增加一个 Session,Session 的话,就相当于给服务器上增加一份存根,调用 SignOut() 同时,清除 Session。

题外

既然服务器上没有存根,那我们是不是可以伪造票据呢?

咱们可以复印一份票据,但是伪造一个新票据,几乎不可能。

相关文章