【问题标题】:Session spoofing (PHP)会话欺骗 (PHP)
【发布时间】:2013-06-29 02:32:36
【问题描述】:

我正在用 PHP 编写一个包含布尔值 $_SESSION['logged_in'] 的网站。当数据库中存在用户名和密码匹配时,此设置为 true

我对会话很陌生,只是想知道未注册(或就此而言,已注册)用户是否有可能通过将此布尔值设置为 true 来绕过登录过程,就像使用一个饼干。

我知道用户必须从客户端操作服务器端变量,但我的问题是这有多容易,用户将如何完成这样的任务,是否有任何已知的漏洞,以及避免此类攻击的最佳做法/预防措施是什么?

【问题讨论】:

  • 如果客户端可以在没有您特别允许的情况下更改服务器上的会话数据,那么您将面临更大的问题。我会更担心一些糟糕的共享主机,其中包含一些存储会话数据的共享临时目录。甚至会话固定。
  • 避免的最佳做法是直接将 $_SESSION 变量分配给未过滤的用户输入。永远不要相信用户的输入。如果您确实在过滤输入,那么我看不出它是如何完成的
  • “可能”吗,是的。可以100%预防吗?不是任何可以在你身边控制的东西。但是,如果您遵循良好的标准,这极不可能。 php.net::Sessions and Security

标签: php session spoofing


【解决方案1】:

除了您的代码之外,任何人都无法在会话中操作值。要绕过它,他必须有权在服务器上运行代码或利用代码或服务器中的安全漏洞(无论是安全漏洞)。如果用户能够做到这一点,他可能不需要费心摆弄会话值,因为他实际上也可以直接在服务器上做任何其他事情。

【讨论】:

    【解决方案2】:

    我能看到这种攻击可能发生在哪里的唯一方法是,如果您的代码中存在其他漏洞,或者他们是否可以访问您的服务器(通过其他方式)。当然,如果他们可以访问您的服务器,他们就可以访问您的数据库、源代码,可能还有网络日志,可能还有包括密码在内的所有原始互联网流量......

    【讨论】:

      【解决方案3】:

      让我们从好消息开始:$_SESSION 数组默认情况下是完全不可见且无法被客户端操作的:它存在于服务器上,并且仅存在于服务器上,存在于对客户端不开放的执行环境中.

      现在回到现实:这很容易,让您的 PHP 代码“几乎正确”,从而在服务器端看到的客户端和会话之间打开一扇门。除此之外,窃取客户端会话(包括 cookie)非常容易。

      我推荐一些已被证明非常有效的缓解措施:

      • 不要存储“登录”值 - 而是存储“会话 cookie”值,并将 cookie 设置给客户端。根据客户请求,按照$loggedin=($_SESSION['cookie']==$_COOKIE['session']) 的方式做一些事情。这使得攻击者同时需要:cookie 和会话 ID。
      • 经常刷新会话 cookie,在错误的 cookie 上终止会话。如果黑帽窃取了 cookie 和会话,真实用户的下一次点击将注销两者并创建一个可记录的事件。
      • 如果您的请求来自 JS,请考虑创建一个简单的身份验证函数:不要发送身份验证令牌,而是对其进行加盐,在其上添加时间戳,然后对其进行哈希处理。发送盐、时间戳和哈希。让服务器检查时间戳。

      【讨论】:

      • 我喜欢盐胡椒的东西
      【解决方案4】:

      在会话域中遇到的最常见问题是Session Hijacking。这是因为会话与会话参数相关联。用户每次向服务器发送请求时都需要提供此参数。正如您可以想象的那样,如果有人能够猜测或检索参数,他们应该可以“劫持”会话。

      编辑:有关针对它的安全措施,请查看 Eugen Reck 的帖子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-05
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        相关资源
        最近更新 更多