PHP 会话劫持

Posted

技术标签:

【中文标题】PHP 会话劫持【英文标题】:PHP Session Hijacking 【发布时间】:2011-09-22 21:49:37 【问题描述】:

我有一个关于 php 中的会话劫持的问题。我今天早上一直在阅读它,我有几个问题在我阅读的文档中没有明确回答。

用户可以更改他们在我网站上的会话吗?即,如果他们在登录时有一个 X 会话,他们是否可以将该会话更改为 Y 或 Z,如果他们愿意的话?

我认为会话是由浏览器设置的,无法更改,但我一直在阅读的所有会话劫持内容都让我产生了一些疑问。

【问题讨论】:

【参考方案1】:

实际上用户不能更改您网站上的实际会话值,但可以更改用于跟踪会话的会话 ID,此会话 ID 由您的网站存储在客户端浏览器中,通常在 cookie 中命名为“PHPSESSID”,这也是称为会话 cookie。当在站点上启动会话时,它会将与该会话对应的唯一 ID 以名为“PHPSESSID”的 cookie 的形式存储在相应的客户端浏览器中。因此,如果用户能够获取任何其他用户的 PHPSESSID,并且可以将他的 PHPSESSID 替换为受害者的 PHPSESSID,这将导致会话劫持。 我在这里使用 PHP 上下文。

【讨论】:

【参考方案2】:

术语“会话”在服务器和浏览器中的含义不同。浏览器会话充其量只能与服务器会话紧密连接。 “会话劫持”指的是服务器sessions。

在服务器端,会话具有 ID(在客户端和服务器之间传递)、内容(存储在服务器上)和可能的其他属性,例如上次访问时间。会话 ID 通常作为 cookie 传递。在 PHP 中,cookie 的默认名称是“PHPSESSID”。如果 cookie 不可用,PHP 将(可选)使用同名的查询字符串参数(“PHPSESSID”)。此 cookie(或查询参数)可以轻松更改,因此会话标识符也可以更改。

会话的内容(即包含用户的登录状态)不能由客户端更改,数据存储在服务器上,只能由该服务器上的 PHP 脚本更改服务器。请注意,在共享托管环境(由其他服务或用户共享)中,如果使用默认会话存储目录 (/tmp),则可以覆盖会话。为了防止这种情况,要么通过session_set_save_handler() 使用数据库,要么使用session.save_path 设置自定义会话目录并设置适当的目录权限(最好是700,这意味着只有所有者(PHP 用户)可以读取和写入它) .

为了防止会话劫持,您必须有其他方法来识别会话中的用户。这可以是用户代理、IP 地址或其他 cookie。前面提到的方法只是变通方法,防止会话 cookie 被窃取的最佳方法是在涉及会话时使用 HTTPS。不要忘记使用session_set_cookie_params()httponly 标志设置为true

在客户端,“会话”再次被重载并在各种上下文中使用(例如,会话管理器,在打开浏览器时恢复打开的页面,会话 cookie 和sessionStorage)。我们可以尝试通过说浏览器会话由一组视图及其相关数据组成,从而将这些含义组合起来(形成一个绝不是标准的含义)。 (“视图”是指选项卡式浏览器中的选项卡和非选项卡式浏览器中的窗口;DOM window 对象向 JS 公开了一个视图。)每个视图都有一个历史记录、一个当前页面和页面数据。同一域中页面的页面数据在会话中的视图之间共享;如果两个页面位于不同的域或不同的会话中,它们不会共享数据。退出浏览器会关闭所有打开的会话,可能会保存部分会话(例如历史记录、当前页面、sessionStorage),以便会话管理器可以重新打开它们。会话 cookie 是在会话关闭时丢弃的 cookie;换句话说,会话 cookie 是非持久的。虽然会话 cookie 可以保存会话 ID,但这两个概念是 orthogonal(意义 4;会话 cookie 可以保存会话 ID 以外的内容,会话 ID 可以存储在持久性 cookie 中)。

两个不同的视图是否在同一个集合中取决于浏览器。例如,一个浏览器可能认为会话由单个窗口中的所有选项卡组成;单独的窗口是单独的会话。 IE8 允许用户通过“新会话”菜单项创建新会话。否则,将在同一会话中打开新窗口和选项卡。隐私模式也会创建新会话。

总而言之,浏览器会话确实是由浏览器设置的,尽管它为用户提供了多种控制浏览器会话的方法:创建新会话、通过浏览、保存和恢复会话来更改视图中的历史记录和当前页面。用户甚至可以通过编辑保存在磁盘上的会话来更改会话数据,尽管这不是浏览器提供的功能。这些都与会话劫持无关。服务器会话由服务器创建和管理,但用户可以(尝试)通过更改浏览器传递回服务器的会话 ID 来切换服务器会话,这是会话劫持的基础。

另见PHP Session Fixation / Hijacking。

【讨论】:

会话劫持是指窃取会话cookie。这在与其他计算机共享本地网络时最容易实现。例如。在星巴克。示例...会话 Y 的用户正在星巴克浏览 James 的网站。我正在监听他们的网络流量,喝着我的拿铁咖啡。我将用户与会话 Y 的 cookie 用于 James 的网站并将我的浏览器设置为使用它们。现在,当我访问 James 的网站时,James 的网站认为我是会话 Y 的用户。阻止这种情况的唯一方法是使用端到端 https。 我认为这就是 Lekensteyn 提到 session_set_cookie_params 函数的原因,您可以使用该函数指定如果未通过 https 进行连接,则不会使用会话 cookie。 @Arkh:实际上,在 Chris 提到它之后,我进行了编辑。尽管如此,如果间谍软件成功地复制了会话 ID,其他提到的想法应该可以保护你一点。当然,这不是万无一失的方法,但总比没有好,如果你被感染了,除了 PHP 会话之外,你还有更多的担忧。 (除非使用该会话运行银行网站;)) 使用 SSL 安全连接时到底发生了什么变化?那么会话是否保存? @binoculars 是的,确实如此,尤其是在没有其他机制来验证会话的情况下。示例:***.com 使用 usr cookie 标识您,其形式为 t=XXX&s=yyy。例如,高级代表用户可以访问审核工具(这将是您的“限制区域”)。如果有人设法利用了未加密的 HTTP 流量,那么这个会话 cookie 就会被轻松提取。由于此 ID 未绑定到 IP 地址,因此攻击者可以使用此 cookie 访问高级用户的帐户。 (我刚刚用 `curl -b 'usr=t=...' ***.com 试过这个)【参考方案3】:

用户可以随时更改其会话。它只是存储在用户浏览器的cookie中的随机字符串,因此用户更改它非常简单。

由于会话的实际内容存储在您的服务器上,您可以例如存储用户的 IP 地址、用户代理或类似内容,以便更难从彼此窃取会话,方法是每次检查此信息是否仍然匹配发出一个新的 http 请求。

【讨论】:

以上是关于PHP 会话劫持的主要内容,如果未能解决你的问题,请参考以下文章

PHP中正确的会话劫持预防

PHP会话劫持[重复]

PHP 防止会话固定/劫持

PHP Session 劫持安全

使用 Kohana 避免会话劫持

取消Mediawiki登录以防止会话劫持