2014-05-09 65 views
2

这听起来很奇怪。但目前我们网站的用户正在随机看到这种行为。用户以不同的用户身份自动登录

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

我们的系统内置了modx evolution 1.0.4。我们已经使用WebLogin snippet登录系统。

这种行为在中间人(MITM)攻击中可能吗?

更新

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

+1

这绝对看起来像一个缓存问题,因为其他海报在答案中已经指出。您可以让MODX输出用户的ID以查看他们是否已登录(匿名应返回用户ID“0”)。只需创建一个名为* getUserID *的代码段,其中包含以下代码:'<?php返回$ modx-> getLoginUserID();'。然后在您的网站上调用它未缓存。 – okyanet

+0

什么是你的session.hash_function值?你可以在你的应用程序前面(无意)更改/缓存头文件的代理和/或缓存?也许你可以通过配置你的web服务器来记录请求和响应头文件。 –

回答

2

这听起来像是一个缓存问题。尝试呼叫weblogin uncached [!WebLogin!]而不是[[WebLogin]]

+0

我曾尝试调用所有片段未缓存。我用我关于会议的新发现来更新我的问题。 – chanchal118

2

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

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的资源每次都返回正确的用户标识符,它只是胡乱猜测,但要确保这可能是一个可能的疑似。

1

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

session.use_strict_mode = 1 
+0

如果use_strict_mode在这里有所不同,我发现它很有趣,因为它只允许启动不存在的会话(但这些未初始化,因此它们不会是已经登录的会话)。如果这一步对任何人都有改善,我很乐意看到原因。 –

1

关于人在这方面的中间人攻击

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

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

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

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

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

关于会话的问题

不镆铘”系统属性session_handler_class有什么价值?

如果它是默认值modSessionHandler,modx使用数据库 管理会话。将设置留空至instruct modx to enable standard PHP session handling

关于缓存问题

缓存典型地仍然存在,并检索发送到客户端,例如,数据HTML代码。通常情况下,您不会在缓存文件中找到Cookie。

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

如果会话ID不平凡很长,那么很难猜出另一个用户的会话标识为 。同样,它也不太可能获取其他用户的持久会话数据。

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

因此:在modx的会话处理中监视搜索操作。使用PHP的滴答声功能

作为非常不得已

跟踪执行,您可能使PHP's tick feature

在您的应用程序(在的index.php EG)的开始这样做:

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()获取的叫在每个执行PHP语句。您可以使用此机制来准备不同客户端请求的多个跟踪 - 并相互比较。

看一看here对于一些trace code,这可能是有帮助的。

2

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

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

流程可能会得到相同的随机种子,因为您在分叉之前播种发生器,或者因为它们都是从当前时间同时播种,对于它们全部都是相同的。

最好不要让自己种下RNG - 它应该在任何理智的平台上照顾自己。

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

+0

我已将seesion_id()设置为cookie值。 – chanchal118

相关问题