本文约 2,915 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
某天你打开邮箱,发现 WordPress 或安全插件发来几十封「登录失败」提醒,服务器访问日志里满屏都是同一个或几个 IP 在疯狂 POST wp-login.php,这就是后台正在被暴力破解。攻击者不靠漏洞,而是用脚本拿常见用户名(admin、你的邮箱)配上成千上万个弱密码逐一尝试,只要命中一个就拿到后台,进而上传木马、插入广告、篡改首页。很多站长觉得「密码我设复杂点就行了」,但单纯靠密码强度并不够:只要登录接口敞开、没有尝试次数限制,脚本可以 7×24 小时不停地试。本文从攻击原理讲到可落地的加固组合拳,包括限制登录次数、封 IP、改登录地址和两步验证,让你的后台从「谁都能敲」变成「几乎无法爆破」。
故障原因分析
- 默认用户名 + 弱密码。攻击者最爱试
admin、administrator这类默认账号,再配上123456、admin888、网站域名+年份这类常见口令,命中率并不低。
- 登录接口地址固定且公开。
wp-login.php是 WordPress 雷打不动的登录入口,任何扫描器都知道往这里打,等于把门牌号写在门口。
- 没有失败次数限制。默认情况下 WordPress 允许无限次尝试,脚本每秒可以提交几十次请求,理论上总能试出来。
- XML-RPC 被当成放大器。
xmlrpc.php的system.multicall方法可以在一次请求里打包几百次登录尝试,绕过普通的“每 IP 每分钟一次”的限速。
- 缺乏 IP 层拦截。没有防火墙、没有 fail2ban、没有 CDN 时,攻击流量直接怼到 PHP,服务器一边被刷一边扛负载,CPU 飙高甚至拖垮站点。
分步解决方案
方法一:先把账号和密码这道基础关做扎实
不要使用 admin 这类默认用户名,改成与站点无关的别名;密码用 16 位以上、大小写字母加数字加符号的随机串,并用密码管理器保存。这一步看似老生常谈,却能挡掉绝大多数「字典式」爆破,是后面所有加固的前提。
方法二:用插件限制登录尝试次数
安装 Limit Login Attempts Reloaded(免费、轻量):设置同一 IP 连续失败 4 次锁定 20 分钟,锁定次数递增。或使用 Wordfence 的「Login Security」,可以按 IP 统计失败次数并自动封禁。两款插件都真实存在,选一个即可,不要叠加多个同类插件以免互相打架。
方法三:开启两步验证(2FA)
即便密码泄露,两步验证也能再挡一层。推荐插件:Wordfence 内置 2FA,或 Google Authenticator 类插件(如 Two Factor Authentication)。开启后登录需要额外输入手机 App 里的 6 位动态码,攻击者拿到密码也进不来。
方法四:用 .htaccess 给 wp-login.php 加 IP 白名单
只允许你自己的固定 IP 访问登录页,其余一律拒绝。在网站根目录 .htaccess 中加入:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 1.2.3.4
Allow from 5.6.7.8
</Files>
把 1.2.3.4、5.6.7.8 换成你自己的出口 IP。注意:如果家里是动态 IP,此方法会把自己也挡在外面,建议先用固定 IP(公司、云主机跳板)再启用。
方法五:用 fail2ban 在服务器层自动封 IP
如果你用的是 VPS,fail2ban 能读取日志并自动把恶意 IP 拉黑。以宝塔环境为例,创建 /etc/fail2ban/jail.d/wordpress.conf:
[wordpress]
enabled = true
filter = wordpress
logpath = /www/wwwlogs/yoursite.com.log
maxretry = 5
findtime = 600
bantime = 86400
再在 /etc/fail2ban/filter.d/wordpress.conf 里定义匹配 wp-login.php 失败请求的规则,然后 systemctl restart fail2ban 生效。被封 IP 默认禁 1 天。
方法六:改掉默认登录地址 + 关闭 XML-RPC
用 WPS Hide Login 或「隐藏登录」类插件,把登录地址从 wp-login.php 改成自定义路径(例如 /my-secret-gate),脚本再扫默认地址就直接 404。同时在主题 functions.php 里关闭 XML-RPC:
// 关闭 XML-RPC,防止 system.multicall 放大爆破
add_filter( 'xmlrpc_enabled', '__return_false' );
具体关闭方式可参考站内《关闭 XML-RPC 防止被滥用攻击》一文。
方法七:用 CDN/WAF 挡在最前面
把域名接入 Cloudflare 或宝塔 WAF,开启「托管规则」和「速率限制」,把 wp-login.php 的请求频率限制在合理范围。流量在到达服务器之前就被过滤,PHP 层压力骤减,服务器也安全得多。
常见踩坑点
- 只改密码不封 IP。密码再强,攻击流量照样把服务器 CPU 打满,限速和封禁必须一起做。
- IP 白名单把自己锁在门外。用动态 IP 时套用
.htaccess白名单,回家一登录就发现进不去,记得先确认自己的 IP 是否固定。
- 多个限速插件同时装。Limit Login Attempts、Wordfence、iThemes Security 一起上会互相干扰,甚至正常登录也被判为攻击,留一个主力即可。
- 改了登录地址却忘了改书签和客户端。改完后旧地址 404,部分站长以为站点坏了,其实登录入口已经搬家。
- fail2ban 没配日志路径。日志路径写错或站点日志没开,fail2ban 抓不到记录,等于装了不生效,记得
fail2ban-client status wordpress验证。
- 忽略 XML-RPC 这条捷径。只封
wp-login.php却留着xmlrpc.php,攻击者照样能通过它爆破,两个口子都要堵。
总结
WordPress 后台被暴力破解,说到底是「固定的门 + 无限的尝试」给了脚本可乘之机。加固的核心思路是三层叠加:账号密码层面用强密码和两步验证,应用层面用 Limit Login Attempts Reloaded 或 Wordfence 限制次数并修改登录地址、关闭 XML-RPC,服务器层面用 fail2ban 或 Cloudflare 自动封脏 IP。任何单一手段都不完美,但组合起来足以让脚本无功而返。把这套 WordPress 暴力破解防护做完,再定期看两眼登录日志,后台就基本能高枕无忧了。
