经过数小时的阅读和尝试理解会议,这是我的一般结论/观点:
简单(和现实)的情况:
- 攻击者获取现有网站 '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)获取受害者的私人数据?
请修改我的任何误解!提前致谢。