提问人:Pascal 提问时间:6/7/2023 最后编辑:Pascal 更新时间:6/12/2023 访问量:35
安全问题 - FormsAuthentication 的奇怪 SlidingExpiration 行为 (ASP.NET MVC)
Security issue - FormsAuthentication's strange SlidingExpiration behaviour (ASP.NET MVC)
问:
在对 ASP.NET MVC 5 (.NET Framework 4.7.2) Web 应用程序的应用程序进行渗透测试期间,发现了一个安全问题。我正在尝试找到解决这个问题的方法。
此问题与我们使用的内置 FormsAuthentication 以及 FormsAuthentication 的滑动过期选项的默认行为有关。我们目前已启用滑动过期,并希望保持这种状态。
问题在于,当通过“超时”选项配置的 50% 的时间已经过去时,AuthenticationTicket 会在下一个请求中续订。 请参阅Microsoft参考:https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.formsauthenticationconfiguration.slidingexpiration?view=netframework-4.8.1#system-web-configuration-formsauthenticationconfiguration-slidingexpiration
这意味着将生成一个新的 AuthenticationTicket,并通过 SET-COOKIE 标头发送回客户端。尽管如此,旧的 AuthenticationTicket 仍然有效,并且仍可用于对服务器的请求。这意味着有多个有效的 AuthenticationTicket。如果继续使用旧的 AuthenticationTicket 执行请求,则在每个响应中都会获得一个新创建的 AuthenticationTicket。
如果发生这种情况,则单个用户具有多个有效的 AuthenticationTickets,并且您无法判断其中哪些应该有效,哪些无效。从渗透测试公司的角度来看,这是一个安全风险。
我解决这个问题的想法是,如果新的 AuthenticationTicket 是由 ASP.NET 创建的,请找到一种方法来做出反应,并将其存储在服务器端。这意味着用户始终只能拥有一张有效的票证,我们可以解决这个问题。
但显然没有办法对此做出反应。与我发现的唯一相关事件是FormsAuthentication_OnAuthenticate事件,这对此问题没有帮助。
还有 FormsAuthentication.RenewTicket 方法,该方法可供 FormsAuthenticationModule 使用,并且实际上在内部使用。此方法检查是否需要续订票证(>超过超时的 50%),并在必要时续订。但是在 FormsAuthenticationModule 中,该方法还调用了很多自定义代码,我不喜欢将其复制并粘贴到自定义解决方案中,因为我不是代码的所有者,因此不知道它到底应该做什么。 FormsAuthenticationModule 的源代码:https://referencesource.microsoft.com/#system.web/Security/FormsAuthenticationModule.cs
因此,我还研究了 FormsAuthentication 和 FormsAuthenticationModule 的 C# 源代码以找到一种方法,如上所述,但显然实现确实是封闭的,并且没有对此做出反应。
我正在寻找有关如何处理此问题的任何建议或提示。提前致谢!
答: 暂无答案
评论