Nextcloud记录登录失败的密码

在Nextcloud登录时如果密码有误会记录在oc_bruteforce_attempts表中,但只记录了尝试的用户名,没记录密码

为了更好地分析输错密码的尝试究竟是不是恶意攻击,我增加了记录登录失败密码的功能。

似乎Nextcloud有两个登录的途径,一个是新的,一个是Legacy但还能用,因此两处都要修改

1、新的登录由一个LoginController控制,修改core/Controller目录下的Controller.php,在大约326行修改createLoginFailedResponse函数增加两段代码,将原本的

private function createLoginFailedResponse(
	$user, $originalUser, $redirect_url, string $loginMessage) {
	// Read current user and append if possible we need to
	// return the unmodified user otherwise we will leak the login name
	$args = $user !== null ? ['user' => $originalUser] : [];
	if ($redirect_url !== null) {
		$args['redirect_url'] = $redirect_url;
	}
	$response = new RedirectResponse(
		$this->urlGenerator->linkToRoute('core.login.showLoginForm', $args)
	);
	$response->throttle(['user' => substr($user, 0, 64)]);
	$this->session->set('loginMessages', [
		[$loginMessage], []
	]);
	return $response;
}

改为

private function createLoginFailedResponse(
	$user, $originalUser, $redirect_url, string $loginMessage,$password='') {
	// Read current user and append if possible we need to
	// return the unmodified user otherwise we will leak the login name
	$args = $user !== null ? ['user' => $originalUser] : [];
	if ($redirect_url !== null) {
		$args['redirect_url'] = $redirect_url;
	}
	$response = new RedirectResponse(
		$this->urlGenerator->linkToRoute('core.login.showLoginForm', $args)
	);
	$response->throttle(['user' => substr($user, 0, 64),'password'=>$password]);
	$this->session->set('loginMessages', [
		[$loginMessage], []
	]);
	return $response;
}

再修改此文件306行将原本的

return $this->createLoginFailedResponse(
	$data->getUsername(),
	$user,
	$redirect_url,
	$result->getErrorMessage()
);

改为

return $this->createLoginFailedResponse(
	$data->getUsername(),
	$user,
	$redirect_url,
	$result->getErrorMessage() ,
	$password
);

2、Legacy登录只需修改lib/private/User目录下的Session.php,在大约469行的位置增加 ,'password'=>$password 将原本的

$throttler->registerAttempt('login', $request->getRemoteAddress(), ['user' => $user]);

改为

$throttler->registerAttempt('login', $request->getRemoteAddress(), ['user' => $user,'password'=>$password]);

就是这么简单

不过在上一篇文章还增添了UA,那么这里也增加一下UA吧,步骤如下:

1、首先在数据库增加UA字段,执行以下SQL语句:

ALTER TABLE `oc_bruteforce_attempts` ADD `ua` VARCHAR(1000) NULL AFTER `metadata`;

2、随后修改lib/private/Security/Bruteforce目录下的Throttler.php,在原本大约108行后增加'ua' => $_SERVER['HTTP_USER_AGENT'],,将原本的

$values = [
	'action' => $action,
	'occurred' => $this->timeFactory->getTime(),
……

改为

$values = [
	'ua' => $_SERVER['HTTP_USER_AGENT'],
	'action' => $action,
	'occurred' => $this->timeFactory->getTime(),
……

P.S.和上次一样,按顺序完成一部分修改时不会影响正常运行,因此可按步骤直接在生产环境操作

炫酷

2020年1月26日

发表评论

电子邮件地址不会被公开。 必填项已用*标注

地方所限只列了这些常用的,但如果你打开例如https://tiny.zhouii.com/qqemoji/e888.gif发现不是404也可以手动加入[e888]之类的喔~