WordPress Malware 感染清除完整教學:掃描、移除到長期防護

網站突然被搜尋引擎標示為「有害網站」,或是主機商寄來警告信說帳號觸發惡意程式掃描,很多站長第一個反應是重新安裝 WordPress、直接還原備份,然後發現問題兩週後又回來了。惡意程式(Malware)感染很少只停在一個檔案裡,它會在後門、外掛目錄、資料庫幾個地方同時留副本,還原備份若沒查清感染時間點,等於把惡意碼一起還原回去。

處理感染的正確順序是先確認感染範圍、再定位惡意碼、移除並修補、最後換掉所有憑證。整個流程大約 2 到 4 小時,本文依這個順序走一遍。

判斷網站是否已遭感染

感染不一定有明顯的視覺症狀,有些惡意碼會在背景靜默運作好幾個月。以下幾個跡象若出現其中兩個以上,就應當進入清除流程。

流量與排名突然異常:Google Search Console 出現「安全性問題」警告,或是自然搜尋流量在短期內大幅下滑,有時伴隨新增了大量不明的索引頁面。常見手法是在網站悄悄植入垃圾連結頁,把流量導往賭博或藥品網站。

外掛或主題目錄出現不明檔案:用 FTP 或檔案管理器開啟 wp-content/plugins/wp-content/themes/,若看到與外掛無關的 .php 檔、資料夾命名混亂,或上傳時間明顯晚於最後一次更新的檔案,都是警訊。

後台出現陌生管理員帳號:前往「使用者」列表,若有不認識的管理員或編輯員角色帳號,代表有人已取得進入後台的能力。

主機資源異常暴增:CPU 或記憶體使用率突然升高,卻沒有對應的流量增長,可能是網站被用作傳送垃圾郵件(Spam)或挖礦。

瀏覽器警告或防毒軟體攔截:Chrome 顯示「這個網站包含惡意程式」紅色警告,或訪客反映防毒軟體阻擋了網頁,代表 Google 安全瀏覽(Safe Browsing)已將該網域列為危險。

進入清除流程前的隔離動作

確認感染後,先把損害範圍鎖住,不要急著處理檔案。

第一步是讓網站進入維護模式(Maintenance Mode),阻止訪客在清除過程中接觸到受感染的頁面。若無法從後台操作,可在主機控制台把網站暫時設定為 503 狀態。

第二步是在主機端備份完整的檔案與資料庫,包含感染現況在內的完整備份。這份備份不用於還原,而是留作日後鑑識參考,方便比對哪些檔案在感染後被竄改。在主機控制台執行快照,或用 phpMyAdmin 匯出資料庫 SQL 檔,兩份都要確保備妥。

第三步是確認主機商的備份時間點。聯繫主機商查詢最近一次乾淨備份的日期,若有定期自動備份(如 UpdraftPlus 每日備份),對照備份時間與感染跡象出現的時間,找出感染進入點的大致時間範圍。

使用 Wordfence 或 MalCare 定位惡意碼

安裝掃描工具

市面上常用的安全掃描外掛有兩款,定位惡意碼的原理略有不同。

工具 掃描方式 免費版限制 適合對象
Wordfence Security 將核心檔案與官方版本對照,標記差異 需等 30 天才能用最新防火牆規則 有後台操作能力的站長
MalCare 在 MalCare 雲端伺服器執行掃描,不佔主機資源 掃描免費,移除需付費 主機資源有限、或需一鍵清除的使用者

兩款都可以從 WordPress 後台「外掛 > 新增外掛」搜尋安裝。若後台已無法登入,改從 FTP 上傳外掛資料夾到 wp-content/plugins/,再透過 phpMyAdmin 在 wp_options 資料表的 active_plugins 欄啟用。

執行 Wordfence 掃描

安裝並啟用 Wordfence 後,進入「Wordfence > 掃描(Scan)」,點選「Start New Scan」。掃描分成幾個階段,通常需要 10 到 30 分鐘,視網站規模而定。

掃描完成後,結果頁會列出所有異常項目,分為幾類:

  • 已遭竄改(Files modified):核心或外掛檔案內容與官方版本不符,這類最優先處理
  • 惡意碼(Malware):已知惡意特徵符合,有直接的清除按鈕
  • 疑似問題(Suspicious):無法確認是否為惡意,需人工比對

對於「已遭竄改」的 WordPress 核心檔案,Wordfence 提供「還原原始版本(Restore Original)」功能,可以直接用官方程式碼覆寫。外掛和主題的竄改檔案,建議刪除後重新從官方來源安裝乾淨版本。

MalCare 的雲端掃描流程

MalCare 的操作較為精簡:在官網新增網站後,它會透過 API 連線執行深度掃描,整個過程在 MalCare 的伺服器上完成,不會拖慢主機效能。掃描報告會標示受感染的檔案路徑,免費版可看完整報告,若要使用一鍵清除(Auto Clean)功能則需升級付費方案。

若選擇手動清除,可根據報告列出的路徑,用 FTP 或檔案管理器逐一比對和刪除問題檔案。

手動清除受感染的檔案與資料庫

掃描工具給出的報告只是起點,複雜的感染案例通常需要手動補清。

清除受感染的 PHP 檔案

惡意碼最常以 base64 編碼字串藏匿,透過 eval(base64_decode(...)) 執行。在主機控制台的檔案管理器,或透過 SSH,在 wp-content/ 底下搜尋含有以下字串的 PHP 檔案:

eval(base64_decode
eval(gzinflate
eval(str_rot13
@preg_replace
exec(base64_decode

找到後,若整個檔案都是惡意碼(例如一個不屬於任何外掛的陌生 .php 檔),直接刪除。若惡意碼是被插入到正常檔案的開頭或結尾(常見於 wp-config.phpfunctions.php),則需手動剪除那段程式碼,保留原本的正常內容。

清除資料庫中的惡意注入

惡意碼也常被注入到資料庫,特別是 wp_optionssiteurlhome 欄位,以及 wp_posts 的文章內容。以下幾個位置需要逐一檢查:

  • wp_options 裡的 siteurlhome 值是否被改成不明網域
  • wp_posts 裡的文章內容是否有隱藏的 <script> 標籤或 <iframe>
  • wp_users 裡是否有陌生的管理員帳號

可以在 phpMyAdmin 執行 SQL 查詢搜尋可疑字串,例如 SELECT * FROM wp_posts WHERE post_content LIKE '%<iframe%',找到後比對是否為正常嵌入內容,確認為惡意則清除該段程式碼。

刪除後門帳號與重設使用者密碼

wp_users 資料表或後台使用者列表,刪除所有不認識的管理員帳號。接著針對所有現有管理員帳號強制重設密碼,密碼長度建議 16 字以上,混合大小寫、數字、特殊字元,且不重複使用其他服務的密碼。

更換安全金鑰與資料庫密碼

清除受感染的檔案後,需要讓所有現有的登入 cookie 失效,避免攻擊者用竊取的 session 繼續存取後台。

進入 WordPress 官方金鑰產生器(https://api.wordpress.org/secret-key/1.1/salt/),產生一組新的安全金鑰(Security Keys)。接著用 FTP 或檔案管理器開啟 wp-config.php,找到以下這段並完整替換:

define('AUTH_KEY',         '...');
define('SECURE_AUTH_KEY',  '...');
define('LOGGED_IN_KEY',    '...');
define('NONCE_KEY',        '...');
define('AUTH_SALT',        '...');
define('SECURE_AUTH_SALT', '...');
define('LOGGED_IN_SALT',   '...');
define('NONCE_SALT',       '...');

替換後,所有已登入的使用者(包含攻擊者)都會被強制登出,需重新輸入密碼。

若懷疑 wp-config.php 曾被讀取,也要在主機控制台更換資料庫使用者密碼,並同步更新 wp-config.php 裡的 DB_PASSWORD 值。

清除後的驗證與長期防護

驗證清除成果

清除完成後,重新執行一次 Wordfence 或 MalCare 掃描,確認零異常。接著前往 Google Search Console 的「安全性問題」區塊,若有警告,點選「Request Review」告知 Google 已清除感染,審查通常在 1 到 3 天內完成,通過後紅色警告便會撤除。

若主機商曾因感染暫停帳號,聯繫客服提交清除報告,請其重新掃描並恢復帳號。

修補感染入口

找出感染是如何進入的,才能避免再次發生。常見入口有三個方向:未更新的外掛或主題存在已知漏洞(CVE)、管理員密碼過弱或遭暴力破解(Brute Force)、主機共享環境中其他網站受感染蔓延(Cross-Site Contamination)。

對應的補強措施如下:

  • 持續更新:開啟 WordPress 核心、外掛、主題的自動更新,或每週手動檢查一次
  • 限制登入嘗試:安裝 Limit Login Attempts Reloaded 或使用 Wordfence 的登入保護,阻擋暴力破解
  • 雙重驗證(2FA):為所有管理員帳號啟用兩步驟驗證,Wordfence 進階版或 WP 2FA 外掛都能做到
  • 限制 XML-RPC:若不使用行動 App 管理網站,在 wp-config.php 加入禁用 XML-RPC 的設定,減少攻擊面
  • 獨立主機環境:若預算允許,把高流量或重要的商業網站移到獨立主機(VPS),與其他網站隔離

建立定期備份機制

感染事件結束後,最重要的善後不是加強防護,而是確保下次出事時有乾淨的備份可用。設定 UpdraftPlus 或 BlogVault 每日備份,保留至少 30 天的歷史版本,備份目的地選 Google Drive 或 Amazon S3,不要只存在同一台主機上。備份設好後,務必測試還原一次,確認流程可以正常執行。

相關文章
標籤: Wordfence, WordPress 安全, Malware 清除, MalCare, 惡意程式防護