很多網站都有上傳功能:會員上傳大頭照、後台上傳商品圖、申請表單附上 PDF。這些功能平常不太會有人注意,但如果處理不當,上傳的檔案可能會被伺服器當成程式執行。一旦發生,攻擊者等於可以在你的網站上做任何事。
以下是我們在處理 PHP2Shell 漏洞 的同一週,另外遇到的一件事。
一、沒有人通報,是我們自己發現的
這件事沒有任何主管機關或客戶通報。我們在修正某個網站的上傳功能時往下追,發現同一種上傳寫法,也出現在其他網站共用的後台程式裡。
既然是共用的寫法,問題就不會只在一個網站。所以我們沒有只修眼前這一站,而是把使用同一套後台程式的網站全部列出來,一起檢查、一起處理,總共 19 個網站。
二、為什麼上傳的檔案會變成程式?
網站伺服器會依照檔案的類型決定怎麼處理:圖片就直接傳給瀏覽器顯示,程式檔就執行它。
問題出在兩個地方同時發生的時候:
- 上傳時沒有限制檔案格式:攻擊者可以上傳一個程式檔,或把程式檔偽裝成 PDF、圖片。
- 上傳目錄允許執行程式:檔案存好之後,只要知道網址,就能讓伺服器執行它。
兩個條件只要擋住一個,攻擊就不會成功。我們的做法是兩層都擋。

三、第一層:上傳目錄一律不執行程式
在伺服器設定上,讓上傳目錄裡的任何檔案都不會被當成程式執行。就算真的有程式檔被傳上來,它也只是一個普通檔案。
這一層不需要改網站程式,所以 19 個網站在發現問題的當天就全部完成。
四、第二層:只收白名單內的檔案,並檢查內容
伺服器那一層是保險,根本的修正還是要在程式裡做:
- 只接受白名單內的檔案格式:不是「擋掉危險的格式」,而是「只放行需要的格式」。
- 檢查檔案內容:只看副檔名不夠。內容是程式、副檔名卻改成
.pdf或.jpg的檔案,一樣要擋下來。
白名單要放行哪些格式,我們不是憑感覺訂,而是統計正式環境實際上傳過哪些格式再決定。這樣才不會為了安全,反而擋掉使用者平常要傳的檔案。
五、怎麼確認真的擋得住
修好之後,我們不是只看設定檔,而是實際去打:
- 伺服器層:每個網站都實際放一個測試用的程式檔到上傳目錄,確認它不會被執行。
- 程式層:準備 19 種偽裝檔,對每一個上傳入口逐一上傳。該擋的都要被擋下,正常的檔案也要能照常上傳。兩套測試環境都全部通過。
驗證過程中還有一個小插曲:一開始的測試腳本,曾把「檔案根本沒有存進去」誤判成「被擋下了」。之後我們規定,一定要看到擋下的原因(錯誤訊息),才算通過。
六、有沒有被入侵過?
修好不代表之前沒事,所以我們也回頭檢查:
- 上傳目錄裡的 5,000 多個檔案,沒有任何一個是程式碼。
- 存取紀錄裡,確實有外部的掃描程式一直在找上傳目錄裡的程式檔(也就是在找有沒有人留下後門),但全部都找不到。
結論是沒有發現被入侵的跡象。
七、系統升級後,這道防線更重要
這次還有一個值得記下的觀察:舊版框架內建的檢查,會順帶擋掉某些偽裝檔;新版框架不會。
也就是說,系統升級到新版之後,原本「剛好被擋住」的東西可能就擋不住了。上傳的白名單和內容檢查,不能只靠框架,要自己做好。
如果你的網站有上傳功能,可以確認這幾件事
- 網站上有哪些地方可以上傳檔案?(前台、後台、會員中心都算)
- 上傳的檔案存在哪裡?那個位置能不能執行程式?
- 上傳時是「只放行需要的格式」,還是「擋掉危險的格式」?
- 只檢查副檔名,還是也檢查檔案內容?
- 系統升級過框架版本嗎?升級後上傳的檢查有沒有重新測過?
這些問題,可以直接問負責維運的廠商。