MVC 5中的会话修复攻击仍然是一个问题

时间:2016-01-28 20:40:04

标签: asp.net-mvc security session cookies asp.net-mvc-5

我一直在阅读很多关于会话固定攻击的内容,我遇到的最流行的解决方案是在用户登录时更改SessionID,并使用GUID创建额外的cookie以验证用户“属于”SessionID

我的问题是:仅仅删除SessionID cookie(ASP.NET_SessionID)以确保生成新的SessionID是不够的? 在MVC 5中,当用户登录其他加密的用户声明时,会创建Cookie(AspNet.ApplicationCookie),Identity会在每次请求时使用该Cookie来验证用户身份。额外的“GUID cookie”似乎是不必要的。

我最初是一名.NET桌面应用程序开发人员,编写我的第一个MVC应用程序,学习曲线有点陡峭......虽然令人耳目一新。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

让我尝试通过使用桌面和网络应用程序(均在 .Net 中)之间的比较来解释问题和解决方案

当您启动桌面应用程序时,该应用程序首先显示的是登录屏幕,之后您将获得对 UI 的访问权限。现在,每次应用程序的 exe 启动时,它都会将“RunID”写入文本文件并显示登录屏幕。 RunID 用于跟踪/关联您对应用的其余使用情况。

假设文件在 C:\RunID.txt 上。

攻击者(黑客)可以在 Machine1 上启动 exe(无需登录),并将 C:\RunID.txt 的内容复制到 Machine2。现在,只要您登录 Machine1,来自 Machine1 的 RunID 令牌也将在 Machine2 上起作用,这称为会话固定。

解决此问题的理想方法是放弃预身份验证令牌,并发布新的后身份验证令牌。因此,您将在身份验证后获得一个新令牌(或在您的情况下,一个额外的 GUID),它不会存在于 Machine2 上,因此除了 RunID 随机令牌(会话 ID)外,还提供了一个安全级别

如果您想进一步解释,请告诉我,但这就是为什么即使在 MVC 中,您也应该放弃之前的会话并创建一个新的会话 post-auth 以避免会话固定,作为补偿控件,您可以添加一个GUID cookie 也与会话 ID cookie 相对应。

答案 1 :(得分:-2)

您可以这样做以避免这种情况:

SessionIDManager Manager = new SessionIDManager();

string NewID = Manager.CreateSessionID(Context);
string OldID = Context.Session.SessionID;
bool redirected = false;
bool IsAdded = false;
Manager.SaveSessionID(Context, NewID, out redirected, out IsAdded);
Response.Write("Old SessionId Is : " + OldID);

if (IsAdded)
{
     Response.Write("<br/> New Session ID Is : " + NewID);
}
else
{
     Response.Write("<br/> Session Id did not saved : ");
}

支持链接: Link