23

我制作了一个具有注册/登录功能的网站。我可以在 Chrome 的开发人员工具中看到 PHPSESSID cookie,所以我想知道如何使用这个会话 id 值来劫持我登录的帐户,让我们说一个不同的浏览器,为了简单起见?

安全网站是否应该能够确定此会话被劫持并阻止它?

另外,为什么其他使用 PHP 的大型网站(例如 Facebook)没有 PHPSESSID cookie?他们是否给它起了一个不同的名字来表示默默无闻,或者他们只是完全使用了不同的机制?

4

3 回答 3

20

很多好问题,你问他们很好。

首先..会话只是一个cookie。“会话”不是 HTTP 堆栈的一部分。PHP 恰好提供了一些便利,使使用 cookie 变得容易,从而引入了会话。PHP 选择 PHPSESSID 作为 cookie 的默认名称,但您可以选择任何您想要的名称。即使在 PHP 中,您也可以更改 session_name。

攻击者所要做的就是获取您正在查看的会话 cookie,并在自己的浏览器中使用它。攻击者可以使用自动脚本或例如使用 firebug 来执行此操作,您只需更改当前的 cookie 值即可。

所以是的,如果我有你的 id.. 如果你不采取任何措施阻止它,我可以窃取你的会话。

然而.. 对于攻击者来说,最难的部分是首先获取 cookie。攻击者无法真正做到这一点,除非:

  • 他们可以访问您的计算机
  • 他们以某种方式能够窥探您的网络流量。

第一部分很难解决.. 您可以采取一些技巧来识别启动会话的计算机(检查用户代理是否更改,检查 IP 地址是否更改),但不是防水或不是那么好的解决方案。

您可以通过确保所有流量都使用 HTTPS 加密来解决第二个问题。几乎没有理由不使用 HTTPS。如果您的网站上有“登录”区域,请务必使用 SSL!

我希望这种回答能回答你的问题。我现在想到的其他一些建议:

  • 每当用户登录时,给他们一个新的会话 id
  • 每当用户注销时,也要给他们一个新的会话 ID!
  • 确保在任何情况下浏览器都无法确定会话 cookie 的值。如果您不认识 cookie,请重新生成一个新的!
于 2012-08-05T20:38:09.133 回答
6

如果您使用相同的 IP 并使用相同的浏览器,您所要做的就是复制会话 ID(可能还有其他 cookie 值:不确定是否跟踪/比较了浏览器特定的内容,例如其代理字符串;这是实现依赖)。

一般来说,有不同的方法来跟踪用户(最终它只是用户跟踪)。例如,您可以在网页中使用 cookie 或一些隐藏值。您也可以在 HTTP GET 请求、Flash cookie 或其他一些身份验证方法(或这些方法的组合)中使用值。

在 Facebook 的情况下,他们使用多个 cookie 值,所以我假设他们使用其中一个值(例如“xs”)。

总的来说,没有真正的 100% 安全的方法来做到这一点(例如,由于中间人攻击),但总的来说,我会做以下事情:

  • 登录后,存储用户的 IP 地址、他的浏览器代理字符串和唯一令牌(根据上面的评论进行编辑:您也可以跳过他的 IP 地址;使整个事情变得不那么安全)。
  • 客户端存储用户的唯一 ID(例如用户 ID)和该令牌(在 cookie 或 GET 值中)。
  • 只要第一步存储的数据匹配,就是同一个用户。要注销,只需从数据库中删除令牌。

哦,顺便提一下:所有这些都不是 PHP 特有的。它们可以使用任何服务器端语言(Perl、PHP、Ruby、C#...)或一般的服务器来完成。

于 2012-08-05T20:41:00.367 回答
2

有人嗅探会话 ID cookie 并将其设置为后续请求。如果这是对用户进行身份验证的唯一方法,则他们已登录。

大多数网站将以某种形式使用基于 cookie 的身份验证。有几种方法可以提高安全性,例如在用户登录时存储有关用户浏览器的信息(例如用户代理、IP 地址)。如果其他人天真地试图复制 cookie,它将无法正常工作。(当然,也有解决这个问题的方法。)您还会看到会话 cookie 定期重新生成,以确保它们在特别长的时间内无效。

查看Firesheep以获取执行会话劫持的 Firefox 扩展。我不建议您使用它,但您可能会发现该页面上的讨论很有趣。

于 2012-08-05T20:31:41.933 回答