一、漏洞背景:你的用户名正在被”偷窥”吗?
近期大量WordPress站点曝出用户名枚举漏洞,攻击者可通过以下途径获取用户信息:
- 默认REST API接口:
/wp-json/wp/v2/users
- 登录页错误提示差异(”无效用户名”与”密码错误”)
- 作者归档页路径:
/?author=1
这些漏洞会导致攻击者批量获取管理员用户名,进而发起定向暴力破解攻击。根据Sucuri安全报告,超过60%的WordPress攻击始于用户名枚举。
二、核心修复方案(3选1)
▶ 方案1:禁用REST API用户接口(推荐)
适用场景:不需要开放用户列表的站点
操作步骤:
- 进入WordPress后台 → 外观 → 主题编辑器
- 打开当前主题的
functions.php
文件 - 在文件末尾添加以下代码:
// 禁用REST API用户接口
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-json/wp/v2/users
应返回rest_no_route
错误
▶ 方案2:Nginx服务器拦截(适合技术用户)
适用场景:使用Nginx服务器且需要保留其他REST功能
操作步骤:
- 通过SSH登录服务器
- 编辑站点配置文件(通常位于
/etc/nginx/sites-available/
) - 在
server {}
块内添加:
# 拦截用户枚举请求
location ~* ^/wp-json/wp/v2/users {
deny all;
return 403;
}
- 执行命令重载配置:
sudo nginx -s reload
▶ 方案3:隐藏敏感字段(折中方案)
适用场景:必须保留用户接口但需隐藏登录名
操作步骤:
- 在
functions.php
中添加:
// 移除REST响应中的登录名
add_filter('rest_prepare_user', function($response){
if(isset($response->data['slug'])){
unset($response->data['slug']); // slug字段即登录用户名
}
return $response;
});
注意事项:需配合其他防护措施使用
三、强化防护措施
1. 统一登录错误提示
在functions.php
中添加:
// 统一登录错误提示
add_filter('login_errors', function($error){
return '用户名或密码错误';
});
2. 启用验证码防护
推荐安装插件:
- Google Captcha (reCAPTCHA)
- Wordfence Security
- iThemes Security
3. 关闭作者归档页
在functions.php
中添加:
// 禁用作者归档页
add_action('template_redirect', function(){
if(is_author()){
wp_redirect(home_url());
exit;
}
});
四、漏洞验证工具
修复后使用以下工具测试:
- WPScan:
wpscan --url 你的域名 -e u
- Burp Suite:检查
/wp-json/wp/v2/users
响应 - 手动测试:尝试访问
/?author=1
是否跳转
五、长期防护建议
- 定期更新WordPress核心和插件
- 使用安全插件(如Sucuri、Wordfence)
- 启用Web应用防火墙(WAF)
- 限制登录尝试次数
- 强制管理员使用强密码
版权声明:本文采用CC BY-NC-SA 4.0协议,转载请注明出处。技术操作有风险,修改前请务必备份网站数据!