搜索全站
安全防护 13 分钟阅读

WordPress 月度安全巡检清单:账号、插件、文件、备份逐项检查

安全不是配一次就完事。本文给出一份可执行的 WordPress 月度巡检清单:账号审计、插件更新、文件完整性校验、后门扫描、备份验证,每项都附具体命令和判断标准。

U
UFO_PF 2026-09-26 · 阅读 13 分钟
Wo 安全防护
阅读提示
本文约 5,123 字,预计阅读 13 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:出事之后才想起检查

WordPress 站点被黑的典型路径:

  1. 某个插件有漏洞,站长半年没更新;
  2. 攻击者利用漏洞上传后门文件;
  3. 后门长期驻留,被用于发垃圾邮件、跳转、挖矿;
  4. 直到百度/Google 标记”危险网站”、服务器被机房封停才被发现。

问题不在于防护不够,在于没有定期检查。 攻击往往是”得手后长期潜伏”,月度巡检的目标就是在潜伏期发现它。

这份清单分成五大块,一次执行 30–60 分钟。

原理分析:被黑之后会留下什么痕迹

攻击者得手后,通常要做三件事,每一件都会留下痕迹:

  1. 留后门:在 wp-content/uploads/(可写目录)、wp-includes/(隐蔽)放 PHP 文件;或往主题的 functions.php、header.php 注入代码;或创建隐藏管理员账号。
  2. 改配置:修改 .htaccess 做跳转、改 wp-config.php 加恶意常量、在数据库 wp_options 里插入恶意 JS(常见于 siteurl、home 或某个主题选项)。
  3. 持续驻留:注册恶意 wp-cron 定时任务、修改 wp_users 表、利用 xmlrpc.php。

所以巡检的逻辑就是逐一排查这三类痕迹。

保姆级实操:月度巡检清单

第一块:账号审计(5 分钟)

# 列出所有管理员账号
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered,last_login --allow-root

判断标准:

  • 有没有不认识的管理员?立刻删除;
  • 有没有 admin、test、demo 之类的默认账号?改名或删除;
  • user_registered 时间是否可疑(比如半年前某天批量注册);
  • 邮箱是不是你的。

清理:

# 删除可疑用户并把他的文章归属给 ID=1
wp user delete 可疑ID --reassign=1 --allow-root

同时检查有没有隐藏的”未显示在后台”的管理员(有些后门会这么做):

SELECT u.ID, u.user_login, u.user_email, um.meta_value AS caps
FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = 'wp_capabilities'
  AND um.meta_value LIKE '%administrator%';

第二块:核心、插件、主题更新(10 分钟)

wp core check-update --allow-root
wp plugin list --update_available=available --allow-root
wp theme  list --update_available=available --allow-root

更新原则:

  • 安全更新立刻更;
  • 大版本更新(如 6.4 → 6.5)先在 Staging 环境测;
  • 更新前备份;
  • 已停止维护的插件(Last updated: 3 years ago)直接换掉,这是最大的风险源。
# 批量更新插件(谨慎,建议逐个更新观察)
wp plugin update --all --allow-root

卸载不用的插件和主题(不用的插件即使停用也有漏洞风险):

wp plugin list --status=inactive --allow-root
wp plugin delete 插件slug --allow-root

第三块:文件完整性校验(10 分钟)

# 校验 WordPress 核心文件是否被篡改
wp core verify-checksums --allow-root

输出 Success: WordPress installation verifies against checksums. 即正常。有改动会列出具体文件。

注意:这个只校验 wp-admin 和 wp-includes,不校验 wp-content(主题/插件/uploads)。

检查 uploads 目录里有没有 PHP 文件(正常情况下 uploads 里不应该有 .php):

find /var/www/mimangfei/wp-content/uploads -name "*.php" -o -name "*.phtml" -o -name "*.php5" | head -20

这是最高效的后门排查命令。uploads 是唯一必须可写的目录,90% 的上传类后门都在这。

检查最近修改的可疑文件:

find /var/www/mimangfei -name "*.php" -mtime -30 -type f | \
  grep -v "/wp-content/upgrades/" | head -30

扫描特征字符串:

grep -rn --include="*.php" -E "(base64_decode|eval\(|assert\(|system\(|passthru\(|shell_exec\(|\\x[0-9a-f]{2})" \
  /var/www/mimangfei/wp-content/ 2>/dev/null | grep -v "wp-content/plugins/" | head -20

注意误报:很多正常插件也会用 base64_decode。重点看 uploads 和 themes 目录下的。

第四块:配置与数据库检查(10 分钟)

检查 .htaccess 有没有异常跳转:

cat /var/www/mimangfei/.htaccess

正常的 WordPress 规则应该只有 BEGIN WordPress 到 END WordPress 之间的固定内容。看到陌生的 RewriteRule 到不明域名,就是被挂了跳转。

检查 wp-config.php:

grep -vE "^\s*(//|/\*|\*)" /var/www/mimangfei/wp-config.php | grep -iE "eval|base64|http"

检查数据库里有没有注入的 JS:

SELECT option_id, option_name, LEFT(option_value, 200)
FROM wp_options
WHERE option_value LIKE '%<script%'
   OR option_value LIKE '%javascript:%'
   OR option_value LIKE '%onload=%';

检查定时任务(后门常驻手段):

wp cron event list --allow-root

看有没有不认识的 hook 名。

检查文件权限:

# 目录 755,文件 644
find /var/www/mimangfei -type d -perm 777 | head
find /var/www/mimangfei -type f -perm 777 | head

出现 777 权限就是风险点。

第五块:备份验证(15 分钟)

备份存在 ≠ 备份可用。每月必做一次恢复验证:

# 检查备份文件是否存在、大小是否合理
ls -lh /backup/mimangfei/ | tail -10

# 数据库备份能否正常导入(导入到临时库验证)
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS restore_test;"
mysql -u root -p restore_test < /backup/mimangfei/db-latest.sql
mysql -u root -p -e "SELECT COUNT(*) FROM restore_test.wp_posts;"
mysql -u root -p -e "DROP DATABASE restore_test;"

异地备份是否存在:确认备份有一份不在同一台服务器上。

第六块:外部状态检查(5 分钟)

# 检查是否被搜索引擎标记
curl -s "https://www.google.com/safebrowsing/diagnostic?site=mimangfei.com" | head -50

# 检查 SSL 证书有效期
echo | openssl s_client -connect mimangfei.com:443 -servername mimangfei.com 2>/dev/null | \
  openssl x509 -noout -dates

登录百度站长平台、Google Search Console 看有没有”安全问题”提醒。

常见踩坑

  1. 只查不改:巡检发现可疑文件后只删文件,不找入侵入口。结果一周后又被挂上。必须同时:改所有密码、更新全部插件主题、查访问日志找入侵时间点。
  2. verify-checksums 通过就以为安全:它不校验 wp-content。主题和插件才是重灾区。
  3. 案例:某站被黑后站长删了后门文件,一个月后又被挂。查访问日志发现攻击者是通过一个已停用但未删除的插件漏洞进来的。教训:不用的插件必须删除,不是停用。
  4. 误删正常文件:base64_decode 搜索会有大量误报。确认前先 Google 文件名,或者用 Wordfence 的扫描功能交叉验证。
  5. 删了后门但站点还在发垃圾邮件:检查 wp-cron 定时任务和数据库里的 cron 选项。
  6. 备份验证走过场:只看了文件存在,没实际导入。真正的验证是完整恢复到一台测试机并访问成功。
  7. 权限检查只查 777:更重要的是属主。文件属主是 root 而 PHP 用 www-data 运行,会导致无法更新;属主错了参考WordPress 文件权限与属主设置。

总结

把这份清单固化成每月固定动作,最好写成脚本自动跑并邮件通知:

# /usr/local/bin/wp-audit.sh
#!/bin/bash
SITE=/var/www/mimangfei
{
  echo "=== $(date) ==="
  echo "--- 核心校验 ---"
  wp --path=$SITE core verify-checksums --allow-root 2>&1
  echo "--- uploads 里的 PHP 文件 ---"
  find $SITE/wp-content/uploads -name "*.php" 2>/dev/null
  echo "--- 管理员列表 ---"
  wp --path=$SITE user list --role=administrator --fields=user_login,user_email --allow-root
  echo "--- 待更新插件 ---"
  wp --path=$SITE plugin list --update_available=available --allow-root
} | mail -s "WordPress 安全巡检" admin@mimangfei.com

加到 cron:

0 9 1 * * /usr/local/bin/wp-audit.sh

安全是一个过程不是一次配置。配合 用 Fail2ban 防护 WordPress 暴力破解、限制 wp-admin 访问的 IP 白名单、核心文件完整性校验方法,才能形成完整的防护闭环。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。