近期陆续有几个客户反馈收到网安关于WordPress用户枚举漏洞的通报,涉及的地址为:/wp-json/wp/v2/users
,经核实这是WordPress内置的REST API接口,这个接口默认情况下可以暴露网站上所有用户的信息,包括用户名、ID等。如果没有正确配置或限制访问,攻击者可以通过此接口枚举出所有网站的用户,从而为进一步的攻击做准备。
漏洞分析及影响
- 漏洞说明:
- WordPress的REST API允许通过
wp-json/wp/v2/users
接口列出网站的所有用户(如果没有权限限制)。 - 攻击者只需通过简单的GET请求就能查看到网站上所有用户的详细信息,包括用户名等敏感数据。
- WordPress的REST API允许通过
- 影响:
- 信息泄露:攻击者能够枚举出所有用户名,暴露网站上的用户列表。
- 暴力破解攻击:知道用户名后,攻击者可以进一步尝试使用暴力破解方法猜测密码,尤其是如果用户的密码弱或使用默认密码的情况下。
- 社交工程:攻击者可以利用获取的用户信息进行社交工程攻击,伪装成某个用户进行诈骗或钓鱼攻击。
修复措施
1、服务器直接禁止对应地址的访问
此方法比较简单直接,禁止对应链接地址的访问以后可以直接解决此问题,不过可能会影响到后台部分涉及到此接口访问的功能。
步骤:
- 找到你网站的 NGINX 配置文件,宝塔面板的话则是后台
网站-设置-配置文件
里面。 - 在适当的位置(通常是在
server
块中)添加以下配置代码:
server {
# 你的其他配置
...
# 禁止访问 /wp/v2/users 和 /wp/v2/users/{id}
location ~ ^/wp-json/wp/v2/users(/.*)?$ {
deny all;
return 403; # 返回 403 Forbidden
}
# 你的其他配置
...
}
- 重载 NGINX 配置
2、(推荐)基于WordPress内置filter移除接口,同时保留高权限用户的接口正常使用
此方式可以自动判断当前用户权限,由于rest api接口可能在后台发布文章的时候使用到,所以可以针对编辑权限开放此接口的访问,其他访问默认移除此接口,代码如下:
/**
* 禁用 WordPress 用户枚举接口,只有具有编辑权限(editor)及以上权限的用户才可访问。
*
* @author WPCOM
* @version 1.0.0
* @since 2024-12-26
*/
add_filter('rest_endpoints', function ($endpoints) {
global $has_users_endpoint;
if($has_users_endpoint) return $endpoints;
if(isset($endpoints['/wp/v2/users'])){
$users_endpoint = $endpoints['/wp/v2/users'];
unset($endpoints['/wp/v2/users']);
}
// 编辑及以上权限可展示用户列表
if (defined('REST_REQUEST') && REST_REQUEST && current_user_can('editor')) {
// 恢复 /wp/v2/users 端点
if(isset($users_endpoint)) $endpoints['/wp/v2/users'] = $users_endpoint;
$has_users_endpoint = true;
}
return $endpoints;
});
以上代码可以添加到主题的functions.php
文件或者其他封装的插件里面。