取消Mediawiki登录以防止会话劫持

问题描述 投票:12回答:2

我刚刚在AS400 IBM i机器上设置了MediaWiki 1.29.0页面。我使用MariaDB作为数据库。我使用的是PHP 5.5.37

每次我尝试登录帐户时,都会收到错误消息:

您的登录会话似乎有问题;此操作已被取消,作为防止会话劫持的预防措施。返回上一页,重新加载该页面,然后重试。

显然,我正在寻找的行为是登录。

我试过了:

  • $wgMainCacheType$wgSessionCacheType改为CACHE_NONECACHE_ACCELCACHE_DBCACHE_ANYTHING的各种排列。
  • creating a tmp directory并设置其权限。
  • 重建我的LocalSettings.php文件。
  • 在php.ini中设置session.referer_check=off

我已经检查过,我知道我的cookie已启用(我可以调用document.cookie;并获取数据)。

这个问题在here之前已经被问到了,并且内部的链接问题,但没有解决方案解决了我的问题。他们还处理旧版本的WikiMedia,但我不知道这在这个例子中是否有所作为。

编辑:当我尝试创建一个新帐户时,我也会遇到相同的行为。但是,我能够导航wiki,创建页面和编辑页面而不会出现任何错误。

这是我的请求标题:

Cache-Control: private, must-revalidate, max-age=0
Connection: close
Content-language: en
Content-Type: text/html; charset=UTF-8
Date: Thu, 10 Aug 2017 13:48:36 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Link: </<path>/resources/assets/logo.png?88d75>;rel=preload;as=image
Server: Apache
Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/
Set-Cookie: <wikiname>_session=n7gs0ct99ck5i2juq0togto9q7bfou6u; path=/; secure; httponly
Transfer-Encoding: chunked
Vary: Accept-Encoding,Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Powered-By: PHP/5.5.37 ZendServer/8.5.5
X-UA-Compatible: IE=Edge

这是我的回复标题:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:ZDEDebuggerPresent=php,phtml,php3
Host:tdidev:10080
Referer:http://<wikiepath>/index.php?title=Special:UserLogin&retirnto=Main+Page
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
php session mediawiki
2个回答
5
投票

我终于找到了问题的问题。默认情况下,MediaWiki传递带有安全标志集的<wikiname>_session cookie。来自OWASP

安全标志是一个选项,可以在HTTP响应中向用户发送新cookie时由应用程序服务器设置。安全标志的目的是防止由于以明文形式传输cookie而被未授权方观察到cookie。

为了实现这一目标,支持安全标志的浏览器只会在请求进入HTTPS页面时发送带有安全标志的cookie。换句话说,浏览器不会发送具有通过未加密的HTTP请求设置的安全标志的cookie。

所以我的MediaWiki安装正确创建并缓存了一个会话令牌,它甚至仍然通过响应头传递它。但是,由于我的浏览器看到的是http而不是https,这就是令牌所获得的。 Set-Cookie线被忽略了。

php.ini中有一个名为session.cookie_secure的设置,但MediaWiki忽略了这个标志。

相反,解决方案是将此行添加到我的localSettings.php文件的底部:

$wgCookieSecure = false;


3
投票

当sessionId不按顺序更新时,我在不同的应用程序上发生了类似的事情。

因此,通常您需要一个登录表单,它会创建一个sessionId会话,并将其存储在某处。

然后你提交表单,它将它绑定到原始sessionId,检查你的身份验证,并记录原始会话,或创建一个新的,并更新你的(通常使用HTTP Set-Cookie命令,你可以在网络日志中看到)。

但是你可以通过查看当前cookie中的sessionId和表单上的任何标记(以防止重放),并根据你的/ tmp / php-session-xxx文件(可能在/ var / lib中)来查看所有内容。 / php)或它存储会话的任何数据库。

让我知道我的问题的原因在于,当我即将提交表单时,使用特定的sessionid,该sessionid已经不再有效了。因此我没有重播检查,我收到了类似于你的错误。事实证明,在我的情况下,数据库复制方式与下游访问方式不匹配,因此我可以尝试访问尚未创建的会话。

查看所有代码,sessionIds不匹配。 wpTokenLogin510a85开始,但你在SetCookie的wiki会话从n7gs0c开始,在你的日志中它讨论6ov933 ...所以假设你从不同的尝试复制/粘贴,你需要自己从一个干净的状态运行它并检查一切看起来喜欢它使用相同的会话。如果没有,请尝试弄清楚您所拥有的会话(如果它已创建/更改)或为什么您没有找到正确的会话,如果它已创建但从未正确传递给您。

也就是说,我只是看看客户端登录我们自己的内部版本的mediawiki,wpLoginTokenwikidb_sessionJSESSIONID也不匹配(虽然我希望其中一个出现在维基日志中,我也没有访问权限)。

如果必须,请查找您正在查找的错误消息的源代码,并插入error_log(__FILE__.':'.__LINE__.' '.var_export(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), true));以找出备份堆栈的工作,以查看不匹配的内容,以生成错误。

© www.soinside.com 2019 - 2024. All rights reserved.