经过数小时的阅读和理解,这是我的总体结论/观点:
简单(现实)情况:
- 攻击者采用现有网站"website.example.com",并将随机SID放在URL"9gag.com/?SID=1234'
- 攻击者将此URL粘贴到"论坛"上,并附上文字:"9gag为前1000次登录免费提供内容!">
- 受害者认出了这个网站,因为他在那里有一个账户,他很快就点击了给定的URL
- 受害者进入网站并登录
因为受害者点击了'9gag.com/?SID=134'并登录;他现在登录了id=1234的会话。请注意,每个会话都有一个唯一的id。这对于服务器单独处理每个会话是必要的。不过,可以同时从多台计算机进入同一会话(具有相同id)。
- 攻击者转到'9gag.com/?SID=1234'。他现在和受害者在同一个会议上。这意味着他像受害者一样登录。他可以查看所有受害者帐户设置并进行更改
为了防止这种情况,该网站的主机可以使用以下PHP代码:
<?php
session_start();
if (!isset($_SESSION['initiated']))
{
session_regenerate_id();
$_SESSION['initiated'] = TRUE;
}
?>
When initiated is true(so When random sessionID has been generated)将不会生成新的sessionID。否则,生成新的sessionID。因此,当受害者使用给定的sessionID"1234"登录时,它会抛出它消失并产生一个新的。现在攻击者不能再继续了sessionID为你,因为他不知道。
攻击者很聪明,知道另一种方法:
- 攻击者进入网站并登录。PHP服务器生成了一个新的sessionID
- 攻击者查看他的COOKIES,看看他收到了什么会话ID。他发现SID='412e11d5'
- 攻击者执行与以前相同的步骤,但使用给定的ID而不是"1234"。->'9gag.com/?SID=412e11d5'
问题:这怎么可能?:
- $_SESSION["已启动"]是否基于给定的ID?所以"initiated==true"是因为它使用了id为"412e11d5"的会话
- 攻击者首先进行了会话,否则就不可能生成ID。那么,受害者不应该参加攻击者会话(在他的账户设置中……),而不是反之亦然吗
- 看起来固定会话是建立在运气不佳的基础上的。攻击者必须与受害者同时登录网站。我想我只是不明白这是怎么回事
编辑:使用跨站点烹饪的攻击:
- 攻击者创建了一个自己的网站"evile.example.com",该网站将特定的sessionID存储在现有网站"9gag.com"的COOKIE中
- 和其他例子一样,受害者点击网址"邪恶的example.com"。一个sessionID已经存储在他的"9gag.com"COOKIE中
- 受害者当天晚些时候登录"9gag.com">
- 攻击者现在可以使用固定的会话标识符使用受害者的帐户
问题:再说一遍,这怎么可能?:
- 即使攻击者可以在另一个网站的COOKIE中存储一些东西。他怎样/什么时候能和受害者参加同一次会议?似乎他不必同时登录?或者他可以用另一种方式(但使用sessionID)获取受害者的私人数据吗
请修改我部分的任何误解!提前谢谢。
$_SESSION["initiated"]是否基于给定的ID?所以"initiated==true"是因为它使用了id为"412e11d5"的会话?
不,它基于给定的会话。但是initiated==true,因为对于给定的会话,它是被启动的。是的,会话在那个时候用那个id保存,这样就启动了那个id的会话。
攻击者首先进行了会话,否则不可能生成ID。那么,受害者不应该参加攻击者会话(在他的账户设置中……),而不是反之亦然吗?
是。但是,如果攻击者在没有登录的情况下创建了一个会话,而受害者会登录,那么这将是(最初的)攻击者会话,但受害者会记录详细信息。
看起来会话固定是基于运气。攻击者必须与受害者同时登录网站。我想我只是不明白这是怎么回事。。
不,攻击者不需要同时进入。就在给定id的会话仍然有效的时候。
现在,一个简单的解决方案是禁用url中的会话id(trans_sid)。应该始终这样做。
为了提高安全性,可以(在某些情况下应该)在每个请求/响应上重新生成会话id。