2

这听起来很奇怪。但目前我们网站的用户正在随机看到这种行为。

当他们匿名浏览网站时,他们会以不同的用户身份登录。他们以当前实际登录系统的用户身份登录。他们可以代表该用户执行所有操作。

我们的系统内置于 modx evolution 1.0.4。我们使用 WebLogin 片段作为登录系统。

中间人(MITM)攻击是否可能出现这种行为?

更新

我已经在服务器端存储了每个请求收到的 cookie 和 ip 列表。我在同一时间从不同的 ip 看到相同的会话值。该值是使用session_id()生成的。不同的机器如何同时获得相同的价值?

4

6 回答 6

2

我同意轨道,这听起来像是一个缓存问题。除了 WebLogin 片段之外,如果您有任何其他包含个性化信息的片段或块,请确保它们也被称为未缓存。否则,如果您的站点缓存被清除,然后用户登录,则该用户的片段生成的任何个性化内容都将与页面一起缓存,并且所有用户都会看到它。

于 2014-05-09T16:12:46.733 回答
2

这听起来像是一个缓存问题。尝试调用未缓存的 weblogin [!WebLogin!] 而不是 [[WebLogin]]

于 2014-05-09T15:35:02.840 回答
2

由于随机数生成器(RNG)的播种不当,我以前见过这种事情发生。您的应用程序是否处理随机数?你自己播种RNG吗?不。

您的应用程序可能会启动 10 个进程,并且每个进程都可能获得相同的 RNG 种子,因此它们都开始产生相同的一系列随机数,从而创建重复的会话令牌。

进程可能会获得相同的随机种子,因为您在分叉之前为生成器播种,或者因为它们都从当前时间开始同时播种,这对它们来说都是相同的。

最好不要自己播种 RNG - 它应该在任何健全的平台上自行处理。

除非出于某种原因您想要一系列相同的随机数,在这种情况下,您应该创建一个与默认随机数不同的单独的伪随机数。

于 2014-05-23T18:35:20.723 回答
1

如果您在 php.ini 文件中编辑此值,它可能会解决问题

session.use_strict_mode = 1
于 2014-05-22T04:45:38.507 回答
1

我不认为这与缓存有关,可能有多种可能的原因。

首先尝试这些来生成一个独特的会话:

//For successfully truncating a session
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

//For generating a unique id for every session
session_regenerate_id(true);

另外,请检查 mysql 资源是否每次都返回正确的用户标识符,这只是一个疯狂的猜测,但请确保这可能是一个可能的嫌疑人。

于 2014-05-18T10:39:13.493 回答
1

关于中间人攻击

HTTP请注意,如果您的站点使用该协议,则完全有可能劫持外国用户会话。

为了防止会话劫持攻击,您需要启用 HTTPs。

HTTP 将与请求和回复相关的数据作为简单文本(未加密)传输。

由于会话 ID 要么保存在 cookie 中,要么保存在 URL 中(请不要使用该选项!),受攻击的 MITM 只需读出会话 ID。然后,MITM 攻击者在他的浏览器中设置会话 ID cookie 并拥有其他用户的身份。

要获得会话 ID,MITM 需要一个关于客户端到服务器系统的网络路由的特权位置。攻击者要么需要位于客户端系统和服务器系统之间。或者它需要位于客户端的网络中并模仿为客户端系统的默认路由器。

关于会话问题

modx 的系统属性session_handler_class有什么价值?

如果是默认值modSessionHandler,modx 使用数据库管理会话。将设置留空以指示 modx 启用标准 PHP 会话处理

关于缓存问题

缓存通常保留并检索发送到客户端的数据,例如 HTML 代码。通常,您不会在缓存文件中找到 cookie。

如果匿名用户 X 突然获得另一个登录用户的会话 cookie,modx 需要以某种方式找到其他用户的会话。

如果会话 ID 很长,则不太可能猜测另一个用户的会话 ID。同样,获取另一个用户的持久会话数据的可能性很小。

...除非 modx 以某种方式遍历所有持久会话的集合 - 而不是仅仅获取正确的持久会话文件。

因此:在 modx 的会话处理中寻找搜索操作。

使用 PHP 的刻度功能跟踪执行

作为最后的手段,您可以启用PHP 的刻度功能

在您的应用程序的开头执行此操作(例如在 index.php 中):

declare(ticks=1);
register_tick_function('traceStatements', true);

然后,定义刻度函数

function traceStatements() {

      $traceInfo = debug_backtrace();

      // Use $traceInfo to identify the last method called
      // Trace the method to a central log file
      // Create a new log file per incoming http request

}

使用此代码traceStatements()get在每个执行 PHP 语句时调用。您可以使用此机制来准备不同客户端请求的多个跟踪 - 并相互比较。

这里查看一些跟踪代码,这可能会有所帮助。

于 2014-05-22T23:30:38.113 回答