PHP中的会话劫持是如何工作的?

23
我已经制作了一个具有注册/登录功能的网站。 我可以在Chrome开发者工具中看到PHPSESSID cookie,因此我想知道如何使用此会话ID值来从另一个浏览器中劫持我登录的帐户?
对于一个安全的网站,它是否能够确定该会话正在被劫持并防止其发生呢?
此外,其他使用PHP的大型网站(例如Facebook)为什么没有PHPSESSID cookies? 他们是否为了混淆而给它取了不同的名称,还是使用了完全不同的机制?
3个回答

20

有很多好问题,你能问出这些问题非常棒。

首先,一个“session”只是一个cookie。'session' 不是HTTP协议栈的一部分。 PHP只是恰巧提供了一些方便来处理cookies,因此引入了sessions。PHP选择PHPSESSID作为cookie的默认名称,但您可以选择任何您想要的名称。即使在PHP中,您也可以更改session_name。

攻击者需要做的就是获取您正在查看的session cookie,并在其自己的浏览器中使用它。攻击者可以使用自动化脚本或例如使用firebug,您可以更改当前cookie值。

所以,如果我有您的id..如果您没有采取任何预防措施,我就可以窃取您的session。

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

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

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

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

我希望这种方式回答了您的问题..我现在想到了一些其他要点:

  • 每当用户登录时,给他们一个新的session id
  • 每当用户退出时,也给他们一个新的session id!
  • 确保浏览器在任何情况下都无法确定session cookie的值。如果您不认识cookie,则重新生成一个新的cookie!

3
Facebook可能使用多种方式。可能只是使用用户ID和不同的Cookie来验证其真实性。 - Evert
@Gumbo:会话完全由cookie处理。当我们谈到PHP意义上的会话时,仍然是一个cookie来处理它。 - Evert
@Evert 不是的。Cookie 只用于在客户端上存储会话 ID,以便在后续请求中使用。您还可以使用其他传输方式,例如 URL(请参见 .NET 的无 Cookie 会话 作为一个众所周知的示例)。但整个会话管理都是在服务器端完成的,主要是维护值和会话过期。查看 我的 PHP 会话理解正确吗? 了解有关 PHP 内部的一些见解。 - Gumbo
@Gumbo:我非常清楚会话的工作原理。如果您确实在PHP中使用基于URL的会话,那么您正在犯一个严重的安全错误。99%的情况下,会话是基于cookie的,而您现在只是过于追求细节了。 - Evert
@Evert 当你说会话和Cookie不完全不同的时候是正确的,因为两者都是某种数据存储技术。但它们也并不是那么相似。事实上,最主要和最重要的区别是存储位置:Cookie 存储在客户端,而会话存储在服务器端。这也决定了谁对其拥有控制权:Cookie 受客户端控制,而会话受服务器控制。 - Gumbo
显示剩余7条评论

6
如果您使用相同的IP和浏览器,您只需要复制会话ID(也许还有其他cookie值:不确定是否跟踪/比较浏览器特定的事物,如其代理字符串;这取决于实现)。
一般来说,有不同的跟踪用户的方法(最终都是用户跟踪)。例如,您可以在网页中使用cookie或某些隐藏的值。您还可以使用HTTP GET请求中的值、Flash cookie或其他身份验证方法(或这些方法的组合)。
在Facebook的情况下,他们使用了几个cookie值,所以我会假设他们使用其中之一(例如“xs”)。
总的来说,没有真正的100%安全方法(例如由于中间人攻击),但总体上,我会执行以下操作:
- 在登录时,存储用户的IP地址、浏览器代理字符串和一个唯一令牌(编辑评论以上:您也可以跳过IP地址;使整个过程稍微不那么安全)。 - 在客户端存储用户的唯一ID(例如用户ID)和该令牌(在cookie或GET值中)。 - 只要第一步中存储的数据匹配,就是同一用户。要注销,只需从数据库中删除令牌即可。
哦,顺便提一下:所有这些东西都不是PHP特定的。它们可以用任何服务器端语言(Perl、PHP、Ruby、C#等)或通用服务器来完成。

+1 提到 xs。Evert 在 Facebook 上关于 c_user cookie 的说法是正确的。它存储用户 ID。它与 xs cookie 结合使用以验证登录。 - hesson

2

某人嗅探了会话ID cookie并将其设置为后续请求。如果这是唯一验证用户的东西,他们就已经登录了。

大多数网站将使用基于cookie的身份验证。有几种方法可以使其更安全,例如在用户登录时存储关于用户浏览器的信息(例如用户代理、IP地址)。如果有人尝试复制cookie,那么它将无法起作用(当然,也有办法绕过此限制)。您还将看到会话cookie被定期重新生成,以确保它们的有效期不会特别长。

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


为什么复制 cookie 不起作用呢?比如说,如果会话 ID 自从复制后没有改变,为什么它不起作用呢?我经常在我的 PHP 页面上使用 session_regenerate_id(true) 来增加安全性。我不想检查用户的 IP 地址,因为对于一些用户来说,它们的 IP 地址会因为合法原因而频繁更改。 - hesson
如果您使用的唯一机制是会话cookie,则复制其值应该可以用于验证用户身份(例如,在StackOverflow上有效)。关于检查IP地址,您是正确的,这不是最好的方法。 - Michael Mior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接