APP安全测试:安全机制问题及Bypass技术详解
前言
在移动APP安全渗透测试及漏洞挖掘过程中,经常会遇到各种安全机制阻碍测试工作。本文系统总结了APP测试中常见的安全机制问题及其绕过方法,包括HTTPS信任机制、SSL证书绑定、代理检测和双向认证等问题。
常见测试障碍场景
- 配置代理和安装Burp证书后仍出现网络错误
- HTTPS数据包无法抓取
- 请求无法正常发送
- 数据包丢失
这些问题主要源于两方面:
- 系统固有的信任机制问题(IOS/Android)
- APK自身的安全机制(SSL证书绑定、双向校验和代理检测)
一、系统固有信任机制问题
IOS设备测试问题
现象:即使安装了Burp证书,HTTPS数据包仍无法抓取。
原因:IOS系统默认不会对第三方安装的证书开启完全信任。
解决方案:
- 进入"设置" → "通用" → "关于本机" → "证书信任设置"
- 找到Burp证书并启用"完全信任"
- 设置完成后即可正常抓包
二、APK自有安全机制
HTTPS协议验证服务器身份的主要方式:
- 使用浏览器/操作系统自带的证书链
- 使用自签名证书
- 自签名证书加上SSL Pinning(证书绑定)
- 双向认证(客户端与服务端分别校验对方证书)
SSL Pinning绕过技术
SSL Pinning(证书绑定)是APP防止中间人攻击的常见手段,主要有两种绕过方法:
方法1:反编译篡改证书信息
步骤:
- 反编译APK文件
- 篡改内部证书信息
- 重新打包签名
限制:如果客户端有壳保护、代码混淆或完整性自校验等防护,此方法可能失效。
方法2:Hook技术绕过
原理:通过Hook技术修改证书校验函数的执行逻辑,使校验失败时仍继续通信。
常用框架:
- Xposed框架
- Frida框架
关键函数:
hostnameVerifier.verifycheckServerTrustedcheckClientTrusted
具体绕过方法详解
1. 反编译APK修改证书验证逻辑
步骤:
-
反编译APK:
apktool.bat d -f test.apk -o test或
apktool -f [待反编译的apk] -o [反编译之后存放文件夹] -
修改AndroidManifest.xml文件
-
重新打包:
apktool.bat b test或
java -jar apktool_2.3.0.jar b ./test/ -
签名:
java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test_signed.apk签名文件通常位于:android/build/target/product/security/
2. 用自定义CA覆盖应用程序原本的CA
3. 反编译提取APK文件并注入动态库
工具:
- Objection工具(项目地址:https://github.com/sensepost/objection)
4. Hook证书验证函数
方法:设置钩子拦截证书验证过程,强制返回验证成功。
参考:详细方法可参考"绕过安卓SSL验证证书的四种方式"
5. 使用Xposed+JustTrustMe模块
使用方法:
- 安装Xposed框架
- 安装JustTrustMe模块
- 激活模块并重启设备
参考:https://www.jianshu.com/p/a818a0d0aa9f
三、代理检测绕过技术
1. 客户端内置代理问题
现象:APP内置了指定代理,导致无法通过抓包工具捕获数据。
示例代码:
private void N(){
Address v0 = this.g();
if(v0 != null){
if(this.e.b().d())
n.a(v0.getHost(), v0.getPort());
}
this.f();
}
解决方案:
方法1:直接修改代理设置
修改smali代码,将代理设置为本地:
const v0, 0x22b8 // PORT:0x22b8=8888
const-string v1, "192.168.0.101" // 设置为自己的代理IP
方法2:Hook system.setProperty方法
强制设置代理到本地:
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "10.1.1.199");
System.setProperty("http.proxyPort", "80");
2. 客户端代理检测问题
现象:APP检测到代理设置后,数据包不会通过代理发送。
示例检测代码:
private boolean isWifiProxy() {
final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
String proxyAddress;
int proxyPort;
if(IS_ICS_OR_LATER){
proxyAddress = System.getProperty("http.proxyHost");
String portStr = System.getProperty("http.proxyPort");
proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
} else {
proxyAddress = android.net.Proxy.getHost(this);
proxyPort = android.net.Proxy.getPort(this);
}
return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}
解决方案:
- 修改smali代码绕过检测
- 使用NOP指令移除检测方法
四、SSL双向校验绕过
现象:可以拦截到数据包,但返回异常。
解决方案:
- 在APK的assets目录中查找客户端证书(.p12和.cer文件)
- 分析证书密码:
- 静态分析代码,搜索"KeyStore"
- 逆向分析.p12文件获取密码
- 在服务端安装相同的p12证书
五、签名校验(Sign)绕过
方法:
- 反编译APK后搜索"sign"/"signature"相关字符串
- 定位加密算法实现
- Hook签名验证方法,强制返回验证成功
Xposed实现示例:
public void initZygote(StartupParam startupParam) throws Throwable {
XposedHelpers.findAndHookMethod("java.security.Signature", null, "verify",
byte[].class, new XC_MethodHook(){
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("disabled verifysignature......");
param.setResult(Boolean.TRUE);
}
});
}
工具:已有开源工具提供一键绕过App签名验证功能。
总结
本文系统介绍了APP安全测试中常见的各种安全机制及其绕过方法,包括:
- 系统信任机制问题及解决方案
- SSL Pinning的多种绕过技术
- 代理检测的识别与绕过
- 双向认证的破解方法
- 签名校验的绕过技巧
掌握这些技术可以帮助安全测试人员更有效地进行移动APP的安全评估和漏洞挖掘工作。需要注意的是,在实际测试中应根据具体情况选择合适的方法,并遵守相关法律法规。