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

WordPress 核心文件完整性校验:官方校验和比对方法

怀疑站点文件被改过?WordPress 官方为每个版本发布了文件校验和,一条命令就能查出被篡改的核心文件。本文讲清原理、命令用法、误报处理和无法联网时的离线比对方案。

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

引言:怎么知道文件被动过

站点出现异常(莫名跳转、后台多了账号、页面插入了 JS),第一反应是”是不是被黑了”。但 WordPress 有几千个文件,不可能一个个看。

实际上不需要人工比对——WordPress 官方为每个版本发布了所有核心文件的 MD5 校验和,存在一个公开 API 上。本地算一遍 MD5,和官方比对,哪个文件对不上就一目了然。

这就是 wp core verify-checksums 的原理,也是 WordPress 官方提供的自我体检能力。

原理分析:校验和机制

WordPress.org 提供这个接口:

https://api.wordpress.org/core/checksums/1.0/?version=6.5.2&locale=zh_CN

返回 JSON,包含每个核心文件的 MD5:

{
  "checksums": {
    "wp-admin/about.php": "a1b2c3d4...",
    "wp-admin/admin-ajax.php": "e5f6g7h8...",
    "wp-includes/version.php": "i9j0k1l2...",
    "...": "..."
  }
}

wp core verify-checksums 的流程:

  1. 读取本地 wp-includes/version.php 拿到版本号(如 6.5.2);
  2. 请求 API 拿该版本官方校验和;
  3. 遍历本地 wp-admin 和 wp-includes 下的文件算 MD5;
  4. 对比,输出三种差异:
    – 文件内容不匹配(被篡改);
    – 文件不存在(被删除);
    – 文件不应存在(多出来的可疑文件)。

覆盖范围:只校验 WordPress 核心(wp-admin + wp-includes,外加根目录的部分文件)。不覆盖 wp-content(主题、插件、上传文件),因为那些是第三方开发的,官方没有校验和。这一点必须记住,否则会误以为”校验通过 = 安全”。

保姆级实操

第一步:安装 WP-CLI

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info

第二步:执行校验

cd /var/www/mimangfei
wp core verify-checksums --allow-root

正常输出:

Success: WordPress installation verifies against checksums.

异常输出:

Warning: File doesn't verify against checksum: wp-admin/admin-footer.php
Warning: File doesn't verify against checksum: wp-includes/js/jquery/jquery.js
Warning: File should not exist: wp-includes/evil.php
Error: WordPress installation doesn't verify against checksums.

第三步:处理异常文件

情况 A:文件被篡改——先看差异:

# 下载官方原版到临时目录
wp core download --version=6.5.2 --path=/tmp/wp-clean --skip-content --allow-root
diff /tmp/wp-clean/wp-admin/admin-footer.php /var/www/mimangfei/wp-admin/admin-footer.php

确认是恶意改动后,用干净文件覆盖:

cp /tmp/wp-clean/wp-admin/admin-footer.php /var/www/mimangfei/wp-admin/admin-footer.php

情况 B:文件被删除——从干净副本补回:

cp /tmp/wp-clean/wp-includes/xxx.php /var/www/mimangfei/wp-includes/xxx.php

情况 C:多出来的文件——先确认再删:

head -30 /var/www/mimangfei/wp-includes/evil.php
ls -la /var/www/mimangfei/wp-includes/evil.php    # 看修改时间

核实之前别急着删,有些是汉化包或运维脚本放的。确认是后门则删除,并记录时间戳用于回溯攻击时间。

第四步:校验插件和主题

核心校验不覆盖插件主题。对官方目录的插件/主题,可以下载同版本对比:

mkdir -p /tmp/wpclean
wp plugin install 插件slug --version=1.2.3 --path=/tmp/wpclean --allow-root
diff -rq /tmp/wpclean/wp-content/plugins/插件slug \
         /var/www/mimangfei/wp-content/plugins/插件slug

输出 Only in ... 的行就是多出来的文件,重点看。

也可以用 Wordfence 的 Scan 功能(它会对比官方目录插件原版)。

第五步:离线 / 无法访问 API 时的方案

国内服务器访问 api.wordpress.org 有时慢或不通,命令会卡住或报:

Error: Couldn't fetch checksums from WordPress.org

替代方案 A:手动下载校验和 JSON 后本地比对:

VERSION=$(wp core version --allow-root)
curl -s "https://api.wordpress.org/core/checksums/1.0/?version=${VERSION}&locale=zh_CN" \
  -o /tmp/checksums.json
php -r '
$cs   = json_decode(file_get_contents("/tmp/checksums.json"), true)["checksums"];
$root = "/var/www/mimangfei/";
$bad  = 0;
foreach ($cs as $file => $md5) {
    $path = $root . $file;
    if (!file_exists($path)) { echo "MISSING: $file\n";  $bad++; continue; }
    if (md5_file($path) !== $md5) { echo "MODIFIED: $file\n"; $bad++; }
}
echo $bad === 0 ? "OK: all match\n" : "Total issues: $bad\n";
'

替代方案 B:直接重新下载官方核心覆盖(先备份):

# --skip-content 是关键,否则会动 wp-content
wp core download --force --skip-content --version=6.5.2 --allow-root

第六步:加入定期巡检

# /usr/local/bin/wp-verify.sh
#!/bin/bash
cd /var/www/mimangfei
RESULT=$(wp core verify-checksums --allow-root 2>&1)
if echo "$RESULT" | grep -q "Success"; then
    echo "OK"
else
    echo "$RESULT" | mail -s "警告:WordPress 核心文件校验失败" admin@mimangfei.com
fi
0 6 * * * /usr/local/bin/wp-verify.sh

常见踩坑

  1. 版本识别错误:wp-includes/version.php 里的 $wp_version 被改过,导致请求了错误版本的校验和。先确认:

bash
wp core version --allow-root

  1. 汉化包的正常差异:使用 zh_CN 语言包时部分文件与英文版不同。务必带 locale=zh_CN(WP-CLI 默认会自动带)。仍报错可用 --locale=en_US 交叉验证。
  2. jQuery 被替换:某站校验报 wp-includes/js/jquery/jquery.js 不匹配,站长直接覆盖成官方版,结果前台依赖旧版 jQuery 的老插件全挂。jQuery 这类文件常被插件/主题合法替换,处理方式是 diff 确认后加入忽略,不要盲目覆盖。
  3. 手动修改核心文件:老教程教人改 wp-admin 里的文件改文案,会被校验报出来,且升级时丢失。正确做法是用 filter/action 钩子。
  4. 校验通过依然被黑:只覆盖核心。真正的后门 90% 在 wp-content/uploads 和主题里,必须配合 find uploads -name "*.php" 排查,详见检测 WordPress 被篡改文件。
  5. 命令卡住不返回:服务器 DNS 或网络问题。用 curl -v "https://api.wordpress.org/core/checksums/1.0/?version=6.5.2" 测连通性,必要时走离线方案。
  6. 权限问题:用普通用户跑遇到 000 权限的文件会报错——这本身也是异常信号。

总结

wp core verify-checksums 是成本最低、最权威的 WordPress 自检手段,一条命令几秒出结果。三个要点:一是它只覆盖核心文件,必须配合 uploads 目录的 PHP 扫描;二是不是所有不匹配都是后门,汉化、jQuery 替换、手动改核心都会触发,要 diff 确认;三是网络不通时用离线比对脚本或 wp core download --skip-content 覆盖(先备份)。把校验加入每月巡检(见WordPress 月度安全巡检清单),配合用 Fail2ban 防护 WordPress 暴力破解的事前防护,安全闭环才算完整。

U
UFO_PF作者

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

留下你的想法

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