-1

经过数小时的阅读和尝试理解会议,这是我的一般结论/观点:

简单(和现实)的情况:

  • 攻击者获取现有网站 'website.example.com' 并将随机 SID 放在 URL '9gag.com/?SID=1234' 后面
  • 攻击者将此 URL 粘贴到“论坛”上,并附上以下文字:“9gag 为前 1000 次登录提供免费的东西!”
  • 受害者认出了该网站,因为他在那里有一个帐户,所以他很快点击了给定的 URL。
  • 受害者进入网站并登录。

因为受害者点击了“9gag.com/?SID=1234”并登录;他现在登录到 id=1234 的会话。请注意,每个会话都有一个唯一的 ID。这是服务器处理每个会话个体所必需的。虽然可以同时从多台计算机上进行相同的会话(具有相同的 id)。

  • 攻击者也访问了 '9gag.com/?SID=1234'。他现在与受害者在同一场会议上。这意味着他像受害者一样登录。他可以查看所有受害者帐户设置并进行更改。

为防止这种情况发生,本网站的主机可以使用以下 PHP 代码:

<?php

  session_start();

  if (!isset($_SESSION['initiated']))
  {

    session_regenerate_id();
    $_SESSION['initiated'] = TRUE;
  }

  ?>

当initiated 为真时(所以当生成随机sessionID 时)不会生成新的sessionID。否则,生成新的 sessionID。因此,当受害者使用给定的 sessionID '1234' 登录时,它会将其丢弃并生成一个新的。现在攻击者无法获得与您相同的 sessionID,因为他不知道。

攻击者很聪明,并且知道另一种方式:

  • 攻击者访问该站点并登录。PHP 服务器已生成一个新的 sessionID。
  • 攻击者查看他的 COOKIES 以查看他收到的 sessionID。他发现 SID='412e11d5'
  • 攻击者执行与之前相同的步骤,但使用给定 ID 而不是“1234”。-> '9gag.com/?SID=412e11d5'

问题:这怎么可能?

  • $_SESSION['initiated'] 是否基于给定的 ID?所以'initiated == true'是因为它使用了id '412e11d5'的会话?
  • 攻击者先进行会话,否则无法生成 ID。那么受害者不应该进入攻击者会话(在他的帐户设置上,..)而不是反之亦然?
  • 看起来会话固定是基于很多运气。攻击者必须与受害者同时进入网站。我想我只是不明白这是如何工作的..

编辑:使用跨站点烹饪的攻击:

  • 攻击者创建了一个自己的网站“evil.example.com”,该网站将特定的 sessionID 存储在现有网站“9gag.com”的 COOKIE 中。
  • 受害者点击 URL 'evil.example.com' 就像在其他示例中一样。sessionID 已存储在他的“9gag.com”COOKIE 中。
  • 受害者当天晚些时候登录了“9gag.com”。
  • 攻击者现在可以使用固定会话标识符来使用受害者的帐户。

问题:再次,这怎么可能?:

  • 即使攻击者可以在另一个网站的 COOKIE 中存储一些东西。他如何/何时可以与受害者参加同一会议?他似乎不必同时登录?还是他可以通过其他方式(但使用 sessionID)获取受害者的私人数据?

请修改我的任何误解!提前致谢。

4

1 回答 1

2

$_SESSION['initiated'] 是否基于给定的 ID?所以'initiated == true'是因为它使用了id '412e11d5'的会话?

不,它基于给定的会话。但已启动 == true,因为对于该给定会话,它已启动。那个时候会话是用那个 id 保存的,是的,所以那个 id 的会话就被启动了。

攻击者先进行会话,否则无法生成 ID。那么受害者不应该进入攻击者会话(在他的帐户设置上,..)而不是反之亦然?

是的。但是,如果攻击者在没有登录的情况下创建了一个会话,并且受害者会登录,那么它(最初)将是攻击者会话,但受害者记录了详细信息。

看起来会话固定是基于很多运气。攻击者必须与受害者同时进入网站。我想我只是不明白这是如何工作的..

不,攻击者不需要同时进入。就在给定 id 的会话仍然有效时。


现在,所有这一切的一个简单解决方案是禁用 urls (trans_sid) 中的会话 ID。应该始终这样做。

为了提高安全性,可以(并且在某些情况下应该)在每次请求/响应时重新生成会话 ID。

于 2012-11-15T20:35:33.537 回答