如何避免开放重定向漏洞并在成功登录时安全重定向(提示:ASP.NET MVC 2 默认代码存在漏洞)

2024-04-09

通常,当网站要求您先登录才能访问某个页面时,您将被带到登录屏幕,在成功验证自己的身份后,您将被重定向回最初请求的页面。这对于可用性来说非常有用 - 但如果不仔细审查,此功能很容易成为一个打开重定向 http://www.owasp.org/index.php/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”(如果它是通过登录表单提交提供的)。

下面是一个利用此漏洞的简单攻击示例(实际上是众多攻击之一):

  1. 攻击者冒充受害者的银行,向受害者发送一封包含链接的电子邮件,如下所示:http://www.mybank.com/logon?returnUrl=http://www.badsite.com
  2. 在被教导如何验证整个域名(例如,google.com = GOOD,google.com.as31x.example.com = BAD)后,受害者知道链接没问题 - 不存在任何棘手的子域网络钓鱼在。
  3. 受害者点击链接,看到他们的actual熟悉的银行网站并被要求登录
  4. 受害者登录并随后被重定向到http://www.badsite.com该网站看起来与受害者银行的网站一模一样,因此受害者不知道他现在在不同的网站上。
  5. http://www.badsite.com内容类似于“我们需要更新我们的记录 - 请在下面输入一些极其个人的信息:[ssn]、[地址]、[电话号码]等。”
  6. 受害者仍然认为自己在访问自己的银行网站,因此中了骗局并向攻击者提供了信息

关于如何维护成功登录重定向功能并避免开放重定向漏洞有什么想法吗?

我倾向于选择将“returnUrl”参数拆分为控制器/操作部分,并使用“RedirectToRouteResult”而不是简单的“Redirect”。这种方法会带来新的漏洞吗?

Update

通过将自己限制在控制器/操作路线上,我无法重定向到自定义路线(例如/backend/calendar/2010/05/21)。我知道通过向 LogOn 操作传递更多参数,我could让它工作,但我觉得我将永远重新审视这个方法——使其与我们的路由方案保持同步。因此,我没有将 returnUrl 拆分为其控制器/操作部分,而是按原样保留 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 之类的技术相比,这种开放重定向似乎没什么大不了的,但我们的开发人员是保护我们的客户免受坏人侵害的唯一力量 - 我们可以采取一切措施来阻止坏人在我看来,更加努力的工作就是胜利。

谢谢,布拉德


乔恩·加洛韦写了一篇article http://www.asp.net/mvc/tutorials/security/preventing-open-redirection-attacks具有 MVC 2(和 1)的解决方案。

这是应该有助于解决您的问题的代码片段:

SECURED(原文于2014年更新)

private bool IsLocalUrl(string url)
{
  return System.Web.WebPages.RequestExtensions.IsUrlLocalToHost(
      RequestContext.HttpContext.Request, url);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免开放重定向漏洞并在成功登录时安全重定向(提示:ASP.NET MVC 2 默认代码存在漏洞) 的相关文章

  • asp.net mvc 在哪里设置默认文化?

    用于多语言 asp net mvc 网站 我应该在哪里将线程的文化设置为默认语言 对于我的情况是 tr TR 此外 如果它不存在 我需要将其保存在 cookie 中 在 Application Start 中还是其他 我有多个站点 域 因此
  • android中无法绕过的Root检测方法

    我知道在 root 设备上运行拥有敏感信息的应用程序根本不安全 因此 开发人员通常在这种情况下进行 root 检测 如果发现设备已 root 则该应用程序将不会安装 一切都好 开发者在root检测中使用的主要技术是检查superuser a
  • X509 C# 指南/教程

    谁能给我提供有关 X509 证书的良好介绍材料以及 C 示例 你可以从这里开始 X509证书 MSDN 资源 http msdn microsoft com en us library system security cryptograph
  • window.location 的 .NET MVC jQuery 相对路径

    我有一个非常简单的问题 但似乎无法弄清楚 由于 MVC 构建 URL 的方式 它包括所有路由信息 以下内容不起作用 我希望路径名仅返回虚拟目录路径 我所做的只是当用户从下拉列表中选择 ID 时重定向到不同的路由 document ready
  • 修改 CookieAuthenticationOptions LoginPath OnRedirectToReturnUrl 事件

    我的 MVC 6 ASP NET 5 项目中有以下设置 配置方法中的Startup cs app UseCookieAuthentication options gt options AuthenticationScheme Cookie
  • 尝试返回 IQueryable 时发生转换错误

    我有一个查询应该返回IQueryable
  • 如何在 html 助手中使用 asp.net mvc 3 razor 执行内联样式

    我想做这个 Html TextBoxFor x gt x BackgroundColor new style width 20px background color Model BackgroundColor 然而它不会渲染我的 Mode
  • AJAX 将 JavaScript 字符串数组发送到 JsonResult 作为 List 始终返回 Null?

    我正在尝试在 JavaScript 中构建一个字符串数组 并在操作方法的字符串列表中获取结果 下面是我的 JavaScript 的样子 我正在使用 jQuery 1 4 2 问题是我的操作方法中的列表始终显示 NULL JavaScript
  • MVC5 输入占位符不起作用

    我的代码是这样的 Html EditorFor model gt model CreatedUser new htmlAttributes new class form control placeholder Your Placeholde
  • 如何将 DataAnnotations ErrorMessageResourceName 与自定义资源解决方案结合使用

    我正在使用 C 构建 MVC Web 应用程序 由于该网站将是多语言的 因此我实现了自己的资源管理器 该类负责根据当前线程区域性从数据库 缓存中获取所需的资源字符串 并且到目前为止工作正常 我的问题是 我想使用我的自定义 ResourceM
  • 如果未登录则重定向 html 页面

    我的网页上有简单的登录表单 它使用 javascript 来登录用户并且工作正常 问题是 用户直接在地址栏中输入登陆页面 URL 他无需登录即可直接访问该页面 如果他没有登录 我想将他重定向到登录页面 以下是loding和目标页面的链接 l
  • 如何使用最小起订量模拟 Controller.User

    我有几个 ActionMethods 查询 Controller User 的角色 如下所示 bool isAdmin User IsInRole admin 在这种情况下可以方便地行事 我开始使用这样的代码对这些方法进行测试 TestMe
  • 安卓应用安全

    我想开发一个用户数据非常敏感的应用程序 我是开发新手 所以不确定以下内容 技术对于安全或高效来说是必要的 请留下您的评论 提前致谢 为了额外的安全性 我们可以避开市场 游戏商店 并将应用程序安装在个人设备上 它会让它更安全吗 我必须在设备上
  • 上传文件最安全的方法是什么?

    我工作的公司最近在我们托管的网站上遭受了许多标头注入和文件上传漏洞攻击 虽然我们已经解决了标头注入攻击的问题 但我们尚未控制上传漏洞 我正在尝试设置一系列即插即用类型的上传脚本以供内部使用 设计人员可以将其复制到其网站的结构中 修改一些变量
  • Nest.js Google Login(passport.js) 与 SPA 前端(React)

    在我的全栈项目 Nest js React 中 我使用护照谷歌实现了谷歌登录 如下所示 import Controller Get Req UseGuards from nestjs common import AppService fro
  • OnValidateIdentity 会话为空 - Mvc Owin

    目前 我在 OnValidateIdentity 中访问 Session 时遇到问题 HttpContext Current Session一片空白 怎么了 我的申请如下 我有 2 个项目 Mvc 与 WebApi 我希望用户在更改密码时注
  • RTL 语言的 Kendo PDF 导出问题

    I want to export PDF from Kendo Grid Using ASP MVC that s work fine but when the texts are in RTL mode ex Arabic Persian
  • 基于下拉选择的显示/隐藏控件 mvc 4 razor c#

    这是我的代码 Html DropDownListFor z gt z SelectedReportId new SelectList Model ReportTypes Value Text Model SelectedReportId S
  • 使用 C# 计算 HMACSHA256 以匹配支付提供商示例

    对于支付提供商 我需要使用 HMAC SHA256 计算基于哈希的消息身份验证代码 这给我带来了很大的麻烦 支付提供商以伪代码形式给出了两个正确计算验证码的示例 所有密钥均为十六进制 Method 1 key 57617b5d2349434
  • 基本身份验证:是否可以像 getRemoteUser() 一样设置RemoteUser

    您好 我正在使用基本身份验证方法来保护我的 Web 应用程序中的某些页面 其中有指定的 url 模式如下

随机推荐