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

时间:2017-08-08 18:20:07

标签: php session mediawiki

我刚在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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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));以查找备份工作,查看无法匹配的内容,以生成错误。

答案 2 :(得分:0)

这是 MediaWiki 的一个持续问题,是由于您输入的密码不正确,或者 MediaWiki 在登录过程(数据库、cookie、磁盘文件等)中未能写入某些内容。就我而言,我使用 $wgReadOnly 变量使 wiki 只读。我发现我必须使用 $wgMainCacheType = CACHE_MEMCACHED 才能让我的系统正常工作。

见:https://www.mediawiki.org/wiki/Manual:Memcached