通过 XSS 在 PHP 中更改 $_SESSION 变量?

信息安全 应用安全 Web应用程序 php xss 会话管理
2021-08-20 14:04:45

不确定我所说的是否有意义......但我是否可以从目标 PHP 脚本外部更改 $_SESSION 变量?

我们的脚本之一使用 $_SESSION 变量,我不确定它是否容易受到外部操纵,因为 $_POST 变量是......

3个回答

对此的答案取决于您的应用程序是否使用 GET 或 POST 数据来填充 SESSION 数据。

例如,当用户像这样登录时填充 $_SESSION['username'] :

$_SESSION['username'] = $_GET['login-username']

由于 XSS 拥有您的客户端,他还可以修改 login-username 变量的内容,从而控制会话变量。

然而,重要的是要知道 $_SESSION 全局变量数组只能在服务器端修改。

$_SESSION变量永远不会发送给客户端它专门存储在服务器上。用户只得到一个 ID,PHP 用它来加载相应的$_SESSION变量。

所以不,通过专门使用 XSS,您无法更改$_SESSION变量。

澄清

如果$_SESSION['password'] = $var在您的代码中找不到类似的行,则 XSS 无法更改$_SESSION['password'].

迈克有一个很好的答案。我不知道他为什么被否决(所以我投票支持他)。我刚加入,所以无法发表评论,但我想尝试解释迈克的推理,因为他的观点很好。

原来的问题是:

我们的脚本之一使用 $_SESSION 变量,我不确定它是否容易受到外部操纵,因为 $_POST 变量是......

我将其解释为:“用户是否能够像使用 $_COOKIE、$_POST 和 $_GET 一样直接从 HTTP 请求中操作 $_SESSION?”

换句话说,PHP 将从字面上获取请求标头或正文中的用户数据,并将其存储到这三个超全局变量中。但它会为 $_SESSION 做同样的事情吗?

答案是(在大多数情况下)绝对不会。PHP 中的默认会话存储是“文件”,这意味着会话被序列化并写入本地文件系统上的文件。用户无法直接操作会话的内容。

现在,正如其他人在上面指出的那样,如果您执行以下操作:

$_SESSION['foo'] = $_POST['bar'];

然后用户现在可以通过影响 $_POST 来间接影响 $_SESSION!当然这是真的,但我不认为这是问题的重点。如果您不清理用户输入,用户可能会影响任何事情。关键是要知道哪些输入没有被清理,并知道如何在使用它们之前对其进行清理。

卡拉克斯上面的批评是:

如果 XSS 更改了客户端上的值,然后在会话变量中使用,则您已使用 XSS 成功更改了 $_SESSIOn。

当然这是真的,但这不是问题的重点。按照你的逻辑,我们也可以说,“恶意用户输入可以向月球发射火箭”。如果 NASA 的某个人忘记清理他们在火箭控制应用程序中的用户输入,这是一个真实的陈述,但这是 NASA 软件的问题,而不是 PHP 的固有风险。

不幸的是,PHP 并没有明确指出哪些超全局变量是未污染的,哪些是被污染的。理解这种区别需要对 HTTP 协议以及 PHP 运行时如何处理 HTTP 请求和响应周期有中级理解。