会话欺骗(PHP)

11

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

我对Session比较陌生,想知道是否可能通过将这个布尔变量设置为true来绕过登录流程,无论是未注册用户还是已注册用户,就像使用cookie时那样。

我知道用户必须从客户端操作服务器端变量,但我的问题是这会有多容易实现,用户应该如何完成此任务,是否存在已知的漏洞,以及如何避免此类攻击的最佳实践/预防措施?


2
如果客户端可以在没有您明确允许的情况下更改服务器上的会话数据,那么您面临的问题比这还要大。我更担心的是一些糟糕的共享主机和一些共享临时目录,其中存储了会话数据。或者甚至是会话固定攻击。 - PeeHaa
https://dev59.com/XVnUa4cB1Zd3GeqPedgu - Emilio Gort
最佳实践是避免直接将$_SESSION变量分配给未经过滤的用户输入。永远不要相信用户的输入。如果您确实在过滤输入,那么我不知道如何做到这一点。 - Emilio Gort
可以吗?可以的。能够百分之百地防止吗?不是通过你所控制的任何方式。但是,只要遵循良好的标准,这是极其不可能的。[php.net:会话和安全性](http://php.net/manual/zh/session.security.php) - Jacob S
4个回答

16

让我们从好消息开始:默认情况下,$_SESSION数组是完全不可见和不可修改的,仅存在于服务器上,并且仅在服务器上的执行环境中开放给服务器。

现在回到现实:得到你的PHP代码“几乎正确”并打开客户端与服务器看到的会话之间的门是相当容易的。此外,窃取客户端会话(包括cookie)也很容易。

我建议采取一些缓解措施,这些措施已被证明非常有效:

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

4
我喜欢盐和胡椒的组合。 - Boniface Pereira
我不明白第一点应该如何有所帮助。$_COOKIE是已知的客户端信息,如果攻击者通过XSS攻击获取了这个cookie,他仍然可以登录。 - undefined

2

除了您的代码,任何人都无法操作会话中的值。要绕过这个限制,他必须有权限在服务器上运行代码或利用您的代码或服务器中的安全漏洞(无论哪种方式都是安全漏洞)。如果用户能够做到这一点,他可能不需要费心去调整会话值,因为他也可以直接在服务器上执行几乎任何其他操作。


1
我唯一能想到这种攻击可能发生的方式是,如果你的代码中存在其他漏洞,或者他们通过其他途径访问了你的服务器。当然,如果他们可以访问你的服务器,他们就可以访问你的数据库、源代码、可能的网络日志,甚至包括密码在内的所有原始互联网流量……

1
在会话领域中最常见的问题是 会话劫持。这是因为会话与会话参数相关联。每次用户向服务器发送请求时都需要提供此参数。如果有人能够猜测或检索到该参数,他们就可以“劫持”会话。请注意,为了防止此类问题,可以参考Eugen Reck的帖子进行安全措施编辑。

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