今天手下有网站客户说收到了公安那边联系说网站存在安全隐患:
近日我办监测发现,XXXX有限公司网站存在用户名枚举漏洞,这种漏洞允许攻击者未经授权地访问并获取已经发布文章的其他用户的敏感信息,如用户名和ID。
根据《网络安全法》第二十一条、二十五条规定和《河南省党委(党组)网络安全工作责任制实施细则》有关要求,相关责任单位应根据下列问题及应对措施建议,立即核查处置,及时报告进展情况。
WordPress 在4.7.0版本之后将REST API插件集成到默认功能之中。REST API为WordPress的使用者提供了一个方便快捷的管理接口。在WordPress 4.7.0版本中,存在着一个越权漏洞,成功的利用这个漏洞,可以绕过管理员权限查看wordpress上所有发布过文章的用户信息列表。
漏洞所在url:https://xxxx.com/wp-json/wp/v2/users/
老古也是一头雾水,点开一看,果然这个 WordPress 内置的接口把网站上的所有作者的登录信息都罗列出来了,不得不感概一下,现在老警叔叔这么负责,专业技能也这么强了,这个都懂,并且还提醒站长修复漏洞。
最后修复漏洞的工作自然而然就落到了我的头上了,我这里总结一下有三种修复的方法:
一、直接屏蔽 REST API
客户是不使用古腾堡编辑器的,而他的 APP 使用的接口又是我自己写的,所以我就直接大手一挥帮他把所有的 REST API 都屏蔽了:
add_filter('rest_authentication_errors', fn($access)=> new WP_Error('rest_cannot_acess', 'REST API不再提供访问', ['status' => 403]));
二、屏蔽用户接口
如果不想屏蔽所有接口,也可以只屏蔽相关的用户接口:
add_filter('rest_endpoints', function($endpoints){if(isset($endpoints['/wp/v2/users'])){unset($endpoints['/wp/v2/users']);}if(isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])){unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);}return $endpoints;});
三、移除用户接口里面的登录名
继续缩小一点范围,我们还可以用以下代码加入functions.php文件从而达到不屏蔽用户接口,只移除用户接口里面的登录名,这样用户登录名就没有暴露了。
add_filter('rest_prepare_user', function($response){
unset($response->data['slug']);
return $response;
});
四、设置禁止访问权限
1、禁止访问/wp-json/wp/v2/users/,如果是宝塔的话,可以在网站配置或者伪静态中设置,如下代码。
location ~ ^/wp-json/wp/v2/users {
deny all;
}
2、禁止访问 /wp-includes/wlwmanifest.xml 和上面一样。代码如下:
location ~ ^/wp-includes/wlwmanifest.xml {
deny all;
}
完成以上两部。这时候访问上述网页,就会被屏蔽结果。如上图。
如果你是宝塔而且安装了专业版防火墙,还可以这样设置,在禁止访问的url中添加以下规则:
至此,就完美的解决了今天的问题!