通常,当某个站点要求您在访问某个页面之前已登录时,您将进入登录屏幕,并在成功验证自己后,您将被重定向回最初请求的页面.这对于可用性非常有用 - 但是如果不仔细审查,此功能很容易成为一个开放的重定向漏洞.
遗憾的是,对于此漏洞的一个示例,只看ASP.NET MVC 2提供的默认LogOn操作:
[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);
}
Run Code Online (Sandbox Code Playgroud)
如果用户成功通过身份验证,则会将其重定向到"returnUrl"(如果通过登录表单提交提供).
以下是利用此漏洞的简单示例攻击(实际上是众多攻击之一):
http://www.mybank.com/logon?returnUrl=http://www.badsite.com
http://www.badsite.com
看起来与受害者银行的网站完全相同,因此受害者不知道他现在在不同的网站上.http://www.badsite.com
说"我们需要更新我们的记录 - 请在下面输入一些非常个人的信息:[ssn],[地址],[电话号码]等."有关如何维护此重定向成功登录功能的任何想法,但避免了开放重定向漏洞?
我倾向于将"returnUrl"参数拆分为控制器/动作部分并使用"RedirectToRouteResult"而不是简单地"重定向".这种方法是否会打开任何新的漏洞? …