資安指南
如何確認網站或伺服器是否被入侵:共用虛擬主機、WordPress 與 VPS 的逐步檢查,以及發現異常時首先要做的事
依環境說明如何檢查自己的網站或伺服器是否遭入侵:共用虛擬主機、WordPress、Linux VPS 與 Google Search Console。管理員使用者、wp core verify-checksums、登入紀錄、authorized_keys、cron 與監聽中的連接埠,以及發現異常時的處理順序。
適合誰閱讀:在共用虛擬主機、WordPress 或 VPS 上經營網站,現在正在想「我是不是被駭了?」的個人和小型企業。本指南帶你自己檢查自己的網站和伺服器。內容依據 WordPress.org、WP-CLI、Google Search Central 的官方文件、各指令的手冊頁、日本 IPA 與 JPCERT/CC 的資料,以及 GDPR 撰寫。不涵蓋攻擊手法。
如果現在就覺得不對勁,先做這件事
在刪除或覆寫任何網站檔案之前,先複製記錄檔和整個網站(檔案與資料庫)。一旦消失,就無法再查出攻擊者是怎麼進來的。變更密碼請使用另一台已用防毒軟體掃描過的乾淨裝置。
應該懷疑遭入侵的徵兆
符合以下任何一項時,請繼續進行下方依環境的檢查。WordPress.org 的「FAQ My site was hacked」也列出了明確的遭駭徵兆,包括被搜尋引擎列入封鎖清單、主機業者停用網站,以及建立新使用者等未經授權的行為。
| 徵兆 | 在哪裡發現 |
|---|---|
| Search Console 顯示安全性問題,或 Google 寄信通知你 | Google Search Console |
| 搜尋結果顯示「This site may be hacked」(這個網站可能遭到入侵) | Google 搜尋 |
| 瀏覽器警告網站有危險,或訪客的防毒軟體發出警告 | 訪客的回報 |
| 主機業者警告網站遭竄改、發送垃圾郵件或負載過高,或停用網站 | 主機業者的郵件 |
| 有你從沒建立過的管理員使用者 | WordPress 控制台 |
| 搜尋結果出現你從沒建立過的頁面(藥品、名牌商品、大量日文頁面) | site: 搜尋 |
| 只有在手機上,或只有從搜尋進入時,才被重新導向到其他網站 | 用手機檢查 |
| 你的伺服器在寄送垃圾郵件,或達到寄信上限 | 主機業者的通知、退信 |
| CPU 或流量無故暴增 | 伺服器的監控 |
「在我的電腦上看起來沒問題」證明不了什麼
Google(web.dev)說明,有些遭入侵的網站會對不同類型的使用者顯示不同內容(cloaking):你自己開啟時頁面看起來是空的,Google 看到的卻是垃圾字詞和連結。Google Search Central 的一篇部落格文章也指出,遭入侵的網站可能只把行動裝置使用者重新導向到垃圾網域,並建議用智慧型手機從 Google 搜尋結果開啟自己的網站來確認。
依環境檢查
請檢查符合你環境的那幾列。如果你在共用虛擬主機上執行 WordPress,前兩列都適用。
| 環境 | 查看的地方 | 要找什麼 |
|---|---|---|
| 共用虛擬主機 | 控制台中的存取與錯誤記錄檔、檔案管理員、郵件寄送紀錄 | 對陌生網址的請求或大量 POST、最近修改的檔案、陌生的 .htaccess 或 PHP 檔案、寄出郵件量暴增 |
| WordPress | 控制台的「All Users」(全部使用者)和「Installed Plugins」(已安裝的外掛)、WP-CLI | 不明的管理員、你沒安裝的外掛或佈景主題、被修改的核心檔案 |
| VPS(Linux) | SSH 記錄檔、authorized_keys、cron、使用者列表、監聽中的連接埠、套件驗證 | 來自不明來源的登入、不明的公開金鑰、不明的排程工作、新的使用者、不明的監聽程式 |
| Google Search Console | 安全性問題、網址檢查工具、site: 搜尋 | Google 發現的問題和範例網址,以及 Google 在頁面上看到的內容 |
共用虛擬主機
即使沒有 SSH,控制台通常也能讓你檢查以下三件事(名稱依主機業者而異)。
- 在檔案管理員中開啟公開資料夾,依修改日期排序。留意在你沒動過的日子被變更的檔案、名稱沒有意義的 PHP 檔案,以及放在
uploads等圖片資料夾中的 PHP 檔案 - 下載存取記錄檔和錯誤記錄檔,檢查對管理區的請求(WordPress 是
/wp-login.php和/wp-admin/)來自哪裡、在什麼時間,以及有沒有對你不認得的網址的請求 - 如果看得到郵件寄送數量或紀錄,找找有沒有你沒寄出的大量郵件
也請檢查 .htaccess。WordPress.org 指出,不論感染類型為何,.htaccess 都是最常被修改和濫用的檔案之一,並說明 index.php、header.php 和 footer.php 會影響每一次頁面請求,因此是價值很高的目標。
WordPress
在控制台中檢查兩個地方。
- 「Users」(使用者)>「All Users」(全部使用者):有沒有你沒建立、角色為「Administrator」(管理員)的人?
- 「Plugins」(外掛)>「Installed Plugins」(已安裝的外掛):有沒有你沒安裝的外掛?「Appearance」(外觀)>「Themes」(佈景主題)也用同樣方式檢查
如果伺服器上可以使用 WP-CLI(WordPress 的官方命令列工具),就能自動把檔案與官方發行版比對。
# Check WordPress core files against WordPress.org checksums
wp core verify-checksums
# Also warn about non-WordPress files in the WordPress root directory
wp core verify-checksums --include-root
# Verify plugins distributed on WordPress.org
wp plugin verify-checksums --all
# List administrator accounts with their registration dates
wp user list --role=administrator結果沒問題時會顯示 Success: WordPress installation verifies against checksums.。不一致的檔案會顯示 Warning: File doesn't verify against checksum:,後面接著檔案名稱。外掛驗證是與 WordPress.org 的校驗和比對,所以付費外掛和自訂佈景主題無法用這種方式檢查。這些請向開發商重新下載同一版本來比較。
VPS(Linux)
在 VPS 上,要找的是入侵者為了再次進來而留下的東西:公開金鑰、排程工作、新的使用者,以及在監聽連線的程式。以下全部請以管理員身分在你自己的伺服器上執行。
# SSH login records (the unit is ssh on Debian/Ubuntu, sshd on RHEL-family)
sudo journalctl -u ssh --since "2026-10-01"
# Recent logins (on Debian 13, use wtmpdb last instead; install the wtmpdb and libpam-wtmpdb packages)
last -a
# Each user's last login (on Debian 13, use lastlog2 instead; install the lastlog2 and libpam-lastlog2 packages)
lastlog
# SSH public keys: the current user's (other users: /home/*/.ssh/authorized_keys) and root's
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
# Scheduled jobs (per user and system-wide)
crontab -l
sudo crontab -l -u root
sudo cat /etc/crontab
sudo ls -la /etc/cron.d
# Users, and the group with admin rights (wheel on RHEL-family)
getent passwd
getent group sudo
# Listening TCP ports and the programs behind them
sudo ss -tlnp
# Files in the web root whose contents changed in the last 7 days
sudo find /var/www -type f -mtime -7
# Have package files changed since they were installed?
sudo debsums -s # Debian/Ubuntu (needs the debsums package)
sudo rpm -Va # RHEL-family如何解讀結果:
- 在
journalctl的輸出中,檢查成功登入(Accepted)的來源 IP 是否有不是你的位址。如果什麼都沒顯示,單元名稱可能不同;請用systemctl list-units --type=service確認 SSH 服務的名稱 - 在
authorized_keys中,找找有沒有你從沒加過的公開金鑰。管理能連到伺服器的金鑰,請參考 SSH 金鑰的最小權限 - 在 cron 中,找找有沒有從不明網址下載並執行東西的行
- 在
ss的列表中,找找有沒有不是你啟動的程式在監聽 debsums -s只會列出有問題的檔案;rpm -Va會用大小(S)、摘要(5)和修改時間(T)等代碼標示被變更的檔案
不要太依賴記錄檔和指令輸出
find -mtime 看的是檔案的修改時間,而修改時間可以被竄改。debsums 的手冊本身也寫著,它作為安全工具的用處有限。記錄檔超過保存期限就會消失。而且在 Debian 13 上,last、lastb 和 lastlog 因為 2038 年問題已不再提供。每一項檢查都能給你遭入侵的證據,但什麼都沒找到,並不能證明沒事。
Google Search Console
如果你的網站還沒有在 Search Console 註冊,請先新增網站並驗證擁有權。
- 在安全性問題報告中,看看有沒有列出任何問題。問題大致分為三類:遭入侵的內容、惡意軟體或垃圾軟體、社交工程,通常會附上範例網址。有些問題沒有範例網址;Google 表示,這並不代表沒有頁面受到影響
- 在 Google 搜尋
site:你的網域,找找有沒有你從沒建立過的頁面。Google 表示,這會列出你網站的頁面,包括駭客可能新增的頁面 - 把可疑的頁面放進網址檢查工具,看看 Google 怎麼看這些頁面
補充術語:像上面這些已經發生的入侵所留下的痕跡,稱為 IOC(入侵指標)。請參考 什麼是 IOC;若要在攻擊進行中就從行為發現它,請參考 什麼是 IOA。
發現異常時首先要做的事
順序弄錯的話,不是毀掉證據,就是在攻擊者的入侵途徑還開著的情況下恢復網站。請從上往下進行。
1 — 隔離
讓網站下線,或顯示維護頁面
2 — 保存證據
把記錄檔、檔案和資料庫複製到伺服器以外的地方
3 — 更換所有憑證
控制台、FTP、SSH 金鑰、資料庫、API 金鑰(從乾淨的裝置)
4 — 回到乾淨的狀態
從入侵前的備份還原,或重建
5 — 封住入侵途徑
更新、移除不用的外掛、找出原因
6 — 審查與通報
在 Search Console 要求審查;必要時通報資料外洩
隔離:先讓網站下線
為了不讓訪客收到惡意軟體或詐騙頁面,請讓網站下線或顯示維護頁面。在 VPS 上,限制外部流量,同時保留調查所需的存取。在共用虛擬主機上,請聯絡主機業者的客服,商量怎麼讓網站下線,以及業者那邊會做什麼。WordPress.org 也建議向主機業者確認,因為在共用虛擬主機上,遭駭的影響可能不只你的網站。
保存證據:清理前先複製
WordPress.org 建議,即使環境已經受到感染,開始清理前也要再拍一次快照。Google 同樣建議在清理前,把整個網站和資料庫備份到伺服器以外的地方。存取、錯誤和 SSH 記錄檔會定期消失,所以請先保存。備份基礎 中的做法可以直接套用。
從乾淨的裝置更換所有憑證
WordPress.org 要求你變更每個存取點的密碼,包括 FTP/SFTP、WordPress 控制台、主機控制台和 MySQL,而且不只是你自己,所有能存取該環境的使用者都要變更。重新產生 wp-config.php 中的密鑰(salts),也會把仍在登入中的人登出。在 VPS 上,請產生新的 SSH 金鑰,authorized_keys 中只留下你自己的金鑰。存放在 .env 等檔案中的第三方 API 金鑰也請重新發行。
WordPress.org 指出,攻擊常常是從擁有者自己的電腦開始的,並建議也掃描這台電腦。請從掃描過的乾淨裝置進行變更,並開啟 多重要素驗證。
回到乾淨的狀態:入侵前的備份,或重建
如果你有確定早於入侵的備份,就從它還原。如果不知道攻擊者何時進來,備份越新,越可能已經被汙染。在 WordPress 上,把 wp-admin 和 wp-includes 換成官方下載的同一版本,並從來源重新取得 wp-content 中的佈景主題和外掛。在 root 可能已被取得的 VPS 上,建立一台新的伺服器、只把檢查過的資料搬過去,會比清理更可靠。
封住入侵途徑,讓對方無法用同樣方式回來
更新 WordPress 核心、外掛和佈景主題,並刪除不用的東西。常見原因包括過時外掛的漏洞、重複使用的密碼,以及從公開資料夾外洩的設定檔。Google 警告,如果不修正讓感染進來的漏洞,網站可能會再次被感染。WordPress 的加固請參考 WordPress 安全,設定檔該放在哪裡請參考 你是否把機密檔案留在公開目錄中? WordPress.org 也建議在網站清理乾淨後,再變更一次密碼。
審查與通報:Search Console,以及外洩的個人資料
如果 Search Console 列出了問題,請修正整個網站的所有問題,然後在安全性問題報告中選擇「要求審查」。在要求中說明問題、你做的修正和結果。Google 表示,審查需要幾天到幾週的時間,收到要求和完成審查時都會寄信通知你。在結果出來前重新提出,可能會讓審查時間變長。
如果聯絡表單的內容或會員資料等個人資料可能已經外洩,請參考下方的「如果個人資料可能已經外洩」。
本站的看法:檢查的目的不是宣告自己沒事,而是判斷還能信任多少
小網站常見的錯誤,是找到一個可疑檔案、刪掉,就當作處理完了。但你找到的檔案是入侵的結果,不是入侵途徑。除非封住入侵途徑和攻擊者留下的回來路徑(公開金鑰、管理員使用者、排程工作),否則同樣的事會再發生。
所以我們建議用「還能信任多少」來判斷你的發現。如果只有 WordPress 核心檔案被修改,替換核心並更換憑證,大概就能恢復。如果伺服器的 root 可能已被取得,它的記錄檔和指令輸出都不可信,所以請重建。早點劃出這條線,可以避免花了好幾天清理,最後還是得重建。
如果個人資料可能已經外洩
如果你以事業身分處理個人資料,而聯絡表單的內容或會員資料可能已經外洩,請確認你營運所在地的規定。
- 歐盟與英國(GDPR 第 33 條):在知悉個人資料外洩後,應無不當延遲地通知監管機關,並在可行的情況下於 72 小時內通知,除非外洩不太可能對個人的權利與自由造成風險。第 34 條規定了何時也必須通知受影響的人
- 日本:個人資訊保護委員會列出四種應通報的類型:敏感資料、可能造成財產損害、懷疑有不當目的,以及超過 1,000 人。未經授權存取造成的外洩,被列為不當目的類型的例子。速報須在發現後 3 至 5 天內提出,確報須在 30 天內提出(不當目的類型為 60 天),並且必須通知受影響的人
- 其他地區:請確認你所在國家的資料保護機關的規定
可以求助的地方
| 對象 | 可以做什麼 |
|---|---|
| 你的主機或 VPS 業者 | 停用網站、檢查業者端的記錄檔、調查對同一台伺服器的影響 |
| JPCERT/CC 事件應變請求(日本) | 受理一般民眾的事件通報;遭竄改的網站,會聯絡網站管理者要求修正。透過網頁表單或電子郵件通報 |
| IPA 電腦病毒與未經授權存取通報(日本) | 受理未經授權存取的受害通報,包括沒有實際損害的未遂案件 |
| 你所在國家的 CERT 或資料保護機關 | 日本以外地區的事件通報與資料外洩通報 |
| WordPress.org 支援論壇 | 詳細描述你的症狀,向社群尋求協助 |
出處(官方)
- WordPress.org:FAQ My site was hacked — wordpress.org
- WordPress.org:Administration Screens — wordpress.org
- WP-CLI:wp core verify-checksums — developer.wordpress.org
- WP-CLI:wp plugin verify-checksums — developer.wordpress.org
- WP-CLI:wp user list — developer.wordpress.org
- Google:Security issues report(Search Console 說明)— support.google.com
- Google:How do I know if my site was hacked?(web.dev)— web.dev
- Google:Fix the cloaked keywords and links hack(web.dev)— web.dev
- Google Search Central 部落格:Detect and get rid of unwanted sneaky mobile redirects(2015 年 10 月)— developers.google.com
- Google 搜尋說明:Report a problem with Google Search(關於「This site may be hacked」標示)— support.google.com
- Debian 手冊頁:journalctl(1)、last(1)、lastlog(8)、sshd(8)、crontab(1)、cron(8)、ss(8)、find(1)、debsums(1) — manpages.debian.org
- RPM:rpm(8)(解讀 --verify 的輸出)— rpm.org
- Debian 13(trixie)發行說明:last、lastb 與 lastlog 指令已被取代 — debian.org
- GDPR(Regulation (EU) 2016/679)第 33 條與第 34 條 — eur-lex.europa.eu
- 日本個人資訊保護委員會:外洩等事態的通報與對本人的通知義務化(日文)— ppc.go.jp
- 日本個人資訊保護委員會:發生外洩等事態時的應對(日文)— ppc.go.jp
- JPCERT/CC:事件應變請求(日文)— jpcert.or.jp
- IPA:電腦病毒與未經授權存取的通報(日文)— ipa.go.jp
接著讀
- 個人帳號:如何確認帳號是否遭人未經授權登入
- 當主機業者本身遭入侵時:網頁主機業者遭入侵時客戶該做的事(英文,為自己的設定無法防範的情況做準備)
- 確認檔案放在哪裡:你是否把機密檔案留在公開目錄中? / 在共用虛擬主機上不讓 .env 被公開
- WordPress:WordPress 安全:正式環境加固參考 / 常見的入侵途徑:檔案上傳漏洞(英文)
- 術語:什麼是 IOC? / 什麼是 IOA? / 什麼是後門?(英文) / 什麼是惡意軟體?
- 復原:備份基礎
FAQ
Q怎麼確認我的網站有沒有被駭?
先查看 Google Search Console 的安全性問題報告,看有沒有列出任何問題。接著在 Google 搜尋 site:你的網域,找找有沒有你從沒建立過的頁面。最後用智慧型手機從 Google 搜尋結果開啟你的網站,看看會不會被重新導向到其他地方。遭入侵的內容有時會刻意做成網站擁有者直接造訪時看不到。
Q怎麼確認我的 WordPress 網站有沒有被接管?
在控制台開啟「Users」(使用者)>「All Users」(全部使用者),找找有沒有你沒建立的管理員;再開啟「Plugins」(外掛)>「Installed Plugins」(已安裝的外掛),找找有沒有你沒安裝的外掛。如果有 WP-CLI,wp core verify-checksums 會把 WordPress 核心檔案與官方發行版比對。在 WordPress.org 上發布的外掛,可以用 wp plugin verify-checksums --all 檢查。
Q我自己開啟網站看起來很正常,但搜尋結果說它可能遭到入侵。
可能使用了隱藏內容(cloaking,對不同訪客顯示不同內容)的手法。遭入侵的頁面有時只對搜尋引擎,或只對從搜尋結果用手機進入的人,顯示垃圾內容或進行重新導向。Google 表示,這個標示會一直存在,直到擁有者在 Search Console 中修正安全性問題並要求審查。請查看安全性問題報告中的範例網址,並用網址檢查工具看看 Google 看到的內容。
Q我用的是共用虛擬主機,沒有 SSH,要怎麼檢查?
用控制台的檔案管理員依修改日期排序檔案,並下載存取記錄檔和錯誤記錄檔,找找有沒有對陌生網址的請求,或對管理區的登入。如果是 WordPress,在控制台檢查使用者和外掛。不確定時,請聯絡主機業者的客服。在共用虛擬主機上,業者有時可以檢查對整台伺服器(包括其他客戶)的影響。
Q如果什麼都沒找到,就代表安全嗎?
不是。檔案的時間戳記可以被竄改,記錄檔超過保存期限就會消失,而在攻擊者取得 root 權限的伺服器上,伺服器自己的指令輸出已經不可信。如果你有來自外部的證據,例如 Search Console 的警告或主機業者的通知,即使什麼都沒找到,也請把網站當作已遭入侵,並規劃更換憑證與重建。
Q我的網站可能外洩了個人資料,要向誰通報?
依你營運的地點而定。在日本,個人資訊保護委員會把未經授權存取造成的資料外洩列為應通報情況的例子,速報須在發現後 3 至 5 天內提出,確報須在 30 天內(懷疑有不當目的時為 60 天)提出。在歐盟與英國,除非外洩不太可能對個人造成風險,GDPR 要求在可行的情況下於 72 小時內通知監管機關。請確認你所在國家的資料保護機關的規定。