網站今天能正常開、後台登得進去,不代表它沒破洞。WordPress 真正的風險不在「現在有沒有被打」,而在那些早已公開、攻擊者隨手可查、你卻渾然不知的已知漏洞。一支三年沒更新的外掛、一個棄用主題殘留的檔案,往往就是被自動化掃描程式挑中的入口。
WordPress 弱點掃描的價值,就是把攻擊者看你網站的視角拿到自己手上。掃描程式會像入侵者一樣,從外部列舉出你的核心版本、外掛、主題與使用者帳號,再把這些資訊比對一個持續更新的漏洞資料庫,告訴你哪幾項已經有公開的可利用漏洞。這篇會帶你看懂 WPScan 怎麼跑、漏洞資料庫 API 怎麼接、掃出來的報告怎麼判讀與排序修補,以及在 Windows 環境與沒有指令列的情況下,還有哪些替代路徑可以做到一樣的定期體檢。
WordPress 弱點掃描在掃什麼,跟防毒掃描差在哪
弱點掃描查的是「已知漏洞」,不是惡意程式。兩者常被混為一談,但目的完全不同。惡意程式掃描(malware scan)找的是已經被植入網站的後門、挖礦腳本、被竄改的檔案;弱點掃描則是在你還沒被入侵前,先找出「未來可能被利用的破洞」,例如某個外掛的特定版本有公開的 SQL Injection 或跨站腳本(XSS)漏洞。
這個差異很關鍵。Sucuri 的技術文件就特別提醒,WPScan 這類工具並不能偵測網站惡意程式,所以掃出弱點、補完洞之後,仍要另外做一次惡意程式檢查,確認沒有早就被植入的後門。換句話說,弱點掃描是「健檢」,惡意程式掃描是「驗血找病灶」,兩件事都要做。
弱點掃描的運作邏輯是「列舉加比對」。掃描程式先用黑箱方式(black box)從外部蒐集網站資訊,這個過程不需要登入你的後台、也讀不到原始碼,純粹靠分析 HTML 原始碼與 HTTP 標頭就能推測出版本與元件。蒐集到的清單接著比對漏洞資料庫,逐項回報哪些版本對應到已登錄的漏洞。正因為它模擬的是攻擊者的外部視角,這裡有一句話值得記住:WPScan 找得到的破洞,攻擊者一樣找得到。
WPScan 是什麼,為什麼是弱點掃描的標準工具
WPScan 是一套開源、免費的 WordPress 專用弱點掃描程式,用 Ruby 撰寫,能掃出 WordPress 核心、外掛與主題的已知漏洞,同時還能檢查弱密碼、外露的設定檔備份與使用者列舉問題。它在資安界幾乎是 WordPress 掃描的同義詞,Kali Linux 這套滲透測試發行版甚至預先安裝好它。
它之所以成為標準,關鍵在背後那個資料庫。WPScan 維護一個專屬的 WordPress 漏洞資料庫,自 2014 年起運作,由專業資安人員與社群持續更新,目前收錄超過兩萬筆已知漏洞。更重要的是,WPScan 本身是一個 CVE 編號管理機構(CNA),有權直接為 WordPress 核心、外掛與主題漏洞分配 CVE 編號。這代表很多 WordPress 生態的漏洞,第一手登錄處就是它。
要注意的是版本演進。原本掛在官方外掛目錄的那支「WPScan」WordPress 外掛已經不再對一般使用者提供支援,官方轉而推薦改用同樣以 WPScan 漏洞資料庫為後盾的 Jetpack Protect。所以現在講 WPScan,主要指的是命令列工具加上漏洞資料庫 API 這條主線,後面會說明沒有指令列環境時的替代做法。
在 Windows 上沒辦法直接跑 WPScan 怎麼辦
WPScan 不支援 Windows,只能在 Linux 或 macOS 上執行,這是台灣多數用 Windows 管站的站長第一個會卡住的地方。早期的官方教學就直接點明這點,建議 Windows 使用者另外準備 Linux 環境。實務上有三條可行路徑,依你熟悉指令列的程度挑一條。
第一條是裝虛擬機。用 VirtualBox 之類的軟體開一台 Linux 虛擬機(例如 Ubuntu 或直接用內建 WPScan 的 Kali Linux),在裡面跑掃描。這條路最完整,缺點是要先熟悉 Linux 操作。
第二條是用 Docker。如果你的工作機或伺服器有 Docker,可以直接拉官方映像檔來跑,省去安裝 Ruby 與相依套件的麻煩。掃描時把命令接在映像檔後面即可,跑完容器就丟掉,不在本機留下殘留環境,對只是定期體檢的站長相當方便。
第三條是完全不碰指令列,改用外掛或線上掃描服務。Jetpack Protect 是免費的 WordPress 外掛,安裝後就能用 WPScan 的漏洞資料庫掃自己的核心、外掛與主題版本,結果直接顯示在後台。另外也有 Pentest-Tools 這類線上掃描服務,在網頁填入網址就能跑一次以 WPScan 為基礎的掃描。這條路最低門檻,適合不想維護 Linux 環境、只要定期看報告的人。
WPScan 的基本掃描指令怎麼下
WPScan 的命令一律以 wpscan 開頭,接著用 –url 指定要掃的網址。最基本的一行是這樣:
wpscan --url yourwebsite.com
跑之前先更新工具與資料庫,這一步很多人會略過卻最關鍵,因為漏洞天天新增,用舊資料庫掃等於白做。Ruby gem 安裝的更新指令是 gem update wpscan,用 Homebrew 裝在 macOS 的則是 brew upgrade wpscan。
基本掃描跑完,會列出一批被歸類為「Interesting Findings」的發現,內容大致包括這些:
- HTTP 標頭洩漏的伺服器資訊
xmlrpc.php與wp-cron.php是否可被外部存取- 偵測到的 WordPress 核心版本
- 啟用中的主題與其基本資訊
- 啟用中的外掛與其基本資訊
- 可被公開存取的設定檔備份
不同的網站與伺服器設定,掃出來的內容會不一樣。要提醒的是,基本掃描只會告訴你「某個外掛版本過舊」,並不會告訴你「這個版本有哪些具體漏洞」,要拿到後者,得接上漏洞資料庫 API。
漏洞資料庫 API 怎麼接,免費額度夠用嗎
要讓 WPScan 回報具體漏洞,必須帶上漏洞資料庫的 API token。在 wpscan.com 註冊帳號就能免費取得一組 token,掃描時用 –api-token 參數帶入:
wpscan --url yourwebsite.com --api-token 你的token
免費方案目前是每天 25 次 API 請求,這個額度的計算方式常被誤解,搞懂它才知道夠不夠用。WPScan 是這樣消耗請求的:查 WordPress 核心版本算一次,每一個安裝的外掛各算一次,每一個主題也各算一次。所以一個裝了十支外掛、兩套主題的網站,跑一次完整漏洞掃描大約就吃掉十三次請求。
對單一網站來說,每天 25 次足夠至少完整掃一次。但如果你同時管很多站,或一天想反覆掃好幾次,就會碰到上限。額度用完後 WPScan 不會中斷,而是繼續執行、只是不再附帶漏洞資料,回報會退化成「只知道版本、不知道漏洞」的狀態。遇到這種情況,要嘛分天掃、要嘛升級付費方案。
實際存取資料庫時,API 要求把 token 放在 HTTP 的 Authorization 標頭,格式是 Authorization: Token token=你的token。WPScan 命令列工具會自動幫你處理這個標頭,只有在你想自己串接資料庫做整合時才需要手動帶。另外,官方使用條款明確禁止永久儲存或快取漏洞資料、也禁止從網站或 API 爬取資料,自行整合時要留意這些限制。
怎麼只掃有漏洞的外掛與主題
列舉(enumerate)是 WPScan 的核心功能,用 -e 參數搭配不同代碼,指定你想列舉什麼。最常用的場景是只看「有漏洞的」外掛與主題,不必把全部元件都翻一遍。
掃有漏洞的外掛,用 vp(vulnerable plugins):
wpscan --url yourwebsite.com -e vp --api-token 你的token
把 vp 換成 vt(vulnerable themes)就是掃有漏洞的主題,其他參數不變。除了外掛與主題,WPScan 也會一併回報你的 WordPress 核心版本本身有沒有對應漏洞。要提醒的是,帶 API token 的漏洞掃描會比基本掃描慢得多,原本五分鐘能跑完的基本掃描,完整漏洞掃描有時會拉到二十五分鐘,跑之前先有心理準備、別中途以為當掉就強制中斷。
下面整理常用的列舉代碼,全部接在 -e 後面使用。
| 代碼 | 列舉對象 |
|---|---|
| ap | 所有外掛 |
| vp | 只列有漏洞的外掛 |
| p | 熱門外掛 |
| at | 所有主題 |
| vt | 只列有漏洞的主題 |
| t | 熱門主題 |
| tt | timthumb 縮圖程式 |
| cb | 公開外露的設定檔備份 |
| u | 使用者 ID 範圍(例 u1-9) |
| m | 媒體 ID 範圍(例 m1-9) |
日常體檢通常用 vp 加 vt 就夠聚焦,想做更全面的盤點再改用 ap 與 at。
使用者列舉為什麼是個破洞,怎麼掃
使用者列舉指的是 WPScan 嘗試從外部找出你網站上有效的登入帳號,這一步反映的是攻擊者發動密碼攻擊前的偵查動作。掃描指令是:
wpscan --url yourwebsite.com -e u
WordPress 預設就容易被列舉出使用者,根本原因出在永久連結(permalink)這個機制。WordPress 允許用某位作者的帳號或 ID 列出該作者的所有文章,攻擊者利用這個特性就能反推出有效的帳號名稱。WPScan 還會交叉使用作者彙整頁、REST API 端點等多種技巧來猜帳號。
理想狀態是任何技巧都列舉不到帳號。最簡單的防法,是讓網站上公開顯示的暱稱(nickname)跟實際登入帳號(user ID)不一樣,這樣即使攻擊者抓到顯示名稱,也對不上真正的登入帳號。光是知道帳號還不足以攻破網站,但這份資訊會大幅降低後續暴力破解的難度,所以列舉得到帳號這件事本身就該當成一個要修的弱點。
WPScan 也能模擬密碼攻擊,拿一份常見密碼字典去比對列舉到的帳號。這項功能本質上是對網站發動暴力破解,務必只對自己擁有的網站做,而且最好在離峰時段、或在複製出來的測試環境(staging)執行,避免拖垮正式站、也避免在伺服器留下大量失敗登入紀錄。
掃描被防火牆擋住時的三種調整
如果網站前面有防火牆或速率限制,掃描常會被擋或被判定為攻擊流量。WPScan 提供幾個降噪參數,幫你降低被擋的機率,但要先說清楚:這些是為了掃自己網站時繞過自家防護用的,不是教你規避別人的防禦。
第一個是隨機使用者代理。加上 –random-user-agent,讓每次請求看起來像來自不同瀏覽器,降低被特徵辨識的機率:
wpscan --url yourwebsite.com --random-user-agent
第二個是節流。用 –throttle 指定每次請求間隔的毫秒數,放慢速度來避開速率限制偵測。例如間隔 2500 毫秒:
wpscan --url yourwebsite.com --throttle 2500
第三個是隱匿模式。–stealthy 是一個組合別名,它一次套用隨機使用者代理、被動偵測模式與被動外掛版本偵測,是降噪最省事的做法:
wpscan --url yourwebsite.com --stealthy
這裡帶到偵測模式(detection mode)的概念。WPScan 有被動(passive)、主動(aggressive)與混合(mixed)三種。被動模式只靠公開的中繼資料與標頭推測,安靜、不增加伺服器負擔,但抓到的資訊較少;主動模式直接對網站發送探測請求,資訊最完整、也最可能挖出漏洞,但會明顯增加負載、容易驚動防護;混合模式是預設值,在隱匿與徹底之間取平衡。掃自己的正式站想低調,就偏向被動;想做一次徹底盤點,再用主動。
掃描報告怎麼判讀,先修哪一個
掃完得到一長串發現,真正的工夫在「判讀與排序」,而不是把每一條都當成緊急事故。這也是多數教學講得最淺、卻最影響成效的一段。建議用三個問題替每一條發現分級。
這個漏洞能不能被未登入者直接利用:能被匿名外部觸發的漏洞(例如未驗證即可執行的遠端程式碼、未授權的 SQL Injection)風險最高,要優先處理。需要先登入、或需要管理員權限才能觸發的,相對次之。
對應元件是不是還在啟用中:掃描有時會列出已停用、甚至只是殘留檔案的舊外掛或舊主題。真正在跑的元件先修;早就不用的,直接從網站上完整移除比修補更乾淨,因為停用不等於刪除,殘留檔案一樣可能被存取。
有沒有可用的修補版本:多數已知漏洞在新版本就修好了,升級到「Fixed in」標示的版本通常就解決。若該外掛已無人維護、沒有修補版,就要評估換掉它或尋找替代方案。
排序之外,還要處理誤報(false positive)。掃描程式是靠版本比對來判斷,有時會把安全的版本或合法的檔案誤標成有漏洞,舊版工具尤其容易這樣。WPScan 的回報多半附帶 CVE 編號或漏洞標題,拿這些去對照外掛開發者的更新日誌或官方公告,確認該版本真的受影響、且你的站真的用到那段有問題的功能,再動手修。可以的話手動驗證一次,不要看到紅字就盲目升級或砍外掛,反而弄壞正常功能。
多久掃一次,能不能排程自動跑
掃描的價值來自「定期」,跑一次就放著等於沒做,因為漏洞資料庫天天在增加,今天乾淨不代表下個月乾淨。業界對頻率的建議落在一個區間:高價值或高流量的網站偏向每天到每週掃一次,一般風險的網站至少每月一次、確保一年內有十二次、間隔不會拖太長。
除了固定週期,有一個時機一定要補掃:每次更新完 WordPress 核心、外掛或主題之後。更新可能引入新元件、也可能換了有問題的版本,更新後立刻掃一次,才能確認沒有把新的破洞帶進來。
自動化的做法分兩條。走命令列的人,可以把 WPScan 指令包成腳本,用 Linux 的排程工具(cron)設定固定時間執行,再把結果寄到信箱或寫進記錄檔,一次設定之後就不必每次手動跑。走外掛路線的人,像 Jetpack Protect 這類工具本身就會定期自動比對漏洞資料庫,並在後台或以信件通知新出現的風險,連腳本都不用寫。不論哪條路,重點是讓掃描變成背景自動進行的例行公事,而不是想到才做。
弱點掃描只是開始,把它變成例行體檢
WordPress 弱點掃描不是一次性的稽核,而是要長期維持的節奏。先用 WPScan 加上漏洞資料庫 API 摸清楚自己網站從外部看起來有哪些破洞,再用「能不能被匿名利用、元件是否還在用、有沒有修補版」這三個問題把發現排序,從風險最高的開始補;補完別忘了另外做一次惡意程式檢查,確認沒有早就被植入的後門。
掃描環境怎麼選,看你的條件:有 Linux 或 Docker 就走命令列拿到最完整的控制權與排程能力;只有 Windows 又不想碰指令列,就用 Jetpack Protect 這類以 WPScan 資料庫為後盾的外掛或線上服務,同樣能做到定期比對。最後,無論用哪種工具,只對自己擁有或獲得授權的網站掃描,這是使用這類資安工具不可退讓的底線。把這套流程排進每月、每次更新後的固定行程,網站的破洞就不會在你不知情的狀態下,悄悄變成別人的入口。