在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日
是否可以登录成功了,也记录用户登录的时间与IP?
肯定可以,开源软件嘛。你可以自己研究一下,在Controller.php和Session.php增加登录成功后记录相关信息的代码
好的.我研究一下.
看不懂
关于登录的IP记录博主能不能再写篇文章,