一个使用.net Framework 4.7的混合webforms/mvc asp.net应用程序在Veracode动态扫描中被标记为"会话固定"漏洞。这意味着Veracode获取登录页面,更改SessionId cookie(ASP.NET_SessionId(,然后使用有效的用户ID和密码进行登录。ASP.Net登录用户,但接受此更改后的SessionId cookie并继续使用它;使用注入的SessionId值的行为就是缺陷。
换句话说,当Veracode获取页面时,SessionId cookie可能是"abc123"。Veracode将该cookie更改为"def456"并返回。ASP.Net登录用户并从此使用"def456"作为SessionId。
根据Veracode,我必须使成功登录之前创建的ASP.Net_SessionID cookie无效。这很容易做到。当然,当用户成功登录时,我可以简单地重置ASP.NET_SessionId cookie。问题是,这会导致用户被重定向回登录页面。所以发生的是:
- 用户提交登录页面
- 在服务器端,如果登录成功,我会将ASP.NET_SessionId重置为某个新值(通过调用SessionDManager.SaveSessionID((,这反过来只会重置ASP.NET_SessionId cookie(
- 用户被重定向到应用程序主页,然后立即重定向回登录页面
应用程序使用表单身份验证,并带有一个webforms登录页。登录页面使用asp.net登录控件。在这个控件的"OnAuthenticate"事件中,我有这样的代码:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
bool b = Membership.Validateuser(Login1.UserName, Login1.Password);
if(b)
{
e.Authenticated = true;
SessionIDManager mgr = new SessionIDManager();
string newId = mgr.CreateSessionID(Context);
mgr.SaveSessionID(Context, newId, out bool redirected, out bool cookieAdded);
}
}
这运行时没有出现错误。ASP.net将用户重定向到应用程序主页。但是随后asp.net立即将用户从应用程序主页重定向回登录页面。
有什么方法可以更改SessionId cookie,以便
- Veracode注入的SessionId cookie值被放弃
- 用户保持身份验证,而不是简单地重定向回登录页面
我尝试在各种页面事件(PreInit、Load等(中运行更改SessionId的代码,所有这些事件都有相同的结果——用户被重定向回登录页面。
请不要将此问题标记为已回答。SO上有几个关于这个问题的答案,所有这些都建议像我上面所做的那样重新设置SessionId cookie,所有这些答案都有评论指出这实际上不起作用。
经过多次反复,Veracode顾问的最终回复如下,基本上是说"不用担心"。这是Veracode的回复:
我还进一步研究了您的应用程序的动态发现。我们发现会话固定的会话ID不是用于身份验证的ID,因此应用程序的风险很低。攻击者无法仅通过控制ASP.NET_SessionId cookie来访问用户的已验证会话。通过保护.soiIMAuth cookie,您的应用程序已经可以防止此类攻击。