在另一个用户的会话中注入PHP

6

由于每个用户都有一个独特的PHPSESSID,使用运行在服务器上的标准PHP,是否可能让两个用户(例如a和b)将信息注入到b的SESSION数据中。

请注意,我不会将此用于任何不良目的。我试图在没有数据库访问权限的情况下进行聊天。

感谢您的时间。

6个回答

6
我假设你想通过发送消息来与B聊天,并将该消息放入B的会话中。
首先,A需要学习B的会话ID,可能是通过从列表中选择其名称。您几乎肯定希望加密这些会话ID,否则您已经创建了一个不错的安全漏洞!
因此,A向服务器发布包含目标会话ID和消息的数据。以下是我们如何暂时切换会话ID以将数据写入目标会话的方法:
//get data from form - I'll leave the encryption of the target
//session id up to you!
$target_session_id=decryptSessionId($_POST['target']);
$message=strip_tags($_POST['message']);

//remember our "real" session id and close the session
$original_session_id=session_id();
session_write_close();

//open the target session
session_id($target_session_id);
session_start();

//add message to target session
$_SESSION['chat'][]=$message;

//close target session
session_write_close();


//reopen the "real" session
session_id($original_session_id);
session_start();

2

我认为OP并不是在询问会话攻击,而是关于如何编写能够更新另一个会话的代码。 - Paul Dixon

1

Session是一个简单的东西,可以很容易地重新实现以满足您的需求。看一下我之前写的这个简单的例子:http://pastebin.com/f3ca0ae8d

用法:

  • new mySession(); 执行与 session_start(); 相同的操作
  • $_MYSESSION 执行与 $_SESSION 相同的操作
  • delete mySession(); 执行与 session_write_close(); 相同的操作,除非您想在脚本结束之前释放会话,否则不需要使用。

您可以进行一些适应性调整,以便将其用于特定目的,例如自己定义会话ID,以便在不同用户之间共享它。由于 $_MYSESSION 将在用户之间共享,因此您还可以与常规PHP会话一起使用它,在 $_SESSION 中存储特定于用户的信息。

[编辑]

http://pastebin.com/f3c31737e

示例:输入频道 $_SESSION['channelid'] 并打印所有未读行。


session_start();
new mySession($_SESSION['channelid']);

while (count($_MYSESSION['chat']) > 100) unset($_MYSESSION['chat'][key($_MYSESSION['chat'])]);

while ($line = $_MYSESSION['chat'][$_SESSION['lastread']++])
        echo "$line<br>";

例子:与频道交流。


session_start();
new mySession($_SESSION['channelid']);

$_MYSESSION['chat'][] = $_SESSION['myname'] . ' says, "' . htmlspecialchars($_POST['message']) . '"';

等等...


1

与其通过会话系统进行间接文件处理,为什么不直接使用文本文件呢?这样做更不容易受到攻击,而且也不太容易出现问题,因为未来的 PHP 版本可能会出于安全原因决定防止此类会话切换(完全是假设,但有道理)。


0

我不能确定,但由于会话数据默认存储在文件中,如果您的应用程序知道其他用户的会话ID,则可以使用更改后的数据替换标准会话函数编写的会话文件。下次其他用户访问脚本时,将加载更改后的会话数据。

但是,如果您只是在内置会话处理之上执行此操作,则会冒着各种竞争条件和冲突的风险。您可能需要使用自己的会话处理函数来处理所有这些问题。这些问题可能比表面上看起来要复杂得多。

请参见:{{link1:http://www.php.net/manual/en/session.customhandler.php}} 了解有关自定义会话处理程序的信息


0

PHP的默认会话处理程序仅使用会话ID来标识会话。这使得可以使用另一个用户的会话ID,从而使用相同的会话(会话劫持)。另一种攻击是准备一个会话并让受害者使用该会话,以便受害者和攻击者再次使用相同的会话(会话固定)。

此类攻击的基础是您只需要知道与之关联的会话ID即可使用会话。预防技术是使用比会话ID更多的标识信息。有人建议使用IP地址(但在会话期间可能会更改)或用户代理标识符。另一种技术是通过仅允许Cookie和HTTPS来在外部隐藏会话ID。

但也要注意共享主机。有些人可能为所有客户的所有会话数据文件使用公共池。


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