如何防止注销后重新使用授权
How to prevent re-use of authorization after logout
我有一个 C# 项目,它在登录屏幕后面有一些管理功能。
在最近的一次渗透测试中,我们遇到了潜在的攻击:如果用户提交表单,注销,然后重复表单 post(使用 burp 或类似工具),服务器仍然将他们视为已登录并正确响应。
整个 'Admin' 控制器设置为 [Authorize]
,并设置了适当的角色。注销时,我正在调用
FormsService.SignOut();
Session.Clear();
Session.Abandon();
并将用户重定向到起始页。
我所读的一切都表明,这应该是我需要做的一切,以防止这种情况发生。也就是说,我可以执行以下操作:
- 登录我的管理区
- 执行搜索(JSON POST 操作,在 burp 中捕获)
- 查看搜索结果
- 注销
- 在 burp 中重复 JSON POST(其中包含一个“.ASPXAUTH”cookie)
- 在 burp 中查看与先前响应匹配的服务器响应
我能做些什么来防止这种情况发生?
经过多次试验,我找到了解决办法!
当用户登录时,我执行以下操作:
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true;
System.Web.HttpContext.Current.Application.UnLock();
我在用户注销时撤消它(在终止 Session 可以让他们退出 FormsService 之前)。
然后,我利用我们已经有一个 custom AuthorizeAttribute override 在 'OnAuthorization' 方法中执行此操作的事实:
/* Some other customer stuff that isn't relevant */
base.OnAuthorization(filterContext);
if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null &&
((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true)
{
//The user is ok to log in, and should be validated now.
}
else
{
HandleUnauthorizedRequest(filterContext);
}
通过在应用程序状态中存储用户的登录状态,我可以确认他们的登录状态。
有些人似乎认为静态 class 会比在 MVC 中访问应用程序状态更好,但在这种情况下应用程序对我来说更好(主要是因为其他人更熟悉它)谁将维护代码并简化单元测试)。
我有一个 C# 项目,它在登录屏幕后面有一些管理功能。
在最近的一次渗透测试中,我们遇到了潜在的攻击:如果用户提交表单,注销,然后重复表单 post(使用 burp 或类似工具),服务器仍然将他们视为已登录并正确响应。
整个 'Admin' 控制器设置为 [Authorize]
,并设置了适当的角色。注销时,我正在调用
FormsService.SignOut();
Session.Clear();
Session.Abandon();
并将用户重定向到起始页。
我所读的一切都表明,这应该是我需要做的一切,以防止这种情况发生。也就是说,我可以执行以下操作:
- 登录我的管理区
- 执行搜索(JSON POST 操作,在 burp 中捕获)
- 查看搜索结果
- 注销
- 在 burp 中重复 JSON POST(其中包含一个“.ASPXAUTH”cookie)
- 在 burp 中查看与先前响应匹配的服务器响应
我能做些什么来防止这种情况发生?
经过多次试验,我找到了解决办法!
当用户登录时,我执行以下操作:
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true;
System.Web.HttpContext.Current.Application.UnLock();
我在用户注销时撤消它(在终止 Session 可以让他们退出 FormsService 之前)。
然后,我利用我们已经有一个 custom AuthorizeAttribute override 在 'OnAuthorization' 方法中执行此操作的事实:
/* Some other customer stuff that isn't relevant */
base.OnAuthorization(filterContext);
if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null &&
((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true)
{
//The user is ok to log in, and should be validated now.
}
else
{
HandleUnauthorizedRequest(filterContext);
}
通过在应用程序状态中存储用户的登录状态,我可以确认他们的登录状态。
有些人似乎认为静态 class 会比在 MVC 中访问应用程序状态更好,但在这种情况下应用程序对我来说更好(主要是因为其他人更熟悉它)谁将维护代码并简化单元测试)。