網站被植入後門,最可怕的地方不是當下被攻擊,而是你完全不知道它已經發生。駭客改掉一個外掛檔案、在佈景主題的 functions.php 偷偷塞進一段轉址程式碼,網站外觀照常運作,後台也登得進去,但每個訪客都被悄悄導去博弈或詐騙頁面,搜尋排名一週後開始掉,等到 Google Search Console 跳出安全警示,往往已經過了好幾天。
WordPress 檔案完整性監控(File Integrity Monitoring,常簡稱 FIM)就是用來補上這段「看不見的空窗期」。它的核心邏輯很單純:替每個檔案算出一組數位指紋,之後定期重算、比對,只要指紋對不上,就代表檔案內容被動過,立刻通知你。這篇會說清楚它的運作原理、實際偵測會抓到什麼、自己用 WP-CLI 怎麼跑核心與外掛的檢查、收到警示後怎麼判斷是正常更新還是被入侵,以及它的限制在哪裡。
WordPress 檔案完整性監控到底在監控什麼
檔案完整性監控監控的是「檔案內容有沒有在你不知情的情況下被改動」。它不在乎檔案做了什麼事,只在乎檔案現在的內容,跟上一次記錄下來的內容是否一致。
運作方式是替每個檔案計算一組密碼學雜湊值(cryptographic hash),常見的有 MD5、SHA-1、SHA-256。同樣的內容一定算出同樣的雜湊值,內容只要動一個字元,算出來的值就完全不同。Sucuri 文件裡有個很直白的例子:對內容為「Hello world」的檔案執行 md5sum,不論檔名叫什麼,只要內容一樣,得到的雜湊值就完全相同;反過來,內容一旦改了,雜湊值立刻不一樣。這串雜湊值就是檔案的指紋。
監控工具會先建立一份「基準線」(baseline),把目前所有檔案的指紋記錄下來,當作已知的乾淨狀態。之後不論是即時觸發或排程掃描,工具會重新計算每個檔案的指紋,跟基準線逐一比對。一旦發現某個檔案的指紋對不上,就判定它被修改了,並產生一筆警示,內容通常包含哪個檔案被動、是新增、修改還是刪除、以及變動的時間點。
值得分清楚的是,檔案完整性監控不只盯著內容,部分工具也會一併追蹤檔案權限與修改時間。權限被改動同樣是危險訊號,例如一個原本唯讀的設定檔突然變成可寫入,往往是入侵者在替後續動作鋪路。
為什麼 WordPress 網站特別需要這層監控
因為 WordPress 是一套會被大量複製、原始碼公開的應用程式,駭客對它的每個檔案結構都瞭若指掌,知道把惡意程式碼藏在哪裡最不容易被發現。
WordPress 的檔案大致分成兩類。一類是非執行檔,主要是圖片、影片、PDF 這類媒體檔,大多放在 /wp-content/uploads/ 目錄,網頁伺服器只是把它們傳給瀏覽器,不會執行,內容改了通常不影響安全。另一類是執行檔,也就是 PHP、JavaScript 這些帶有程式邏輯的原始碼,涵蓋 WordPress 核心、外掛、佈景主題。這類檔案被竄改才是真正的麻煩。
執行檔正常情況下只會在幾種時機變動:更新 WordPress 核心、安裝或更新外掛與佈景主題、刪除外掛或佈景主題、以及你自己手動改了程式碼。除此之外,任何一個執行檔的指紋變了,都該被當成可疑事件來查。最典型的攻擊手法包括在佈景主題的 functions.php 注入後門、在 /wp-content/uploads/ 丟進一個名字古怪的 PHP 檔當作 webshell,或是直接改掉核心檔案 wp-settings.php 之類的入口。這些動作從網站外觀完全看不出來,但檔案指紋一定會變,而這正是檔案完整性監控能抓到的東西。
把監控接上活動紀錄(activity log)一起看,價值會更高。一旦真的出事,你能對照出哪個檔案在什麼時間被誰改了,做事後的鑑識追查,也能據此補強防護、避免同一個破口再被利用。
兩種比對方式:跟官方倉庫比,還是跟自己的基準線比
檔案完整性監控的比對對象有兩種思路,這個區別決定了它能抓到什麼、會不會誤報,是選工具前一定要先搞懂的關鍵。
第一種是拿你的檔案去跟「官方中央倉庫」比對。以 WordPress 來說,就是把你站上 index.php 的指紋,拿去跟 WordPress.org 官方釋出的同版本 index.php 指紋比,一樣就乾淨,不一樣就代表被動過。這種方式的好處是能直接確認檔案跟原版是否完全一致,WP-CLI 的 verify-checksums 走的就是這條路。
但這種方式有幾個先天限制。它只能比對「官方有提供指紋」的檔案,也就是 WordPress 核心和上架到官方外掛目錄的外掛;wp-config.php、.htaccess 這類每個站都不一樣的設定檔,官方沒有標準版本可比,它驗不了。同理,付費外掛、自己寫的客製外掛或佈景主題,因為官方倉庫裡沒有對應的「正確答案」,也無法比對。而且只要你動過任何官方檔案的程式碼,它一律會跳出不符,產生誤報。
第二種是跟「自己產生的基準線」比對。工具在安裝時先替你站上所有檔案拍一份指紋快照,之後每次掃描都跟這份自己的快照比。它的優勢是能偵測客製程式碼的變動,也能隨網站演進更新基準線:你確認某次變動是自己做的合法修改,就把它接受、更新進基準線,下次就不會再報。這種方式的誤報率明顯低很多,也是業界普遍認為較理想的做法。
實務上兩種方式各有所長。跟官方倉庫比,適合用來快速驗證核心與官方外掛有沒有被動手腳;跟自我基準線比,則能涵蓋整站包含客製程式碼的全面監控。要做得周全,兩者搭配使用會比只靠一種來得可靠。
用 WP-CLI 自己動手檢查核心與外掛
如果你的主機能用 WP-CLI(WordPress 的命令列工具),不必裝任何外掛就能立刻驗證核心與外掛檔案的完整性,這是最快、最直接的一次性檢查方式。
檢查核心檔案,在網站根目錄執行下面這行。它會向 WordPress.org 下載目前版本的官方指紋,跟你站上的核心檔案逐一比對:
wp core verify-checksums
如果一切正常,會回傳類似「Success: WordPress installation verifies against checksums.」的成功訊息。如果有檔案對不上,它會把被修改的檔案路徑一條條列出來,這時就要逐一確認那些檔案為什麼會變。
預設的核心檢查不包含 wp-config.php、.htaccess 這類根目錄設定檔,因為官方沒有標準版本可比。若你想把根目錄檔案也納入檢查範圍,可以加上參數:
wp core verify-checksums --include-root
外掛的檢查邏輯一樣,可以一次驗證全部已安裝的外掛,或只驗某一個:
wp plugin verify-checksums --all
wp plugin verify-checksums akismet
這裡要特別留意一個常見誤會:plugin verify-checksums 只能驗證上架到官方外掛目錄的外掛。付費外掛或你自己客製的外掛,因為官方沒有可比對的來源,會回傳警告而不是錯誤,這屬於正常現象,不代表那些外掛被竄改,得改用其他方式(例如自我基準線型的監控工具)來盯。
除了找被改的檔案,有時問題出在「多了一個本來不該存在的檔案」,例如被偷塞進核心目錄的後門。verify-checksums 加上 –reveal 參數,可以把核心目錄裡 WordPress 不認得的陌生檔案揪出來:
wp core verify-checksums --reveal
收到「檔案被修改」警示後,怎麼判斷是不是被入侵
收到警示先別慌,第一件事是判斷這個變動是不是你自己造成的,這一步決定了後面要不要進入緊急處理。
判斷的關鍵是把「變動的檔案」對上「最近的操作」。如果警示出現在你剛更新 WordPress 核心、剛裝或更新外掛、剛改過佈景主題之後,而且變動的檔案就落在對應的目錄裡,那多半是正常的合法變動,確認後接受即可。反過來,下面幾種情況要當成高度可疑:
- 核心檔案在沒有更新的情況下變了:核心檔案正常只會因官方更新而改動,沒更新卻變了,幾乎可以直接視為入侵訊號,要立刻查。
- /wp-content/uploads/ 出現 PHP 檔:這個目錄正常只放媒體檔,跑出一個你叫不出名字的 PHP 檔,很可能是 webshell 後門。
- 佈景主題 functions.php 被改,但你沒動過它:這是注入後門最常見的落點之一,裡頭常藏有導向惡意網站或建立隱藏管理員的程式碼。
- 根目錄出現命名怪異的新檔,或設定檔權限被改鬆:例如原本唯讀的檔案突然變可寫,往往是攻擊者在鋪路。
確認某個檔案被竄改後,核心檔案可以用強制重新下載官方版本來覆蓋掉被動過的內容:
wp core download --version=$(wp core version) --force
被竄改的外掛則重新安裝乾淨版本即可:
wp plugin install 外掛代稱 --force
要提醒的是,覆蓋或重裝只是把檔案恢復乾淨,不等於入侵就此結束。攻擊者通常會留下不只一個後門,也可能已經拿到管理員憑證。完整的善後還包含:從乾淨的備份還原、檢查資料庫裡有沒有被新增的可疑管理員帳號、重設所有使用者密碼、並把當初被利用的破口(過期外掛、弱密碼、錯誤的檔案權限)補起來。
哪些目錄該盯、哪些該放過,才不會被誤報淹沒
監控要有效,重點不是盯越多越好,而是盯對地方。什麼都監控的結果,是每天收到上百筆無意義的變動通知,最後乾脆全部忽略,反而把真正的警示也一起漏掉了。
一個實用的分目錄原則如下:
- /wp-content/uploads/:這裡是媒體檔的天下,圖片、影片、文件每天都在新增,把這些靜態檔逐一監控只會製造雜訊,通常該排除。但目錄本身不能完全不看,要盯的是「有沒有出現不該在這裡的執行檔」,尤其是 PHP 檔。
- /wp-content/cache/:快取外掛會頻繁寫入這個目錄,甚至包含合法的 PHP 檔(特別是開了物件快取時)。建議先搞清楚你用的快取外掛會產生哪些檔案,再據此設定排除規則;沒用快取外掛的話,這個目錄就單純好監控得多。
- /wp-content/plugins/ 與 /wp-content/themes/:這兩個目錄的變動正常只該來自管理操作,也就是安裝、更新、刪除外掛或佈景主題。除此之外的變動都值得查。
- WordPress 根目錄與核心檔案:這是最該嚴格盯的地方。根目錄的檔案變動往往是很好的調查線索;核心檔案則如前面所說,只該在官方更新時變動,其他時候一律當可疑事件處理。
部分專為 WordPress 設計的監控外掛能辨識核心、外掛、佈景主題的合法變動,當你按正常流程更新時,它會提示「這批變動是更新造成的」讓你確認,而不是把幾百個檔案變動當成幾百筆獨立警報轟炸你。這類「懂 WordPress 結構」的工具,誤報率會比通用型的伺服器層工具低很多,對非資安專業的站長尤其友善。
監控工具有三類,怎麼挑
檔案完整性監控的工具大致分成 WordPress 外掛、伺服器層軟體、開源工具三類,挑哪一種主要看你的技術能力和主機環境。
WordPress 外掛是門檻最低的選擇,裝起來就能用,且專為 WordPress 設計,能辨識核心與外掛的合法變動、誤報少。市面上有專做檔案監控的外掛,例如採自我基準線比對、會辨識站台結構變動的 Melapress File Monitor;也有像 Wordfence、Sucuri 這類全方位資安外掛,內建檔案完整性檢查功能,多半採跟官方倉庫比對的方式,能驗核心與部分熱門外掛。如果你不想碰命令列或主機設定,外掛是最務實的起點。
伺服器層軟體(例如 Tripwire、OSSEC、Qualys)裝在主機作業系統上,檢查的是整台伺服器的所有檔案,監控範圍最廣也最完整。代價是它們不是針對 WordPress 設計,誤報通常較多,設定與管理需要較進階的知識,且多半要有自己的專屬伺服器或 VPS 才能用,部分商用方案費用也不低。OSSEC 是其中知名的開源選項,免費、功能強,但同樣得在專屬伺服器或 VPS 上跑,且需要相當的設定工夫,比較適合喜歡鑽研伺服器管理、想要完整掌控權的人。
至於前面介紹的 WP-CLI verify-checksums,則介於兩者之間:它不是常駐監控,而是一個隨叫隨跑的一次性稽核工具,很適合排進定期維護流程,或接進 CI/CD 自動化管線裡,在問題影響到使用者之前就抓出來。
檔案完整性監控不是萬靈丹,它的限制要先認清
檔案完整性監控是很有用的早期警報,但它只是整體資安的一環,不該被當成唯一的防線。把它的限制講清楚,才不會誤以為裝了就高枕無憂。
第一,它本質上只是「指示器」,不會自己滅火。它告訴你某個檔案被動了,但不會替你判斷那段程式碼是不是惡意、更不會自動清掉。看懂警示、做出正確處置,仍然需要對 WordPress 有一定了解的人來判斷。它的角色比較像煙霧偵測器,響了代表有狀況,滅火還是得靠人。
第二,它可能被繞過。部分入侵手法會竄改檔案的修改時間,而修改時間正是某些工具會追蹤的指標之一,這會讓比對失準、漏掉變動。所以單靠時間戳記不夠可靠,以內容雜湊為主的比對才比較踏實。
第三,誤報是常態。只要你客製過程式碼,又用的是跟官方倉庫比對的方式,工具就會把你的合法修改一律標成不符。沒有妥善設定排除規則和基準線,警示很快會多到讓人疲乏。
正因為這些限制,檔案完整性監控最好跟其他防護一起用:搭配能綜合多種訊號判斷的惡意程式掃描器、防火牆、登入安全(如雙因素驗證),再加上一套可靠的備份機制,出事時能快速還原到乾淨狀態。檔案完整性監控負責「及早發現」,其餘工具負責「擋下來」和「救回來」,整套搭起來才算完整。
回到最開頭那個被植入轉址後門卻渾然不覺的情境,差別就在有沒有這層監控。它不能保證網站永遠不被攻擊,但能把「被改了卻沒人知道」的空窗期壓到最短。如果你的主機支援 WP-CLI,現在就可以跑一次 wp core verify-checksums,花不到一分鐘,先確認此刻你站上的核心檔案是不是乾淨的;接著再依網站規模和自己的技術程度,挑一套常駐的監控方案接上去,讓這層警報一直在背景替你看著檔案。