【问题标题】:Does Forms Authentication protect from session hijacking?表单身份验证是否可以防止会话劫持?
【发布时间】:2014-06-12 07:20:33
【问题描述】:

我有使用表单身份验证的 ASP.NET MVC 应用程序。用户通过身份验证后,作为响应,他将收到包含身份验证信息的表单 cookie。现在关于表单cookie:它由机器密钥加密,并通过签名防止被篡改。我也使用 HTTPS...但是,如果我以某种方式获取 cookie 并尝试从另一个客户端发出请求(这意味着该请求将从另一个 IP 地址发出)怎么办?

在我看来,这种情况会奏效。有什么方法可以防御这种攻击吗?

【问题讨论】:

  • 您说,“这种情况会奏效。”。使用 https/ssl 时如何获取某人的表单 ID?
  • [PingPong] 我认为这可以使用 XSS 来完成(即使 cookie 设置了 Secure 属性)。可能还有木马之类的其他东西。

标签: asp.net security forms-authentication


【解决方案1】:

有什么方法可以抵御这种攻击吗?

你不应该。几年前我们已经实现了这样的功能并很快放弃了它。原来:

  • 单个用户从同一浏览器/计算机发出请求,但有时可以从不同的 IP 地址看到在 http/https 之间切换
  • 一个用户在旅行和使用她的手机时,有时会在她的手机在 BTS 之间切换时从不同的 IP 地址发出连续的请求

【讨论】:

    【解决方案2】:

    为了澄清术语,会话劫持通常是指未经授权的用户访问服务器上的会话状态的漏洞。

    身份验证 cookie 与会话 cookie 不同。 ASP.NET 在保护身份验证 cookie 方面采取了更多的预防措施。您所描述的内容最好用 CSRF(跨站点请求伪造)一词来描述。正如@Wiktor 在他的回复中指出的那样,通过 IP 限制访问是不切实际的。另外,如果你阅读了 CSRF 的工作原理,漏洞利用可以从原始 IP 地址在用户浏览器中运行。

    好消息是 ASP.NET MVC 内置了对 CSRF 预防的支持,这很容易实现。阅读here

    【讨论】:

    • 我不认为 OP 意味着 CSRF,因为他们明确指出 cookie 是从另一个客户端和 IP 使用的。会话劫持可能意味着访问服务器会话(.NET Session 对象)或窃取表单身份验证设置的身份验证。两者通常都是通过使用来自攻击者自己系统的有效令牌客户端来实现的。
    【解决方案3】:

    如果您在网站的任何地方都使用 HTTPS,并在 web.config 中的 system.web/authentication/forms 元素上设置了 requireSSL="true",那么您就是在指示浏览器仅通过 HTTPS 连接将该 cookie 传回。这将防止绝大多数基于流量嗅探的会话劫持攻击,如果您的站点仅是 HTTPS,则绝对应该使用它。

    表单身份验证本质上是无状态的。服务器正在加密以下信息并将其存储在客户端:CookiePath、Expiration、Expired、IsPersistent、IsPersistent、IsPersistent、IssueDate、Name、UserData、Version。假设您的 machineKey 没有被泄露,客户端只会将其视为一团加密数据。当它再次将该 blob 呈现给服务器时,服务器对其进行解密并将其转换回 FormsAuthenticationTicket,根据配置验证票证中的字段,验证票证未过期等,并决定是否将请求视为认证。它不会“记住”任何关于哪些票是未完成的。另请注意,它不包括任何地方的 IP 地址。

    如果您仅使用 HTTPS,请注意保护您的 machineKey,并将表单 auth cookie 设置为 requireSSL,我能想到的唯一真正的攻击向量是攻击者以客户端的浏览器和/或计算机为目标。从理论上讲,他们可以从浏览器空间的内存或磁盘中窃取 cookie。病毒/特洛伊木马可能会执行此操作,甚至可能是恶意浏览器扩展。简而言之,如果用户可以获得有效的、未过期的 Forms Auth cookie,他们可以从任何他们想要的机器上呈现它,直到它过期。您可以通过不允许持久性身份验证 cookie 并将超时保持在最低限度来降低此处的风险。

    如果他们有 machineKey,他们可以随时从头开始创建 FormsAuth cookie。

    哦.. 不能忘记 Heartbleed。如果您的负载均衡器或反向代理使用不安全的 OpenSSL 版本,则攻击者可能会破坏您的私钥并拦截通过 HTTPS 连接的流量。 ASP.NET 不使用 OpenSSL,因此您可以在纯 MS 堆栈中避免这种情况。如果您听说过有关 MS 的 SSL 实施中的漏洞,您会希望尽快修补它并更改您的密码并重新颁发证书。

    如果您担心基于浏览器/机器的劫持,您可能想看看我开始 [并放弃] 的名为 Sholo.Web.Security (https://github.com/scottt732/SholoWebSecurity) 的项目。它的目标是通过维护服务器上的状态来加强表单身份验证,但会牺牲每个请求的一些开销。您可以执行诸如在服务器端撤销票证(踢/注销用户)之类的操作,并防止用户在 IP 地址之间移动票证。在 Wiktor 描述的移动移动用户场景中,它可能会变得烦人(它是可选的)。随意分叉或提交拉取请求。

    0leg 所指的 Anti-CSRF 功能适用于启动登录过程的 UI/表单机制,但据我所知,表单身份验证过程本身与 CSRF 无关。也就是说,一旦 cookie 被发布到客户端,唯一能保护它不被服务器反弹的事情就是 cookie 被限制在它们被发布的域/子域中。您的 stackoverflow.com cookie 不会显示给 serverfault.com。浏览器会为您处理这些事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2012-05-19
      • 1970-01-01
      • 2014-02-23
      • 2011-08-27
      相关资源
      最近更新 更多