这听起来很奇怪。但目前我们网站的用户会随机看到这种行为。
当他们匿名浏览网站时,他们会以不同的用户登录。他们是以用户的身份登录的,也就是当前登录系统的用户。他们可以代表该用户执行所有操作。
我们的系统内置了modx evolution 1.0.4。我们已经使用WebLogin代码片段作为登录系统。
这种行为在中间人(MITM)攻击中是可能的吗?
<标题> 更新我已经在服务器端存储了每个请求收到的cookie和ip列表。我在同一时间从不同ip看到相同的会话值。该值由session_id()生成。不同的机器怎么可能同时得到相同的值?
标题>这听起来像是缓存问题。尝试调用weblogin uncached [! weblogin !]而不是[[WebLogin]]
我同意orbitory的说法,这听起来像是一个缓存问题。除了WebLogin片段之外,如果您有任何其他包含个性化信息的片段或块,请确保它们也被称为非缓存。否则,如果您的站点缓存被清除,然后用户登录,则由该用户的代码片段生成的任何个性化内容将与页面一起缓存,所有用户都将看到它。
由于随机数生成器(RNG)的播种不当,我以前见过这种事情发生。您的应用程序是否处理随机数?你自己是RNG的种子吗?没有。
你的应用程序可能启动10个进程,每个进程可能获得相同的RNG种子,所以它们都开始产生相同的随机数系列,创建重复的会话令牌。
进程可能会得到相同的随机种子,因为你在分叉之前播种了生成器,或者因为它们都在一天中的当前时间同时播种,这对它们来说都是相同的。
最好不要自己播种RNG -它应该在任何正常的平台上照顾好自己。
除非有某种原因你想要一个相同的随机数序列,在这种情况下,你应该创建一个不同于默认随机数的单独的伪rng。
我不认为这与缓存有关,可能有多种可能的原因。
首先尝试这些来生成一个唯一的会话:
//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资源是否每次都返回正确的用户标识符,这只是一个大胆的猜测,但要确保这可能是一个可能的怀疑。
如果你在php.ini文件中编辑这个值,它可能会解决这个问题
session.use_strict_mode = 1
关于中间人攻击
请注意,如果您的站点使用HTTP
协议,那么劫持外部用户会话是完全可能的。
为了防止会话劫持攻击,需要启用HTTPs。
HTTP以简单文本(未加密)的形式传输与请求和应答相关的数据。
由于会话ID要么保存在cookie中,要么保存在url 中(请不要使用该选项!),因此MITM攻击只是读取会话ID。然后,MITM攻击者在其浏览器中设置会话ID cookie,并拥有其他用户的标识。
为了获得会话ID, MITM需要一个关于客户端到服务器系统的网络路由的特权位置。攻击者需要位于客户端系统和服务器系统之间。或者它需要位于客户端网络中,并模拟为客户端系统的默认路由器。关于会话问题
modx的系统属性session_handler_class有什么值?
默认为"
modSessionHandler
",表示modx使用"database"会话管理。将设置留空以指示modx启用标准PHP会话处理。
关于缓存问题
缓存通常保存和检索发送到客户端的数据,例如html代码。通常,您不会在缓存文件中找到cookie。
如果一个匿名用户X突然获得了另一个登录用户的会话cookie, modx需要以某种方式找到另一个用户的会话。
如果会话id非常长,则不太可能猜测其他用户的会话ID。同样,它也不太可能抓住保存其他用户的会话数据。
…除非modx以某种方式遍历所有持久化会话的集合,而不是仅仅抓取正确的持久化会话文件。
因此:注意在modx的会话处理中搜索操作。
使用PHP的tick特性跟踪执行
作为最后的手段,您可以启用PHP的tick特性:
在应用程序的开头(例如在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语句时调用。您可以使用此机制来准备不同客户端请求的多个跟踪-并相互比较。
查看这里的一些跟踪代码,可能会有所帮助。