在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除
Posted
技术标签:
【中文标题】在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除【英文标题】:Session variables not clearing after Session.Clear() and Session.Abandon() in ASP.NET 【发布时间】:2015-10-02 12:27:07 【问题描述】:在我们的网站上运行渗透测试后,我们的 IT 安全部门指出,我们服务器上的会话 ID 在用户注销后不会被清除。
我们清除会话的代码如下:
Session.Clear()
Session.RemoveAll()
Session.Abandon()
Dim Cookie1 As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, "")
Cookie1.Expires = DateTime.Now.AddYears(-1)
Response.Cookies.Add(Cookie1)
Dim Cookie2 As HttpCookie = New HttpCookie("ASP.NET_SessionId", "")
Cookie2.Expires = DateTime.Now.AddYears(-1)
Response.Cookies.Add(Cookie2)
FormsAuthentication.SignOut()
FormsAuthentication.RedirectToLoginPage()
我们通过让 UserA 登录并根据该登录伪造 cookie 来确认这一点。在 UserA 注销后,我们登录 UserB,正如预期的那样,我们获取了存储在 UserA 的 sessionID 中的所有会话值。
还有其他方法可以清除会话数据吗?
【问题讨论】:
您是否尝试在清除并放弃会话之前退出?会话将继续存在,直到您的请求完成。因此,如果注销在会话中设置了某些内容,它可能会再次被激活? 是的。我已经尝试在清除会话之前放置 formsauthentication.signout 【参考方案1】:根据MSDN、Session.Clear
和Session.RemoveAll
做同样的事情。你需要在调用Clear
之前调用这个:
System.Web.Security.FormsAuthentication.SignOut()
【讨论】:
他们聘请了一家公司对网站进行渗透测试,结果显示用户退出后 sessionID 仍然处于活动状态 问题是与 SessionID 相关的会话状态实际上并没有被清除。正如我所说,我们通过从 UserA 的登录中伪造 cookie 然后记录他来模拟会话固定来确认这一点。之后,UserB 登录,我们从 UserA 注入 SessionID,我们获取 UserA 的会话变量 其实这是一个非常大的安全风险,知道会话cookie不需要formauthentication才能工作 cookie 是由 ASP 服务器端发出的。问题是 session.clear 和 session.abandon 之后保存在 session 上的数据仍然存在,这意味着如果攻击者劫持了 session,即使受害者注销它也可以使用。 请注意,我们在将他的 cookie 注入其他用户之前注销了 UserA,但他的会话数据仍然显示,这令人担忧【参考方案2】:请查看 Microsoft 支持网站上的这个综合页面。它明确地处理你想要做的事情。它对会话如何保持完整等有很好的解释。
它使用 Login.aspx 页面中的逻辑来销毁会话和 cookie 以克服欺骗。
注意:这个例子是用 c# 编写的,但可以很容易地转换为 VB。如果您需要帮助,请告诉我。
https://support.microsoft.com/en-us/kb/899918
【讨论】:
感谢您的链接,将对此进行调查并告诉您结果 我已经阅读了这篇文章,但它没有明确给出 OP 试图完成的示例。事实上,似乎是相反的说法——即使在注销后会话仍将保持打开状态,以便可以跨子域重新使用会话:“......用户在使用 Abandon 方法后不会丢失会话状态从一个应用程序调用”以上是关于在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除的主要内容,如果未能解决你的问题,请参考以下文章