如果你的 WordPress 網站今天被植入後門,你會在第幾天後發現?WordPress 安全防護不是裝一個外掛就完事,真正會讓你被打開的是三件最容易忽略的事:弱密碼、檔案被偷偷改過、以及 XML-RPC 這個你可能從來沒聽過的後門。
這篇文章是我前陣子去參加台北小聚聽完 Raymond 的分享之後整理的筆記。Raymond 從滲透測試的角度來說明基礎防護知識,我從 WP 站長的角度介紹哪些工具可以自己跑,以及說明為何需要尋找專業的資安團隊來協助。
一、弱密碼檢查:駭客最便宜的入侵方式
弱密碼指的是被列在常見密碼字典裡的那種——admin123、P@ssw0rd、你的網站名+2024,攻擊者不會猜你的密碼,他們會拿一份幾百萬筆的字典檔對你的登入頁瘋狂測試,直到猜對為止。
WordPress 預設有個叫 wp-login.php 的登入頁,全世界都知道在哪,攻擊者每天用機器人跑遍所有 WordPress 站台,掃出弱密碼的帳號就能直接登入。
如何預防弱密碼攻擊
對不想碰命令列的站長來說,三個外掛任選一個就能解決:
Solid Security
https://tw.wordpress.org/plugins/better-wp-security/
免費版就有「Weak Password Detection」功能,啟用後它會引導你進行一連串的登入防護設定,任何使用弱密碼的使用者下次登入會強制要求改密碼,不改就不能進後台。
Wordfence
https://tw.wordpress.org/plugins/wordfence/
免費版的 Scan 功能會自動掃描所有使用者,比對他們提供的資料庫,如果你的密碼在歷史外洩事件裡出現過,會直接在掃描報告標紅,Pro 版額外提供密碼字典攻擊模擬。
Jetpack Protect
https://tw.wordpress.org/plugins/jetpack-protect/
由 Automattic 官方出品,背後接的是業界知名的 WPScan 漏洞資料庫(超過 21,000 筆已知漏洞)。免費版會自動掃描你站上所有外掛、主題、WordPress 核心版本,發現有漏洞的元件直接通知。原本的 WPScan WordPress 外掛已經不再為一般使用者提供支援,官方推薦改用這個。
弱密碼這部分它沒有獨立 UI,但配合 Solid Security 或 Wordfence 的弱密碼檢測,搭配 Jetpack Protect 的外掛漏洞掃描,可以涵蓋登入端與漏洞端兩個面向。
選擇建議:一般站長裝 Solid Security 或 Wordfence 就夠用,再加裝 Jetpack Protect 補上漏洞掃描的部分。
順手做一件事:刪掉可疑帳號
掃完弱密碼之後,順便進後台 → 使用者 → 全部使用者,看看有沒有不該存在的管理員。常見的後門帳號特徵:
- 帳號名稱很怪(像
wp-config、admin2、support) - 最近才註冊但你不記得加過
- email 是你不認識的網域
看到這種帳號直接刪掉,並把該帳號發過的文章重新指派給你自己。如果你光是看到使用者列表裡有 5 個叫 admin 的帳號就一頭霧水——那很可能你已經被入侵了,這些都是駭客自己加的。
預防勝於檢查
不管哪一派,最後都要走到同一步:把密碼政策設好。其實前面提到的 Solid Security 免費版就內建完整的 Password Requirements 設定,可以強制:
- 最少 16 字元
- 必須混合大小寫、數字、特殊符號
- 90 天強制更換
- 禁止重複使用過去用過的密碼
啟用並設完成後,未來新密碼就不會再掉進弱密碼陷阱。Wordfence 也有類似功能在 Login Security → Settings 裡,看你裝哪個就用哪個的設定,不需要再多裝一個外掛。
二、檔案完整性比對:你的程式碼有沒有被偷偷改過
第二個風險更隱蔽,攻擊者進來之後不會馬上破壞你的網站,他們會在你的主題或外掛裡塞一段惡意程式碼,可能是:
- SEO Spam(在你的頁面塞滿賣假包包的連結)
- 後門程式(讓他下次可以直接進來)
- 加密貨幣挖礦腳本(用你的訪客電腦挖礦)
問題是,這些程式碼藏在 wp-content/plugins/ 底下幾百個檔案裡的某一行,你怎麼知道哪裡被改了?
工具一:WordPress 官方核心檔案校驗
WordPress 官方對核心檔案有提供校驗碼。用 wp-cli 跑:
wp core verify-checksums
它會把你網站上的 WordPress 核心檔案逐一比對官方版本,如果有任何一個檔案被動過會跳出來提醒你,外掛部分可以用 wp plugin verify-checksums --all。
工具二:GitHub 上的 wp-cli/checksum-command
這是 wp-cli 的官方擴充,安裝方式:
wp package install wp-cli/checksum-command
裝完之後就能對所有外掛、主題做完整性比對,對於沒在官方 WordPress.org 倉庫的付費外掛,這個工具沒辦法檢查,這時候要靠下一個工具。
工具三:手動建立檔案指紋
進階一點的做法是定期把 wp-content/ 整個目錄做一次 hash 紀錄,下次比對如果有差異就知道哪裡被改了,但這對非工程背景的站長來說已經是另一個世界,這部分通常會由維護方代為處理。
三、XML-RPC 攻擊:那個你從來沒打開過的後門
XML-RPC 是 WordPress 一個老舊的遠端呼叫介面,原本設計給手機 App、Pingback、Trackback 用,問題是你 99% 不會用到它,但它預設是開的。
攻擊者愛它的原因是:透過 XML-RPC 的 system.multicall 功能,他們可以一次測試 500 組密碼,是直接打 wp-login.php 的 500 倍效率。等於用 1/500 的時間就能破解你的弱密碼。
怎麼檢查自己有沒有開
打開瀏覽器,把網址換成你的網站加上 /xmlrpc.php:
https://你的網站.com/xmlrpc.php
如果看到「XML-RPC server accepts POST requests only.」這行字,代表它是開的。
關閉的方法(三選一)
- 裝外掛:「Disable XML-RPC」這類外掛,安裝啟用就完成
- 改
.htaccess:在裡面加一段規則擋掉xmlrpc.php的請求 - 主機層級擋掉:請主機商或工程師處理,最徹底
如果你完全沒用過 Jetpack 或 WordPress 手機 App,直接關掉沒有任何副作用。
四、用 WPScan 做完整的漏洞掃描
WPScan 是業界最常用的 WordPress 漏洞掃描器,開源、免費、技術人員實務都在用,我介紹它不是要每個站長都自己跑,而是讓你知道專業的健檢長什麼樣,以及它能查出哪些前面外掛掃不到的東西。
GitHub 連結:github.com/wpscanteam/wpscan
它由 Ruby 寫成,背後維護一個專屬的 WordPress 漏洞資料庫(WPVulnDB),收錄了核心、外掛、主題的所有已知 CVE,免費版每天可以查 25 次外掛漏洞,對單一站台的健檢來說綽綽有餘。
安裝
macOS(已裝 Homebrew):
brew install wpscan
Linux(Ubuntu/Debian):
sudo apt install ruby ruby-dev
sudo gem install wpscan
也可以直接用官方 Docker image:
docker pull wpscanteam/wpscan
docker run --rm wpscanteam/wpscan --url https://你的網站.com
裝完之後,去 wpscan.com 註冊一個免費帳號,會拿到 API token。後面所有需要查漏洞庫的指令都要加上 --api-token=你的token。
用法一:基本掃描
wpscan --url https://你的網站.com --api-token=你的token
跑完會列出 WordPress 版本、主題、暴露的檔案、發現的使用者名稱、以及對應的 CVE 漏洞清單,如果你的站台是電商或會員制,建議在凌晨流量低時跑,避免被 WAF 擋下。
用法二:列出所有外掛
wpscan --url https://你的網站.com --enumerate p --api-token=你的token
--enumerate p 會列出能偵測到的所有外掛(passive 模式),要挖更深加 --enumerate ap(aggressive,會送更多請求):
wpscan --url https://你的網站.com --enumerate ap --api-token=你的token
aggressive 模式會掃出 vulnerable plugins、popular plugins、所有偵測得到的版本,但會送幾千次請求,請確認你有權限掃這個站。
用法三:找出可登入的使用者名稱
wpscan --url https://你的網站.com --enumerate u
很多 WordPress 站台沒關掉 REST API 或 author archive,攻擊者可以直接列出所有使用者名稱,這個指令幫你站在攻擊者角度看自己有沒有暴露——如果它能列出 admin、editor 這些帳號,駭客也能。
對策是裝 Stop User Enumeration 外掛或在 nginx/.htaccess 擋掉 ?author= 參數。
用法四:模擬密碼字典攻擊
wpscan --url https://你的網站.com \
--usernames admin,editor \
--passwords /path/to/passwords.txt \
--max-threads 5
這是滲透測試常用的指令:拿一份密碼字典(網路上找 rockyou.txt),對指定的使用者做暴力破解測試,跑完如果有任何一個帳號被破出來,那個帳號的密碼就是字典裡的那一行。
--max-threads 5 限制同時連線數,不要設太高,會被主機 firewall 鎖 IP。
用法五:把報告存成 JSON 給工程師
wpscan --url https://你的網站.com \
--api-token=你的token \
--output report.json \
--format json
JSON 格式方便後續做自動化比對。例如每月跑一次、把結果丟進 diff 工具,就能知道這個月新增了哪些漏洞。
用法六:定期更新漏洞資料庫
WPScan 本機會快取漏洞資料庫,跑掃描前先更新一下:
wpscan --update
這個指令會去 WPVulnDB 拉最新的 CVE 清單,確保你掃出來的結果是最新的。
怎麼讀掃描結果
WPScan 用三種顏色標示風險:
- 🔴 紅色
[!]:有已知漏洞,立刻處理 - 🟡 黃色
[?]:可能有問題,需要進一步確認 - 🟢 綠色
[+]:偵測到的資訊,未必是漏洞
實務上多數站長卡在「掃出來十幾個紅色警告」之後就不知道下一步——哪些是真的會被打、哪些是低風險。這也是為什麼有些人寧可付錢請人解讀報告:工具只告訴你哪裡有洞,不會告訴你「這個洞在你的環境下可不可能被利用」。
五、自己跑工具,還是找人做?
寫到這裡你可能發現一件事——這些工具的安裝步驟看起來都不長,但每一個都假設你會用 SSH、會看錯誤訊息、會自己判斷掃描結果裡哪些是真漏洞、哪些是誤報。
這就是門檻所在。
我整理一下幾種狀況,你可以對號入座:
| 狀況 | 適合的做法 |
|---|---|
| 個人部落格、無金流 | 裝 Wordfence 免費版 + 關掉 XML-RPC 即可 |
| 公司官網、無會員資料 | 加上強制密碼政策 + 每月跑一次 WPScan 外掛掃描 |
| 電商、有客戶資料 | 上述全部 + 定期檔案完整性比對 + 安全事件處理流程 |
| 已經被入侵過 | 別自己救,找人來做完整清查 |
最後一項特別重要,已經被植入後門的站台,自己刪掉看到的惡意檔案通常沒用,駭客會在你看不到的地方留好幾個備援,我們看過最棘手的案例是站長以為清乾淨了,結果三天後又被植入廣告,因為主機層級已經被攻陷,駭客拿到系統權限。
整理一下
WordPress 安全防護的三個核心動作:
- 弱密碼檢查 — 把
admin帳號刪掉、強制 16 字元以上密碼 - 檔案完整性 — 用
wp core verify-checksums定期比對核心檔案,外掛用wp plugin verify-checksums --all - 關掉 XML-RPC — 99% 的網站根本不需要它,預設打開純粹是技術債
如果你看到這裡發現自己連 SSH 怎麼連都不知道,那大概你也不會想花一個週末研究這些指令,這時候找人做兩小時就解決,會比你自己摸索三週還划算。
我們有提供 WordPress 安全健檢服務,會跑完上述所有檢查項目,附上一份白話的報告告訴你網站現在的狀態、哪些地方有風險、優先處理順序是什麼。有興趣的話與我們聯絡。