通常,当网站要求您先登录才能访问某个页面时,您会被带到登录屏幕,在成功验证自己的身份后,您会被重定向回最初请求的页面。这对于可用性来说非常有用 - 但如果不仔细审查,此功能很容易成为 open redirect漏洞。
遗憾的是,对于此漏洞的示例,只需查看 ASP.NET MVC 2 提供的默认登录操作即可:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid) {
if (MembershipService.ValidateUser(model.UserName, model.Password)) {
FormsService.SignIn(model.UserName, model.RememberMe);
if (!String.IsNullOrEmpty(returnUrl)) {
return Redirect(returnUrl); // open redirect vulnerability HERE
} else {
return RedirectToAction("Index", "Home");
}
} else {
ModelState.AddModelError("", "User name or password incorrect...");
}
}
return View(model);
}
如果用户成功通过身份验证,他们将被重定向到“returnUrl”(如果它是通过登录表单提交提供的)。
这是一个利用此漏洞的简单攻击示例(实际上是许多攻击之一):
- 攻击者冒充受害者的银行,向受害者发送一封包含链接的电子邮件,如下所示:
http://www.mybank.com/logon?returnUrl=http://www.badsite.com
- 受害者被教导如何验证整个域名(例如 google.com = GOOD、google.com.as31x.example.com = BAD),知道该链接没有问题 - 不存在任何棘手的问题域网络钓鱼正在进行中。
- 受害者点击链接,看到他们实际熟悉的银行网站,并被要求登录
- 受害者登录后会被重定向到
http://www.badsite.com
,该网站看起来与受害者银行的网站一模一样,因此受害者不知道他现在位于不同的网站上网站。 http://www.badsite.com
内容类似于“我们需要更新我们的记录 - 请在下面输入一些极其个人的信息:[ssn]、[地址]、[电话号码” ]等”- 受害者仍然认为自己在访问自己的银行网站,因此中了骗局并向攻击者提供了信息
关于如何维护成功登录重定向功能并避免开放重定向漏洞有什么想法吗?
我倾向于选择将“returnUrl”参数拆分为 Controller /操作部分,并使用“RedirectToRouteResult”而不是简单的“Redirect”。这种方法会带来新的漏洞吗?
更新
通过将自己限制在 Controller /操作路由上,我无法重定向到自定义路由(例如 /backend/calendar/2010/05/21
)。我知道通过向 LogOn 操作传递更多参数,我可以让它工作,但我觉得我将永远重新访问这个方法 - 使其与我们的路由方案保持同步。因此,我没有将 returnUrl 拆分为其 Controller /操作部分,而是按原样保留 returnUrl 并解析它以确保它仅包含相对路径(例如,/users/1
)而不包含相对路径绝对路径(例如,http://www.badsite.com/users/1
)。这是我正在使用的代码:
private static bool CheckRedirect(string url) {
try {
new Uri(url, UriKind.Relative);
}
catch (UriFormatException e) {
return false;
}
return true;
}
旁注:我知道与 XSS 和 CSRF 之类的技术相比,这种开放重定向似乎没什么大不了的,但我们开发人员是保护我们的客户免受坏人侵害的唯一力量 - 我们竭尽全力在我看来,让坏人的工作变得更加困难是一种胜利。
谢谢布拉德
最佳答案
乔恩·加洛韦 (Jon Galloway) 写了一篇 article具有 MVC 2(和 1)的解决方案。
以下代码片段应该有助于解决您的问题:
安全(原始文章于 2014 年更新)
private bool IsLocalUrl(string url)
{
return System.Web.WebPages.RequestExtensions.IsUrlLocalToHost(
RequestContext.HttpContext.Request, url);
}
关于asp.net-mvc - 如何避免开放重定向漏洞并在成功登录时安全重定向(提示 : ASP. NET MVC 2 默认代码存在漏洞),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909706/