先说结论:WordPress 被挂马后,不要急着删文件重装,先做三件事——隔离站点、定位入口、备份现场。顺序错了,要么清理不干净反复中招,要么把证据删了查不出原因。下面按实操顺序走一遍。
一、先隔离,别让马继续跑
发现异常后第一时间把站点切到维护模式,或者直接在 Nginx 层返回 503,避免搜索引擎继续抓取被注入的页面。同时把整站文件和数据库打包留一份证据,后面排查和对比都要用。
# 打包站点文件(排除缓存目录)
tar -czf /backup/site-$(date +%F).tar.gz
--exclude=wp-content/cache
--exclude=wp-content/uploads
/var/www/html
# 导出数据库
mysqldump -u root -p --single-transaction wordpress > /backup/db-$(date +%F).sql
注意:备份不要放在网站根目录下,否则等于把马又公开了一份。
二、定位挂马入口,别只删表面文件
挂马通常藏在几个固定位置:主题的 functions.php、wp-content/uploads 下的伪装图片、wp-includes 里被篡改的核心文件、以及数据库 wp_options 和 wp_posts 里的恶意脚本。用命令行按时间筛最近被改过的 PHP 文件,效率最高:
# 找出 7 天内修改过的 php 文件
find /var/www/html -name "*.php" -mtime -7 -type f
# 在 uploads 里找 php 文件(正常不会有)
find /var/www/html/wp-content/uploads -name "*.php"
# 搜索常见恶意特征
grep -rIl --include="*.php" -E "eval(|base64_decode(|gzinflate(|assert(" /var/www/html
数据库这边重点查 wp_options 里 siteurl、home 是否被改,以及 wp_posts 中是否插入了隐藏 iframe 或外链脚本。发现可疑内容先记录,不要直接改,等确认后再统一处理。
三、清理与重装:核心文件走官方源
WordPress 核心文件被改是最麻烦的,最稳妥的做法是用官方包覆盖核心目录,保留 wp-config.php 和 wp-content:
cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
rsync -av --delete wordpress/wp-admin/ /var/www/html/wp-admin/
rsync -av --delete wordpress/wp-includes/ /var/www/html/wp-includes/
cp wordpress/*.php /var/www/html/
主题和插件不要图省事直接覆盖,先比对官方版本,确认没被改过再保留;有改动的直接删掉重装。数据库里的恶意记录用 SQL 精确删除,删之前务必再备份一次。
四、加固:堵住下次进来的路
- 所有管理员、数据库、FTP 密码全部重置,后台开启强制强密码。
- 升级 WordPress 核心、主题、插件到最新版,停用并删除不用的插件。
- 限制
wp-login.php访问频率,或加一层 Basic Auth;关闭后台文件编辑:在wp-config.php加define('DISALLOW_FILE_EDIT', true);。 - 给
wp-content/uploads目录禁止执行 PHP:
location ~* /wp-content/uploads/.*.php$ {
deny all;
}
- 安装 Wordfence 或同类安全插件做文件完整性监控,开启登录双因素认证。
- 服务器层面装个轻量 WAF 或开启云厂商的 Web 防护,日志保留至少 30 天。
清理完别急着宣布结束,观察 3 到 7 天的访问日志和文件变更记录,确认没有二次回连,再恢复搜索引擎抓取。挂马往往不是单点问题,入口没堵上,删多少次文件都白搭。

