IT

WordPress 被挂马后怎么清理?附完整加固流程

AI智能摘要

WordPress 被挂马别慌着重装,先隔离、备份、查入口。本文按实操顺序讲清楚怎么用 find 和 grep 定位恶意文件、用官方包覆盖核心目录、清理数据库里的注入内容,最后给出上传目录禁执行 PHP、关闭后台编辑、限制登录等加固配置,避免二次中招。

先说结论: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 天的访问日志和文件变更记录,确认没有二次回连,再恢复搜索引擎抓取。挂马往往不是单点问题,入口没堵上,删多少次文件都白搭。

发表评论