🗺️ 資安考證地圖

OWASP Top 10:網頁應用十大風險

網站最常出事的十種原因,2021 與 2025 兩版一起看,再動手把越權、組態錯誤和危險寫法一個個修掉。

2021/2025 兩版對照 存取控制失效與 IDOR 安全程式寫法六原則

💡 先搞懂問題:為什麼需要一份「十大清單」

一個網站要上線前,資安人員回報「系統有風險」,開發團隊接著會問:是哪一種風險、嚴不嚴重、先修哪一個?如果每個人用自己的說法描述問題,同一個漏洞在測試報告裡可能叫「越權」、在工單裡叫「權限 bug」、在廠商簡報裡又換一個名字,很難比較,也很難排優先順序。更常見的情況是,大家把注意力放在聽起來很厲害的攻擊手法上,卻忘了最常出事的其實是「忘記檢查這個人能不能看這筆資料」這類基本功。

OWASP(Open Worldwide Application Security Project,開放全球應用程式安全計畫,舊名 Open Web Application Security Project)是一個非營利的開放社群。它蒐集大量網頁應用程式的檢測資料,再加上業界從業人員的問卷意見,每隔幾年整理出一份「網頁應用最重大的十類風險」,就是 OWASP Top 10。它不是法規,也不是完整的安全標準,而是一份讓開發、測試、管理三方有共同語言的「優先注意清單」。

打個比方:消防局每年公布「住宅火災十大原因」,第一名是電線走火,第二名是爐火忘了關。住戶不需要讀懂燃燒理論,只要照著清單一項一項檢查家裡,就能擋掉大部分的起火可能。
回到資安,火災原因統計對應的是 OWASP 從測試資料歸納出的弱點類型;「十大原因」對應 A01 到 A10 這十個類別;住戶照清單自我檢查,對應開發與測試時逐項對照自己的系統。

這個比喻有兩個地方容易誤會。第一,火災原因多半是單一事件,但 OWASP 的每一項是「一大類弱點」,底下包含許多具體的弱點類型(以 CWE 編號表示),例如「注入」底下就有 SQL 注入、命令注入、XSS 等。第二,清單只列出最常見、影響最大的十類,清單外的問題(例如業務邏輯漏洞)一樣會出事,所以它適合當起點,不適合當「全部做完就安全」的終點。

一次網頁請求,十大風險各埋在哪裡

下面把一個典型網站畫成一張圖:使用者從瀏覽器送出請求,經過登入、應用程式、資料庫,旁邊還有設定、第三方元件、更新管線和日誌。點圖上任一個標籤,看那一類風險出在什麼位置(標籤用 2021 版編號,考題多半用這一版)。

A04 設計藍圖 使用者瀏覽器 A07 登入驗證 網站應用程式 A01 這筆資料你能看嗎 A03 輸入被當成指令 2025 新增:出錯時怎麼辦 A05 組態設定 A06 第三方元件 A02 資料庫與加密 A10 伺服器對內連線 A09 日誌與告警 A08 更新與建置

外圍虛線框代表「設計」:A04 不是某個元件,而是整張藍圖有沒有先想過會被怎麼濫用。灰色虛線標籤是 2025 版新增的類別。

點左邊(手機在上方)的任一標籤

每個標籤都是一類風險出現的位置。你會發現大部分風險和「攻擊技巧」無關,而是權限沒檢查、設定沒關好、元件沒更新這類管理與寫法上的疏忽。

圖上的箭頭是一次請求的路徑:先登入,再由應用程式處理,最後讀寫資料庫或對外連線;十個標籤分別標出路上最容易出錯的點。

🎮 互動實驗室

五個實驗室由淺入深:先認識兩個版本的十張卡片,再動手重現最常見的越權、把漏洞分到正確類別、關掉組態錯誤,最後比較危險寫法與安全寫法。所有畫面都是頁面內的假資料,不會連到任何真實網站。

1十格卡片牆:2021 與 2025 切換

切換版本,看十張卡片怎麼重新排列。每張卡右上角的小標籤告訴你這一類在另一版的位置;點任一張卡,下方會用白話說明「是什麼問題、真實情境、怎麼防」。

版本

點一張卡片看說明

建議先從 A01 看起,它在兩版都排第一。

排名怎麼移動:兩版對照連線圖

橘色實線=排名上升,灰色實線=下降,淺灰=名次不變,虛線=併入其他類別;右側深色字的 A10 是 2025 新增類別。點圖上任一個類別名稱,會同步選取上方的卡片。

目前顯示 2021 版。卡片的順序就是 A01 到 A10 的排名,右上角標籤是這一類在 2025 版的去向。

2IDOR 越權模擬:改一個數字就看到別人的訂單

你以會員「小美」(會員編號 M-207)登入一個虛構的購物網站,自己的訂單是 1040 和 1043。試著把網址最後的訂單編號改成別的數字,再切換伺服器的三種寫法,看結果有什麼不同。這種「換掉請求裡的物件編號就拿到別人資料」的漏洞叫 IDOR(Insecure Direct Object Reference,不安全的直接物件參照),在 API 領域也稱 BOLA,屬於 A01 存取控制失效。

伺服器寫法
shop.example/orders?id=
0看到別人的訂單
0送出的請求
0被伺服器擋下

時序圖:每送出一次請求,箭頭會依序走一遍。只有寫法 ③ 會出現中間那道「擁有者檢查」。


      
伺服器存取紀錄(模擬)
目前伺服器用寫法 ①:它只看網址裡的訂單編號,查到就回傳,完全不管是誰在問。

3分類遊戲:這個漏洞屬於哪一項

每一關是一段虛構的事件描述,請選出它最符合的類別。可以切換用 2021 或 2025 版的編號作答;同一個事件在兩版的編號可能不一樣,這正是新舊版最容易搞混的地方。

作答版本
請讀完事件描述,想想問題的根源是「權限沒檢查」「設定沒關好」「元件沒更新」還是「輸入被當成指令」,再選類別。

4組態錯誤檢查清單:把開著的門一扇扇關上

下面是一台「準備上線」的虛構網站伺服器,程式碼本身沒有漏洞,但設定有八個常見疏失。勾選你要修正的項目,風險分數會即時下降(分數與權重為教學示意,不是正式評分方法)。

上方是風險儀表;下排八扇門對應左邊八個項目,紅色表示還開著,修正後變成綠色關上。

每勾一項,就等於關掉一個攻擊者不用寫任何程式就能利用的入口;儀表指針會跟著下降。

5安全寫法 before/after:六個原則各跑一次

選一個原則,左邊是常見的危險寫法、右邊是修正後的寫法(虛構的精簡程式,類 Python 語法),紅底與綠底標出差異所在。再點下方的測試輸入,比較兩種寫法跑出來的結果。

修正前
修正後
測試輸入
修正前的結果先點一個測試輸入
修正後的結果先點一個測試輸入
選一個原則開始。

📘 原理補完:把比喻接回技術細節

清單是怎麼排出來的

OWASP 先向資安廠商與測試團隊蒐集大量應用程式的檢測結果,把每個發現對應到 CWE(Common Weakness Enumeration,通用弱點列舉)這種「弱點類型編號」,再把相關的 CWE 歸成類別,綜合發生率、可利用性、影響等因素排序。

但測試資料只看得到「工具已經會測」的問題,新興風險往往還沒反映在數據裡。所以十個類別中只有八個由資料決定,另外兩個由業界從業人員的社群問卷選出。2021 版由問卷選出的是 A09 記錄監控失效與 A10 SSRF;2025 版則是 A03 軟體供應鏈失效與 A09 記錄告警失效。記錄類問題很難用自動化工具測出來,所以連續幾版都是靠問卷擠進榜內。

理解這個做法有助於判斷:排名反映的是「常見而且影響大」,不代表排第十的就可以忽略,也不代表每個網站的第一大風險都一定是 A01。

大量應用程式的檢測資料 對應到弱點類型(CWE) 歸成類別並排序 發生率、可利用性、影響 資料選出 8 類 問卷選出 2 類 OWASP Top 10

虛線框代表測試資料看不到、由從業人員投票補進來的類別。

2021 → 2025 改了什麼

2025 版於 2025 年 11 月在 OWASP Global AppSec USA 大會以候選版(Release Candidate)公布,目前 OWASP 官方專案頁已將它列為最新發布的版本。不過國內考題多半仍沿用 2021 版的編號,作答時先看題目寫的是哪一版;沒寫版本時,以 2021 版理解最保險。兩版最重要的變化有三個:SSRF 併入 A01 存取控制失效;「危險或過舊的元件」擴大成「軟體供應鏈失效」並升到第三;新增「例外狀況處理不當」。其餘多半是名次移動或名稱微調。

2021 版2025 版變化重點
A01 存取控制失效A01 存取控制失效仍居第一,並把 SSRF 納入同一類
A02 加密機制失效A04 加密機制失效下降兩名,內容不變
A03 注入A05 注入下降兩名,仍包含 SQL 注入、命令注入、XSS
A04 不安全設計A06 不安全設計下降兩名
A05 安全設定錯誤A02 安全設定錯誤上升三名,雲端與容器讓「設定」決定越來越多行為
A06 危險或過舊的元件A03 軟體供應鏈失效範圍擴大:不只元件有漏洞,還包括建置系統、套件庫與散佈管道被入侵
A07 識別與驗證失效A07 驗證失效名次不變,名稱精簡
A08 軟體及資料完整性失效A08 軟體或資料完整性失效名次不變
A09 安全記錄及監控失效A09 安全記錄及告警失效名次不變,改名強調「告警」:有紀錄但沒人被通知,等於沒記錄
A10 伺服端請求偽造(SSRF)(併入 A01)不再單獨列項
(無)A10 例外狀況處理不當新類別:錯誤處理不當、出錯時預設放行、交易做一半沒回滾

中文名稱為本頁採用的常見譯名,各單位譯法略有差異(例如「存取控制失效」也有人譯作「權限控制失效」);對照時以英文原名與編號為準。

注入、XSS 與 CSRF:這裡只簡短帶過

注入(Injection)的共同根源是「把使用者輸入當成指令的一部分」,包含 SQL 注入、作業系統命令注入、LDAP 注入等;2021 版起,跨站腳本 XSS 也併入注入類。對策的核心是讓指令與資料分開:資料庫用參數化查詢,顯示到頁面時做輸出編碼,所有輸入在伺服器端驗證。CSRF(跨站請求偽造)則不屬於注入類,它是借用受害者已登入的身分送出非本意的請求,在 OWASP 的弱點對應裡被放在存取控制相關的類別。這三種攻擊的逐步模擬與防禦,請看〈SQL 注入、XSS 與 CSRF〉互動教學。

存取控制與驗證:兩道不同的門

A07 驗證失效和 A01 存取控制失效最常被混在一起。驗證(Authentication)回答「你是誰」,是大門口的警衛核對證件;授權與存取控制(Authorization / Access Control)回答「你可以做什麼、看哪些資料」,是進門後每一間辦公室的門禁。

實驗室 2 的小美已經正常登入,驗證這一關完全沒問題;出事的是登入之後,伺服器沒有檢查「訂單 1041 是不是她的」。所以改網址看到別人資料屬於 A01,不是 A07。反過來說,弱密碼、不擋撞庫、登出後工作階段(session)沒失效,讓人冒用身分進門,才是 A07。

存取控制的原則是「預設拒絕」:除了公開資源,每個請求都要在伺服器端檢查身分與資料歸屬。把按鈕藏起來、在前端 JavaScript 判斷權限,都只是介面效果,攻擊者可以直接送請求繞過。

使用者 ① 驗證 你是誰? 登入之後 ② 授權:允許 自己的訂單 ② 授權:拒絕 別人的訂單 ② 授權:拒絕 管理後台 A07 驗證失效 大門被騙過:弱密碼、 撞庫、登出後沒失效 A01 存取控制失效 進門後每間都打得開: ② 這道門沒有檢查

①是大門警衛,②是每一間房的門禁。A01 出事的位置在②。

SSRF:讓伺服器替攻擊者跑腿

很多網站有「貼上網址,由伺服器去抓內容」的功能,例如用網址匯入大頭貼、產生連結預覽。伺服器通常位在防火牆內側,看得到外人看不到的內部網路;如果它不檢查目的地,攻擊者就能把網址換成內網管理介面或雲端主機的中繼資料服務(可能含有臨時憑證),讓伺服器替他去讀,再把結果帶回來。這就是 SSRF(Server-Side Request Forgery,伺服端請求偽造),2021 版的 A10。2025 版把它併入 A01,理由很直接:本質上是伺服器替使用者存取了他沒有權限存取的資源。

上方是網際網路,虛線是防火牆,下方是內部網路。按「下一步」讓請求一段一段走。

伺服器防護

第 0 步:準備

網站提供「用網址匯入圖片」功能。防火牆只允許外部連到網站伺服器的 443 埠,內網管理介面從外面是連不到的。

還沒開始。按「▶ 下一步」看請求怎麼繞過防火牆。

防禦重點:在伺服器端用白名單限制可連的網域、協定與埠;把應用伺服器對內網的連線用網路分段隔開;不要把抓到的原始回應直接回傳;停用自動跟隨轉址。只用黑名單過濾「內網 IP 字串」不夠,同一個位址有很多種寫法,也可能透過轉址或 DNS 繞過。

供應鏈(A06 → A03)與完整性(A08)

現代網站的程式碼大部分來自開源套件。2021 版的 A06「危險或過舊的元件」談的是用了已知有漏洞、或已停止支援的元件,而且常常連自己用了哪些都不知道;2021 年底 Log4j 漏洞(Log4Shell)爆發時,許多組織花了好幾天才盤點出受影響的系統。2025 版把它擴大為 A03「軟體供應鏈失效」,範圍涵蓋整條鏈:套件庫被植入惡意版本、建置與 CI/CD 管線被入侵、更新伺服器被利用來散佈惡意程式。A08「軟體及資料完整性失效」則聚焦在一個動作:拿到程式或資料時,有沒有驗證它的來源與完整性(例如更新檔沒驗證數位簽章就安裝、從不受信任的來源載入腳本、反序列化不受信任的資料)。

點鏈上的任一環,看這一環可能出什麼事、該怎麼防。左側橘色長條代表 2025 版 A03 涵蓋的範圍。

點左邊(手機在上方)的任一環

從開源套件庫一路到使用者安裝更新,每一環都可能被攻擊者利用,自己寫的程式再安全也擋不住。

鏈條由上往下是軟體從「別人的元件」變成「使用者手上的產品」的過程。

對應的管理工具:SCA(軟體組成分析)自動找出用了哪些元件並比對已知漏洞;SBOM(軟體物料清單)是元件清單本身;數位簽章與來源證明確認「這個檔案真的是那個人建出來、沒被改過」。細節可看地圖上的「SCA、SBOM 與供應鏈」節點。

2025 新增:例外狀況處理不當

程式在正常情況下都跑得對,問題常出在「不正常」的時候:參數缺了、資料庫連不上、磁碟滿了、交易做到一半失敗。2025 版新增的 A10「例外狀況處理不當」(Mishandling of Exceptional Conditions)專門收這類問題,典型情況有三種:錯誤訊息把資料表名稱、程式路徑、堆疊追蹤(stack trace)等內部資訊洩漏給使用者;出錯時預設放行(fail open);多步驟交易失敗卻沒有整筆回滾,例如已經扣款卻沒入帳。

對策是在錯誤發生的地方就處理,出錯時預設拒絕(fail closed)並整筆回滾;對使用者只顯示一般訊息,詳細內容寫進日誌;再用限速與資源配額,避免資源被耗盡。要注意,2021 版考題把「錯誤頁面顯示堆疊追蹤」當作 A05 安全設定錯誤的典型例子,看到這類題目時仍以題目採用的版本判斷。

授權服務突然連不上 預設放行 Fail Open 預設拒絕 Fail Closed 捕捉到錯誤後 當作「有權限」 捕捉到錯誤後 一律拒絕並記錄 任何人都進得去 服務照常,資料外洩 暫時無法使用 不方便,但資料安全

同一個錯誤,兩種處理方式。安全上的預設值應該是右邊。

安全程式寫法六原則

上面各類風險,落到寫程式的層次,可以收斂成六個習慣。它們各守一個位置,彼此不能互相取代:做了輸入驗證,仍然要用參數化查詢與輸出編碼;前端檢查只是為了使用者體驗,真正的檢查一定在伺服器端。實驗室 5 可以逐一比較修正前後的寫法。

左欄是資料往下走進資料庫,右欄是資料往上回到畫面。點任一個編號看說明。

點圖上的編號

六個原則分別守在資料流的不同位置:入口、查詢、輸出、連線身分、錯誤處理與機敏資料保管。

資料從使用者流進資料庫,再從資料庫流回瀏覽器,每經過一個關卡就有一個對應的寫法原則。

易混淆整理

存取控制失效 vs 驗證失效登入後能看、能做超出權限的事是 A01;登入機制本身被繞過、被猜中或被冒用是 A07。
加密機制失效 vs 安全設定錯誤用 HTTP 明文傳帳密、用 MD5 存密碼是加密失效;預設帳密沒改、雲端儲存設成公開是設定錯誤。
不安全設計 vs 寫錯程式設計本身沒考慮濫用情境,程式照規格寫得再完美也補不起來;實作錯誤則是設計沒問題、寫的時候出錯。
SSRF vs CSRFSSRF 讓「伺服器」替攻擊者發請求;CSRF 讓「使用者的瀏覽器」在不知情下發請求。
元件漏洞(A06/A03)vs 完整性(A08)元件本身有已知漏洞是 A06;拿到的檔案沒驗證來源或被竄改卻照樣信任是 A08。
輸入驗證 vs 輸出編碼輸入驗證在資料進來時擋掉不合格的內容;輸出編碼在顯示時讓內容只能被當成文字。防 XSS 兩者都要。

OWASP 另有針對不同對象的清單,例如 API Security Top 10(2023 版第一名是物件層級授權失效 BOLA,也就是 API 版的 IDOR)、Mobile Top 10、LLM 應用 Top 10;要逐條驗證應用程式安全要求時,則用 ASVS(應用程式安全驗證標準)。Top 10 是風險意識清單,ASVS 才是可以拿來驗收的標準。

✅ 自我檢測

六題情境題,點選答案後會立刻顯示對錯與解析。

🎯 重點整理:考前 30 秒版

  1. OWASP Top 10 是網頁應用最常見、影響最大的十類風險清單,用來建立共同語言與排優先順序;它不是完整標準,要逐條驗收應用程式安全要求用 ASVS。
  2. 2021 版依序為:A01 存取控制失效、A02 加密機制失效、A03 注入、A04 不安全設計、A05 安全設定錯誤、A06 危險或過舊的元件、A07 識別與驗證失效、A08 軟體及資料完整性失效、A09 安全記錄及監控失效、A10 SSRF。
  3. 2025 版三大變化:SSRF 併入 A01;A06 擴大為 A03 軟體供應鏈失效;新增 A10 例外狀況處理不當。另外安全設定錯誤升到 A02。題目沒寫版本時,多半用 2021 編號。
  4. 改網址或參數中的編號就看到別人資料(IDOR/BOLA)屬於 A01,解法是伺服器端逐筆檢查資料歸屬、預設拒絕;隱藏按鈕或前端檢查都擋不住。
  5. 預設帳密未改、雲端儲存設成公開、正式環境開除錯模式屬於安全設定錯誤;HTTP 明文傳輸敏感資料、用無鹽 MD5 存密碼屬於加密機制失效。
  6. 注入包含 SQL、作業系統命令、LDAP 注入與 XSS,不包含 CSRF;根治方式是讓指令與資料分離。
  7. 安全寫法六原則:伺服器端輸入驗證(白名單)、參數化查詢、輸出編碼、最小權限、錯誤訊息不洩漏內部資訊、機敏資料不寫死在程式碼。