近期陆续有几个客户反馈收到网安关于WordPress用户枚举漏洞的通报,涉及的地址为:/wp-json/wp/v2/users,经核实这是WordPress内置的REST API接口,这个接口默认情况下可以暴露网站上所有用户的信息,包括用户名、ID等。如果没有正确配置或限制访问,攻击者可以通过此接口枚举出所有网站的用户,从而为进一步的攻击做准备。 WordPress用户枚举漏洞

漏洞分析及影响

  1. 漏洞说明
    • WordPress的REST API允许通过wp-json/wp/v2/users接口列出网站的所有用户(如果没有权限限制)。
    • 攻击者只需通过简单的GET请求就能查看到网站上所有用户的详细信息,包括用户名等敏感数据。
  2. 影响
    • 信息泄露:攻击者能够枚举出所有用户名,暴露网站上的用户列表。
    • 暴力破解攻击:知道用户名后,攻击者可以进一步尝试使用暴力破解方法猜测密码,尤其是如果用户的密码弱或使用默认密码的情况下。
    • 社交工程:攻击者可以利用获取的用户信息进行社交工程攻击,伪装成某个用户进行诈骗或钓鱼攻击。

修复措施

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文件或者其他封装的插件里面。