去年帮一个朋友看网站,发现一个很诡异的现象。
他的服务器 CPU 使用率长期在 60% 以上,但他那台服务器上只挂了一个 WordPress 博客,每天的访问量不到 200。一个日访问量 200 的博客,能把 1 核 2G 的服务器跑到 60%——这明显不正常。
打开 Nginx 访问日志,搜了一下 /wp-login.php,日志刷了整整三屏。每一秒都有来自不同 IP 的 POST 请求,在尝试用户名和密码组合。admin/123456、admin/admin、admin/password……几千个请求像潮水一样涌过来,24 小时不停。
这个博客,被暴力破解了三个月。 后台密码是 admin123,对方没猜出来,但每次尝试都在消耗服务器资源。三个月,几百万次尝试,服务器一直在满负荷运转。他浑然不知,只是觉得”网站最近有点慢”。
这件事让我意识到一个之前没想过的问题:你不需要被黑,才需要做安全加固。 即使攻击者没成功,他们的尝试本身,就在拖垮你的网站。
案例一:/wp-admin 被人群发试探密码
真实情况: 就是我上面说的那个朋友。攻击脚本全天候扫描 /wp-login.php,三个月,几百万次请求。密码没被猜出来,但服务器资源被耗光了,正常访客打开页面要等 5 秒以上。
为什么会这样: WordPress 的默认登录地址是 /wp-login.php 或 /wp-admin。这就像你家大门装在整栋楼最显眼的位置,门牌号全互联网都知道。攻击脚本不需要知道你的域名,它只需要在互联网上地毯式扫描所有 WordPress 站点,找到 /wp-login.php,就开始用常用密码字典暴力破解。
怎么修: 改掉默认登录地址。把 /wp-login.php 改成只有你自己知道的一个自定义路径,比如 /housekeeping 或者一个随机字符串。
装一个叫 WPS Hide Login 的插件,免费,装完在设置里填一个自定义路径,保存。之后你的后台登录地址就是 你的域名/你的自定义路径,原来的 /wp-login.php 和 /wp-admin 直接返回 404。
效果: 改了之后,攻击脚本的字典里没有这个路径,扫不到。暴力破解的请求量直接从每天几万次降到零。不是减少,是清零。
一个细节一定要注意: 把自定义路径记下来,存到密码管理器里。别存在浏览器书签里——如果哪天你换了电脑,而你忘了后台地址,自己都进不去了。我见过一个人改了登录地址,两周后自己忘了,最后只能进数据库改回来。
案例二:插件漏洞被人利用,整站文件被篡改
真实情况: 一个客户的 WordPress 网站,用的是某个冷门页面构建器插件。插件作者两年没更新了,里面有一个文件上传漏洞,攻击者可以通过这个漏洞上传 PHP 后门文件到服务器上。后门上传之后,攻击者拿到了整站的文件修改权限,在 functions.php 里注入了一段恶意代码——所有访问网站的用户都会被重定向到一个违规广告网站。
客户发现的时候,网站已经被黑了三天。百度搜索结果里他的网站标题已经变成了”XX优惠大放送”——这是 SEO Spam 的典型手法,攻击者通过你的网站给灰产关键词做排名。
为什么会这样: 插件和主题的代码也是代码,代码就会有漏洞。插件作者可能弃坑了,漏洞没修;也可能作者还在维护,但还没来得及发现和修复。你装了这个插件,等于把大门的钥匙交给了插件作者——他那边门没锁好,你这边就跟着遭殃。
怎么修:
第一,定期清理插件和主题。WordPress 后台 → 插件 → 已安装插件,看看有没有”超过两年未更新”的插件。如果有,卸载掉,找替代品。主题同理。
第二,不要装来源不明的插件。WordPress 官方插件库里的插件,至少经过基本的代码审查。第三方网站下载的”破解版”、”汉化版”插件,里面可能夹带了后门。你以为是省钱,其实是给攻击者开门。
第三,装一个安全扫描插件。Wordfence Security 免费版就行,它能自动扫描插件和主题的已知漏洞,发现有问题会邮件通知你。不是装完就不管了,是它帮你盯着,你只需要在收到邮件时处理。
一个容易忽略的角落: 不只是插件,你用的主题也可能有漏洞。尤其是从盗版主题站下载的”免费付费主题”,里面经常夹带恶意代码。买正版或者用 WordPress 官方免费主题,这是最基本的底线。
案例三:wp-config.php 权限是 777,谁都能读
真实情况: 一个技术论坛上看到的求助帖。发帖人的网站数据库密码泄露了,攻击者通过数据库密码直接登录了数据库,把 wp_users 表里的管理员邮箱改成了自己的,然后通过”忘记密码”重置了管理员密码,把原管理员踢出了网站。
排查了半天,发现是 wp-config.php 文件的权限设成了 777。777 是什么意思?所有人都能读、能写、能执行这个文件。服务器上任何一个用户,甚至通过其他漏洞进来的攻击者,都能打开这个文件,看到里面的数据库密码。
为什么会这样: 很多新手建站时,按照网上的教程,遇到权限问题就 chmod 777。这个命令确实能解决权限问题,但它解决的方式是”把门拆了”。正确的做法是给最少的权限,刚好够用就行。
怎么修:
WordPress 文件权限标准:
| 文件/目录 | 正确权限 | 含义 |
|---|---|---|
| 所有 PHP 文件 | 644 | 所有者可读写,其他人只读 |
wp-config.php | 400 或 440 | 所有者只读,或所有者和组只读 |
| 所有目录 | 755 | 所有者可读写执行,其他人只读执行 |
wp-content/uploads/ | 755 | 同上,但需要 Web 服务器有写入权限 |
登录服务器,SSH 执行以下命令:
# 所有文件设为 644
find /www/wwwroot/你的网站目录 -type f -exec chmod 644 {} \;
# 所有目录设为 755
find /www/wwwroot/你的网站目录 -type d -exec chmod 755 {} \;
# wp-config.php 单独设为 400
chmod 400 /www/wwwroot/你的网站目录/wp-config.php
一个坑: 改完 wp-config.php 的权限之后,如果你用宝塔面板的文件管理编辑这个文件,可能会提示”权限不足”。这是正常的,400 权限意味着连你自己都不能随意修改——这正是安全的目的。需要改的时候,临时把权限改成 644,改完再改回 400。
案例四:数据库表前缀没改,SQL 注入一击即中
真实情况: 一个外贸网站,用的 WordPress 默认数据库表前缀 wp_。攻击者通过一个旧插件的 SQL 注入漏洞,直接读取了 wp_users 表的所有用户数据——用户名、密码哈希、邮箱。管理员的密码哈希被离线破解(因为密码太简单,123456789),攻击者拿到了完整的管理员权限。
为什么会这样: WordPress 安装时默认表前缀是 wp_。大部分人不改,所以全世界绝大部分 WordPress 网站的表名都是 wp_posts、wp_users、wp_options。攻击者写 SQL 注入脚本的时候,直接写 SELECT * FROM wp_users 就能命中绝大部分目标。如果你把表前缀改成了 wp_ab3f7_,攻击者脚本里的 wp_users 就不存在,注入攻击就失败了。
怎么修:
如果你还没建站,装 WordPress 的时候,安装界面有一个”表前缀”选项,把 wp_ 改成自定义的,比如 wp_随机字符_。
如果你已经建站了,改表前缀比较麻烦,需要手动改数据库和 wp-config.php。可以用 Change Table Prefix 这个插件来改,但操作之前一定先备份数据库。改表前缀的 SQL 操作不可逆,出错了数据就乱套了。
值不值得改: 已经建站的,说实话,改表前缀的性价比不高。操作复杂,风险大,而且很多攻击者现在会先探测表前缀再注入。但如果你还没建站,装 WordPress 的时候顺手改一下,花 10 秒,给攻击者多一道门槛。
案例五:网站被挂广告,排查发现是管理员账号被挤进去了
真实情况: 一个博客网站,首页突然多了一篇”低价XX批发”的广告文章。博主登录后台,发现这篇文章确实是”他自己”发的——作者是他的管理员账号。但他根本没写过这篇文章。
查登录日志,发现一个陌生 IP 通过他的管理员账号,在凌晨 3 点登录了后台,发了那篇广告文章,然后退出了。全程不超过 5 分钟。
密码是 wang123456。他的姓 + 123456。攻击者不需要暴力破解,试了三次就猜出来了。
为什么会这样: 弱密码是 WordPress 网站被黑的最常见原因,没有之一。Wordfence 的统计数据显示,超过 80% 的 WordPress 入侵事件,攻击者是通过弱密码或已泄露的密码获得访问权限的。
怎么修:
第一,立刻修改所有管理员账号的密码,至少 16 位,大小写字母 + 数字 + 特殊符号混排。推荐用密码管理器(Bitwarden 免费好用)生成随机密码。关于密码安全更详细的策略,之前写过一篇个人站长最容易忽略的 5 个安全隐患,里面把密码管理、权限分配、登录防护都展开讲了,和这篇一起看效果更好。
第二,检查后台用户列表。有没有不认识的账号?有没有”订阅者”账号权限被提升到了”管理员”?发现可疑账号,立即删除。
第三,开启双重验证。Wordfence 免费版自带这个功能——登录时除了密码,还需要输入一个手机 App 上显示的 6 位动态码。即使密码泄露了,没有这个动态码,攻击者还是登不进来。不要觉得双重验证麻烦——每次登录多花 10 秒,但密码泄露时,这 10 秒能救你的网站。
第四,限制登录尝试次数。装一个 Limit Login Attempts Reloaded 插件,设置同一个 IP 在 5 分钟内最多尝试 3 次密码,超过就锁 IP。暴力破解的脚本是自动化的,被锁了就会转向下一个目标。
一份可以直接执行的安全加固清单
上面五个案例,每个都对应一个安全加固动作。以下是一份优先级排序:
| 优先级 | 加固项 | 操作 | 耗时 | 效果 |
|---|---|---|---|---|
| 最高 | 修改弱密码 | 后台 → 用户 → 编辑 → 生成强密码 | 2 分钟 | 挡住 80% 的攻击 |
| 最高 | 限制登录尝试 | 装 Limit Login Attempts 插件 | 3 分钟 | 暴力破解从此失效 |
| 高 | 修改默认登录地址 | 装 WPS Hide Login 插件 | 2 分钟 | 攻击脚本扫不到后台 |
| 高 | 开启双重验证 | Wordfence → 登录安全 → 启用 | 5 分钟 | 密码泄露也不怕 |
| 高 | 安装安全扫描 | 装 Wordfence Security | 5 分钟 | 自动发现漏洞 |
| 中 | 清理废弃插件 | 后台 → 插件 → 删除未使用的 | 5 分钟 | 减少攻击面 |
| 中 | 文件权限修正 | SSH 执行三条命令 | 3 分钟 | 防止源码泄露 |
| 低 | 修改数据库表前缀 | 装 Change Table Prefix(先备份) | 10 分钟 | 多一道门槛 |
全部做完,不到半小时。这半小时,可能帮你省下三个月后网站被黑、通宵排查、数据丢失的痛苦。安全加固做完了,但如果已经出事了——网站已经被黑了,或者被挂了恶意代码——那需要另一套流程。之前写过一篇网站被黑后从排查到修复的完整自救指南,六步流程,从判断入侵程度到恢复搜索引擎信任,全都有。一篇是防,一篇是治,建议都存下来。
首发于 wujianzhan.com,一个分享建站与 SEO 实战的博客。
