wordpress 用户名枚举漏洞 (CVE-2017-5487)
wordpress 用户名枚举漏洞 (CVE-2017-5487)

最近部分使用 wordpresss 的站长接到网警通知,说网站存在 wordpress 用户名枚举漏洞 (CVE-2017—5487),就是访问 https://你网站的域名/wp-json/wp/v2/users/会出现用户名,举例,某网站显示情况如下:

[{"id":1,"name":"\u543e\u7231\u5df4\u4e2d","url":"","description":"","link":"https:\/\/网站域名\/post\/author\/用户名","slug":"用户名","avatar_urls":{"24":"https:\/\/cravatar.cn\/avatar\/db87ae783223a96944de7dda0c43a3a0?s=24&d=monsterid&r=g","48":"https:\/\/cravatar.cn\/avatar\/db87ae783223a96944de7dda0c43a3a0?s=48&d=monsterid&r=g","96":"https:\/\/cravatar.cn\/avatar\/db87ae783223a96944de7dda0c43a3a0?s=96&d=monsterid&r=g"},"meta":[],"_links":{"self":[{"href":"https:\/\/网站域名\/wp-json\/wp\/v2\/users\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/网站域名\/wp-json\/wp\/v2\/users"}]}}],

实话吧,这玩意漏洞个人认为是低微,获取了后台的用户名又咋呀,你去把密码枚举出来啊,鉴于中国很多后台弱口令的现状,提醒一下还是必要的,搞得很多个人网站战战兢兢的,那么如何解决这个漏洞呢?

一、跳转法

这种方法,就是开个大玩笑,一旦有人访问这个网站地址 :https://你网站的域名/wp-json/wp/v2/users/,直接 301 跳转到另一个网站,哈哈,有人直接跳转到 www.gov.cn, 吓死访问者。如何 301 跳转,方法很多,以 WPJAM Basic 扩展为例,详细方法访问:https://mp.weixin.qq.com/s/e9jU49ASszsY95TrmT34TA

二、防火墙禁止法

打开你的网站访问墙。添加规则,禁止访问:https://你网站的域名/wp-json/wp/v2/users/

例如,阿里云 WEB 防火墙,添加这样的规则,根据自身防火墙摸索哈。

防火墙禁止法
防火墙禁止法

三、修改代码法

方法一:屏蔽 REST API,这种方法要慎重,比如你使用古腾堡编辑器、或者使用小程序的话就会报错。通过添加过滤器 rest_authentication_errors,可以停止提供 REST API 的服务。在 wp-config.php 添加如下代码:

add_filter('rest_authentication_errors', function ($access) { return new wp_error('rest_cannot_access', 'REST API 不再提供访问', ['status' => 403]); });

方法二:如果决定保留 REST API,但又要防止用户信息泄露,可以屏蔽特定的用户接口。

在 functions.php 文件中添加以下代码可以防止 /wp/v2/users 和 /wp/v2/users/(pid) 接口被调用:

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;
});

或者在 wp-config.php 添加如下代码:

add_filter('rest_authentication_errors', function($access) {
    // 确保在调用 header() 函数之前没有输出任何内容
    header("Content-Type: application/json; charset=utf-8");
    return new WP_Error('rest_cannot_access', 'XX 网站安全中心提示:禁止访问!', ['status' => 403]);
});

方法三:还有一种折中的办法,修改 rest_prepare_user 过滤器,从用户信息的返回中移除 slug 字段,这样即使 API 被访问,用户名也不会暴露。

add_filter('rest_prepare_user', function ($response) { unset($response->data['slug']); return $response; });

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注