如何修复 WordPress 站点 REST API 暴露的用户名枚举漏洞

WordPress 是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统来使用。WordPress 在4.7.0版本之后将 REST API 插件集成到默认功能之中。REST API 为 WordPress 的使用者提供了一个方便快捷的管理接口。

而 WordPress 站点中存在的用户名枚举漏洞也与 WordPress 4.7.0 版本引入的 REST API 功能有关,允许通过 REST API 访问用户信息。在未经授权的情况下,此漏洞允许攻击者通过特定API调用(URL参数,如slug)查看到 WordPress 站点上所有发布过文章的用户信息列表,包括用户名。

漏洞原因

这个漏洞发生在 WordPress 的 REST API 中,特别是在于 https://博客域名.com/wp-json/wp/v2/users/ 路径下的用户接口。通过这个接口,攻击者可以从slug参数上观察到 WordPress 的用户名,如下图。

图片[1]-如何修复 WordPress 站点 REST API 暴露的用户名枚举漏洞-十一张

修复方法

这种漏洞不单单影响用户信息的安全,还可能间接影响其他功能模块,如:

●用户认证和授权:攻击者可能利用枚举到的用户名信息尝试进行未授权的访问或提升权限
●内容管理:知道哪些用户有发布内容的权限,可能允许攻击者伪造用户行为,发布恶意内容
●用户个性化设置:枚举用户名可能暴露用户的配置和偏好,被用于社会工程攻击

为了防止这种漏洞被利用,建议采取以下措施:

1、屏蔽REST API

如果 WordPress 站点不使用 WordPress 的古腾堡编辑器功能,可以考虑完全禁用 REST API。可以通过添加以下代码到主题的 functions.php 文件中来实现:

add_filter('rest_authentication_errors', fn($access)=> new WP_Error('rest_cannot_acess', 'REST API不再提供访问', ['status' => 403]));

2、屏蔽特定用户接口

如果决定保留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;
});

PS:十一张(www.11zhang.com)站长使用的是此方法。

图片[2]-如何修复 WordPress 站点 REST API 暴露的用户名枚举漏洞-十一张
图片[3]-如何修复 WordPress 站点 REST API 暴露的用户名枚举漏洞-十一张

3、移除用户接口中的登录名

另一种方法是不屏蔽用户接口,而是修改用户数据的返回格式。通过添加以下过滤器rest_prepare_user,可以只移除用户资料中的slug(登录名):

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

以上方法都可以有效地修复用户名枚举漏洞,保护 WordPress 站点的安全。

✅来源:十一张
温馨提示:本文最后更新于2025-02-23 01:27:36,某些文章具有时效性,若有错误或已失效,请在文末评论留言
© 版权声明
THE END
如果觉得这篇文章对您有帮助,可以收藏本网址,方便下次访问!
点赞2 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容