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

Posted

技术标签:

【中文标题】会话劫持在 PHP 中究竟是如何工作的?【英文标题】:How exactly does session hijacking work in PHP? 【发布时间】:2012-08-02 22:10:44 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

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

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

每当用户登录时,给他们一个新的会话 ID 每当用户注销时,还要给他们一个新的会话 ID! 确保在任何情况下浏览器都无法确定会话 cookie 的值。如果您不认识 cookie,请重新生成一个新的!

【讨论】:

谢谢,我在 facebook 上玩 cookie,发现在删除名为 c_user 的 cookie 后,我在下一次刷新时注销了,所以我猜他们使用了某种令牌。我发现奇怪的是,它是一个 9 位整数,而不是我为我的网站的 PHPSESSID 找到的 26 位数字(字母和数字)。 facebook 可能会使用多种事物的组合。那可能只是一些用户 ID,以及一个不同的 cookie 来验证它的真实性 你是对的。 Facebook 使用xs cookie 作为验证,并结合c_user 作为用户ID。两者都在会话结束时过期,所以这是有道理的。 -1 当您说“会话只是 cookie”或“会话是使用 cookie 的便捷方式”时,您的解释具有误导性。两者都是错误的。 Cookie 和会话只有一个共同点:它们可用于存储多个请求的数据。但就是这样。其他一切都不同:cookie 存储在客户端,而会话存储在服务器端。这是最重要的区别,因为 cookie 的数据是不透明的,而 session 的数据对用户是透明的。 @Gumbo:会话完全由 cookie 处理。当我们谈论 PHP 意义上的会话时,它仍然是一个处理它的 cookie。【参考方案2】:

如果您使用相同的 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 是正确的。它存储用户标识。它与 xs cookie 结合使用以验证登录。【参考方案3】:

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

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

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

【讨论】:

为什么复制cookie不起作用,如果说自从复制后会话ID没有改变,为什么它不起作用?我确实经常在我的 PHP 页面上使用session_regenerate_id(true) 以提高安全性。我不想检查用户的 IP 地址,因为对于某些出于合法原因频繁更改的用户。 如果您使用的唯一机制是会话 cookie,则复制其值应该可以对用户进行身份验证。 (例如,它在 *** 上工作。)检查 IP 地址是对的,这不是最好的方法。

以上是关于会话劫持在 PHP 中究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

炮兵:ramto 在炮兵中究竟是如何工作的?

?: 运算符在 C 中究竟是如何工作的?

程序集引用的“特定版本”属性在 Visual Studio 中究竟是如何工作的?

程序集引用的“特定版本”属性在 Visual Studio 中究竟是如何工作的?

技能意志矩阵-skill will matrix工作中究竟是个人能力更重要,还是我们的积极性更能提高我们的业绩?

帧缓冲区在 Vulkan 中究竟是啥意思