Rails4安全性:使用加密的cookie可以完成会话固定吗?

时间:2016-12-07 15:34:12

标签: ruby-on-rails session ruby-on-rails-4 cookies session-fixation

在研究了rails指南和其他一些资源后,我想知道用户会话的会话固定攻击是如何实际发生的。至少我怀疑它在指南中是如此简单as depicted here,攻击者......

1)...通过登录

创建有效会话

2)...让会话保持活力

3)...然后强制用户使用他的会话ID,例如使用一些XSS漏洞

一切都很好,但是......攻击者如何能够收集他自己的会话ID值?默认情况下,Cookie在Rails4 +中加密。那么,如果攻击者假设我不有权访问secret_key_base或用于生成加密和签名密钥的任何内容,该怎么办?根据我的理解,我无法在不使其失效的情况下篡改cookie(签名错误),因此以某种方式将自创cookie传递给可能的受害者既不是一种选择。

secu指南是不是最新的还是我在这里错过了一点?如果后者那么......

a)[作为攻击者]如何读取加密的cookie信息

b)漏洞必须如何让我[攻击者]将该会话ID注入另一个客户端上同样加密的cookie?这会是XSS攻击吗?该指南指出,如果攻击者使用类似

的代码
<script>document.cookie="_session_id=16d5b78abb28e3d6206b60f22a03c8d9";</script>

他可能能够修复那个会话。但同样,为什么rails会向客户端显示它的简单会话,使其可以通过客户端处理的javascript访问?它没有,这就是为什么我的所有cookie值都是Javascript无法访问的简单乱码(可以通过控制台测试),对吗?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

与cookie加密(或签名)无关。无需签名和/或加密,攻击者就无需对将会话数据存储在cookie中的站点求助于会话固定。他们可以自己制作Cookie。

假设攻击者可以将Cookie设置JavaScript注入受害者将访问的页面上,即an XSS vulnerability。攻击发生的方式如下:

  1. 攻击者访问该网站并获取会话cookie。
  2. 攻击者制作了恶意JavaScript,利用XSS漏洞,并等待用户访问(或诱使用户)包含恶意JavaScript有效负载的页面。

    <script>document.cookie="_appname_session=(...attacker's session cookie...)";</script>
    
  3. 受害者进入并使用恶意JavaScript访问页面,并使用攻击者的cookie设置或覆盖其会话cookie。
  4. 如果他们已登录,则站点将不再将其识别为经过身份验证的用户,并且可能会将其重定向为登录状态。
  5. 如果未登录,它们将被重定向到登录页面。
  6. 他们使用用户名和密码进行身份验证。
  7. 此时,受害者和攻击者都有一个cookie,其中包含属于已通过身份验证的用户的session_id。

CookieStore,Rails默认会话存储

通常,您将在会话中设置一些值以指示用户已通过身份验证。即使它像session[:logged_in] = true一样简单,它也会更改cookie的值,并且即使session_id相同,攻击者也将无法访问该站点,因为攻击者的cookie不包含指示经过身份验证的会话的其他数据。

其他会话存储策略

在此攻击更可行。其他会话存储区仍使用cookie来保存session_id,但它们将会话 data 存储在其他位置,例如cachedatabasememcached等在这种情况下,当攻击者在受害者进行身份验证之后访问该站点时,攻击者的cookie(具有相同的session_id)将导致该会话被加载。

HttpOnly

但是,此攻击还有另一个主要障碍-HttpOnly cookies

Set-Cookie: _appname_session=v%2Ba...; path=/; HttpOnly

当一个cookie被指定为HttpOnly时,就像Rack / Rails会话cookie一样,浏览器不会通过document.cookies公开它。它不能被JavaScript读取或覆盖。我尝试通过document.cookie设置已知的会话cookie,但除非先清除现有的cookie,否则这是不可能的。这意味着,攻击者将需要没有会话cookie的用户在登录之前使用XSS漏洞访问该页面(该会话必须在没有会话cookie的页面上)。