WordPress 被黑后的清理与加固
先止血,再取证,最后才谈重装
站点被挂马后,最常见的错误动作是改掉后台密码就以为处理完了。后门往往不在后台:在 uploads 里一张长着 .jpg 后缀的 PHP,在主题 functions.php 末尾追加的几行 eval,在 wp_options 那条序列化的定时任务里。这一页按处置顺序写:怎么确认、木马在哪、按什么次序清、清完换哪些密钥。
被黑的五种迹象
首页往往是最晚露出破绽的地方
入侵者很少直接改首页,太显眼。更常见的是长期寄生:借你的域名做搜索排名、拿服务器发垃圾邮件。出现任一信号,都该按被入侵排查。
搜索结果变成外文垃圾词
用 site:域名 查询,出现大量日文、博彩类标题,点进去却正常。这是寄生页面:攻击者在 wp_posts 写入独立文章,只在识别到爬虫 UA 时才输出。
- 换 UA 抓取比对返回内容
- 查 post_status 为 publish 的陌生记录
手机端被跳转
电脑打开正常,手机跳到第三方站点。跳转代码一般藏在 header.php 或某个小工具选项里,外面套一层 UA 判断。用 curl -A "iPhone" 抓一次 HTML 搜 location 即可定位。
后台多出陌生管理员
用户列表出现不认识的账号,邮箱是临时域名。也有更隐蔽的做法:不改 wp_users,只往 wp_usermeta 给已有账号追加 administrator 能力,界面上看不出异常。
主机商发来 abuse 通知
说你名下服务器在对外发垃圾邮件、参与撞库或 DDoS。到这个阶段,问题已从挂马升级为被当作基础设施使用,处理要连带查 SSH 与邮件服务配置。
文件修改时间集中在凌晨
几十个文件的修改时间落在同一天凌晨三点,而那天没人登录过后台。这是批量写入后门的典型特征,比任何扫描器都直接。
- 用 find -newermt 按日期筛
- 缓存与 uploads 的变动单独看
木马常见的六个藏身位置
按被发现的频率排序
清理不彻底,八成是因为只扫了主题和插件目录。下面六处里,有三处在常规扫描器的默认范围之外。
wp-content/uploads
最常见,因为这里允许上传、目录深、文件多、没人逐个点开看。伪装手法有三种:双扩展名如 shell.php.jpg;图片头部保留 JPEG 幻数、后半段接 PHP;文件名随机成八位字母,混在几千张产品图里。
find wp-content/uploads -name "*.php",正常站应为空- 按月份建子目录的站,重点看近三个月
主题的 functions.php
不是整个文件替换,而是末尾追加一小段:base64 解码后 eval,或者判断某个 POST 参数存在才执行。能躲过按哈希比对的扫描,因为主题更新会覆盖回去,攻击者随后再写一遍。
- 看文件末尾多出的空行与注释块
- 正版主题不会出现 eval、assert
wp-includes 与 wp-admin
直接改核心文件,比如在 wp-includes/pluggable.php 里插一段只对特定来源 IP 生效的逻辑。人眼几乎发现不了,但用官方校验和能一次比对出来,这是性价比最高的检查手段。
wp_options 里的 cron
option_name = 'cron' 那一行的值是个序列化数组。攻击者塞进一个每小时执行的钩子,指向已被篡改的主题函数。文件层面看不出异常,只在库里多了一行。
- 查 option_value 里的钩子名
- 正常以 wp_ 开头,随机字符串要警惕
mu-plugins 与 drop-in
mu-plugins/ 下的文件自动加载、不出现在插件列表,是天然隐蔽点。另一类是 drop-in:advanced-cache.php、object-cache.php、db.php,WordPress 优先加载它们,替换后可劫持缓存与登录校验。
配置文件与 .htaccess
wp-config.php 顶部被插入混淆代码,位置在 require 之前,所以一定先执行。.htaccess 里加一行 RewriteRule 把特定 UA 导流到外部站,这条规则生效不留任何访问日志。
- 比对 .htaccess 与备份的差异
- wp-config 只应有注释、常量、require
怎么在半小时内定位
四条命令加两次查询
不用等扫描器跑完整站。SSH 登进去做下面几步,通常能把范围缩到一个目录。所有命令都是只读的。
按时间筛出可疑文件
find . -type f -name "*.php" -newermt "2026-10-01" -not -path "./wp-content/cache/*" | head -50。日期换成你怀疑的时间点,逐个看是不是那次更新造成的。
搜高危函数
grep -rn "eval(" --include="*.php" wp-content/ | head -30,再补一条查 base64_decode。正版主题里出现这两类调用基本可判定,误报主要来自老式加密插件。
用官方校验和比对核心
wp core verify-checksums,会列出所有被改动的核心文件,输出形如 File doesn't verify against checksum: wp-includes/pluggable.php。版本必须与当前一致,否则整站都会报不一致。
查库里的两处痕迹
用户侧关联 wp_usermeta 里 wp_capabilities 含 administrator 的记录;任务侧看 cron 那一行。两处都要人眼过一遍,不能只看 count。
日志里还有另一类证据:几万次 POST /wp-login.php 说明是暴力破解,大量 /wp-json/wp/v2/users 请求说明账号被枚举。这类线索决定加固方向,分析见WordPress 防火墙与 WAF 配置。
清理的四步顺序
顺序错了会丢掉判断依据
很多人第一步就删文件,删完发现不知道入侵是什么时候进来的、哪些备份已被污染。正确做法是先留证据,再动手。
隔离并取证
整站打包、数据库导出,两份都存到站点目录之外。记下最早异常文件的修改时间,这个时间点决定哪份备份还能用。前台切维护模式,SSH 与数据库保留可用。
换掉全部凭据
顺序从外到内:域名注册邮箱、主机面板、SSH、FTP/SFTP、数据库用户密码、WordPress 管理员密码。只换 WordPress 密码等于没换,攻击者往往还有一层系统入口。
覆盖核心与插件
删掉 wp-admin 与 wp-includes,从同版本官方包重新解压。wp-content 保留,themes 与 plugins 只留正在用的,其余全删,在用的也从官方源重新下载覆盖。
清库并重建密钥
删陌生用户、清 wp_usermeta 越权项、清 cron 陌生钩子、删寄生文章、查 autoload 为 yes 的可疑项。最后重建 8 个安全密钥,让所有已登录会话立即失效。
覆盖核心前先看 wp-includes/version.php 确认版本,下载对应完整包;跨大版本覆盖会触发数据库升级提示。
清理后必须重建的密钥
不改这一项,等于留了后门
WordPress 用 wp-config.php 里的 8 个密钥签名登录 Cookie。这组值不变,攻击者之前窃取的 Cookie 依然有效,改多少次密码都没用,这一步最容易被跳过。
8 个常量整组替换
AUTH_KEY、SECURE_AUTH_KEY、LOGGED_IN_KEY、NONCE_KEY 与对应的 4 个 SALT。整组从官方密钥生成页取一份新的,一次性替换,不要只改其中几个。替换后所有用户被强制退出。
顺手加的三条常量
define('DISALLOW_FILE_EDIT', true) 关掉后台文件编辑器,堵住拿到后台后直接写马的路;WP_DEBUG_DISPLAY 设 false,避免报错暴露绝对路径;FORCE_SSL_ADMIN 让后台强制走 HTTPS。
权限收回 644 / 755
目录 755、文件 644、wp-config.php 收到 600。上传目录禁止执行 PHP:Apache 用 .htaccess 写 php_flag engine off,Nginx 在 uploads 的 location 里 return 403。这一步能废掉大部分上传型木马。
加固项与代价对照
每一项都有副作用
加固不是全开就好。下面几项在企业站上最常见,风险一列是实际踩过的坑。
| 加固项 | 做法 | 挡住什么 | 注意的风险 |
|---|---|---|---|
| 登录二次验证 | 安全插件开启 TOTP,管理员强制 | 密码泄露后的登录 | 换手机未备份恢复码会锁死账号 |
| 禁用文件编辑 | DISALLOW_FILE_EDIT 置 true | 后台直接写马 | 日常改主题需走 SFTP |
| 上传目录禁执行 | Nginx 拦截或 .htaccess 关闭引擎 | 图片马、双扩展名 | 少数上传类插件会报错 |
| 关闭 xmlrpc | 返回 403 或插件禁用 | 暴力破解与 pingback 放大 | 旧版手机客户端无法发文 |
| 数据库用户降权 | 去掉 DROP、FILE、GRANT | 注入后删库或读文件 | 个别迁移插件需临时提权 |
被黑处置常见五问
只有备份早于入侵时间点才成立。入侵往往潜伏数周,最近几份备份里已经带了后门,回滚等于把马一起搬回来。先看最早异常文件的修改时间,找一份早于它的备份,恢复后仍要改全部密码、重建密钥。备份本身的制度见备份与恢复。
三个动作:核心校验和全部通过;uploads 下不存在任何 PHP 文件;观察 14 天,每天比对一次文件哈希。同时看日志里是否还有对可疑路径的请求,有请求说明攻击者还在试。
入口大概率不在 WordPress:SSH 密码与后台密码相同、FTP 账号长期未改、面板被撞库,或者同服务器上另一个站被拿下后横向移动。只处理这一层,清理就白做了。
先看邮件队列与发送日志,确认是 PHP 发信还是系统服务。PHP 发信多半是木马调用 wp_mail(),用 grep -rn "wp_mail(" 找。处理完把发信改为第三方 SMTP,切断本地通道。
清理干净后先在 Search Console 提交复核,通常一到三周解除标记。排名恢复取决于寄生页面存在了多久,超过三个月的按季度算。期间保持正常更新即可。长期方案见WordPress 安全加固与木马清理与WordPress 安全插件。
站点正在被挂马或已被搜索引擎标记
先做只读体检,再决定动不动手
提供主机面板与 SSH 入口,我们先做一轮只读排查:核心校验和、可疑文件清单、cron 与用户表异常项、日志里的攻击来源,出一份处置建议再动手。清理与加固可单独做,也可并入年度维护,HTTPS 侧的配置见SSL 证书与 HTTPS 配置。
电话/微信 13280692153 邮箱 web@wordpressx.com 地址 山东省淄博市张店区电子产业创新园 B 座