APP测试之安全机制问题及Bypass
字数 1886 2025-08-25 22:58:40

APP安全测试:安全机制问题及Bypass技术详解

前言

在移动APP安全渗透测试及漏洞挖掘过程中,经常会遇到各种安全机制阻碍测试工作。本文系统总结了APP测试中常见的安全机制问题及其绕过方法,包括HTTPS信任机制、SSL证书绑定、代理检测和双向认证等问题。

常见测试障碍场景

  1. 配置代理和安装Burp证书后仍出现网络错误
  2. HTTPS数据包无法抓取
  3. 请求无法正常发送
  4. 数据包丢失

这些问题主要源于两方面:

  • 系统固有的信任机制问题(IOS/Android)
  • APK自身的安全机制(SSL证书绑定、双向校验和代理检测)

一、系统固有信任机制问题

IOS设备测试问题

现象:即使安装了Burp证书,HTTPS数据包仍无法抓取。

原因:IOS系统默认不会对第三方安装的证书开启完全信任。

解决方案

  1. 进入"设置" → "通用" → "关于本机" → "证书信任设置"
  2. 找到Burp证书并启用"完全信任"
  3. 设置完成后即可正常抓包

二、APK自有安全机制

HTTPS协议验证服务器身份的主要方式:

  1. 使用浏览器/操作系统自带的证书链
  2. 使用自签名证书
  3. 自签名证书加上SSL Pinning(证书绑定)
  4. 双向认证(客户端与服务端分别校验对方证书)

SSL Pinning绕过技术

SSL Pinning(证书绑定)是APP防止中间人攻击的常见手段,主要有两种绕过方法:

方法1:反编译篡改证书信息

步骤

  1. 反编译APK文件
  2. 篡改内部证书信息
  3. 重新打包签名

限制:如果客户端有壳保护、代码混淆或完整性自校验等防护,此方法可能失效。

方法2:Hook技术绕过

原理:通过Hook技术修改证书校验函数的执行逻辑,使校验失败时仍继续通信。

常用框架

  • Xposed框架
  • Frida框架

关键函数

  • hostnameVerifier.verify
  • checkServerTrusted
  • checkClientTrusted

具体绕过方法详解

1. 反编译APK修改证书验证逻辑

步骤

  1. 反编译APK:

    apktool.bat d -f test.apk -o test
    

    apktool -f [待反编译的apk] -o [反编译之后存放文件夹]
    
  2. 修改AndroidManifest.xml文件

  3. 重新打包:

    apktool.bat b test
    

    java -jar apktool_2.3.0.jar b ./test/
    
  4. 签名:

    java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test_signed.apk
    

    签名文件通常位于:android/build/target/product/security/

2. 用自定义CA覆盖应用程序原本的CA

3. 反编译提取APK文件并注入动态库

工具

4. Hook证书验证函数

方法:设置钩子拦截证书验证过程,强制返回验证成功。

参考:详细方法可参考"绕过安卓SSL验证证书的四种方式"

5. 使用Xposed+JustTrustMe模块

使用方法

  1. 安装Xposed框架
  2. 安装JustTrustMe模块
  3. 激活模块并重启设备

参考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);
}

解决方案

  1. 修改smali代码绕过检测
  2. 使用NOP指令移除检测方法

四、SSL双向校验绕过

现象:可以拦截到数据包,但返回异常。

解决方案

  1. 在APK的assets目录中查找客户端证书(.p12和.cer文件)
  2. 分析证书密码:
    • 静态分析代码,搜索"KeyStore"
    • 逆向分析.p12文件获取密码
  3. 在服务端安装相同的p12证书

五、签名校验(Sign)绕过

方法

  1. 反编译APK后搜索"sign"/"signature"相关字符串
  2. 定位加密算法实现
  3. 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安全测试中常见的各种安全机制及其绕过方法,包括:

  1. 系统信任机制问题及解决方案
  2. SSL Pinning的多种绕过技术
  3. 代理检测的识别与绕过
  4. 双向认证的破解方法
  5. 签名校验的绕过技巧

掌握这些技术可以帮助安全测试人员更有效地进行移动APP的安全评估和漏洞挖掘工作。需要注意的是,在实际测试中应根据具体情况选择合适的方法,并遵守相关法律法规。

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.verify checkServerTrusted checkClientTrusted 具体绕过方法详解 1. 反编译APK修改证书验证逻辑 步骤 : 反编译APK: 或 修改AndroidManifest.xml文件 重新打包: 或 签名: 签名文件通常位于: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内置了指定代理,导致无法通过抓包工具捕获数据。 示例代码 : 解决方案 : 方法1:直接修改代理设置 修改smali代码,将代理设置为本地: 方法2:Hook system.setProperty方法 强制设置代理到本地: 2. 客户端代理检测问题 现象 :APP检测到代理设置后,数据包不会通过代理发送。 示例检测代码 : 解决方案 : 修改smali代码绕过检测 使用NOP指令移除检测方法 四、SSL双向校验绕过 现象 :可以拦截到数据包,但返回异常。 解决方案 : 在APK的assets目录中查找客户端证书(.p12和.cer文件) 分析证书密码: 静态分析代码,搜索"KeyStore" 逆向分析.p12文件获取密码 在服务端安装相同的p12证书 五、签名校验(Sign)绕过 方法 : 反编译APK后搜索"sign"/"signature"相关字符串 定位加密算法实现 Hook签名验证方法,强制返回验证成功 Xposed实现示例 : 工具 :已有开源工具提供一键绕过App签名验证功能。 总结 本文系统介绍了APP安全测试中常见的各种安全机制及其绕过方法,包括: 系统信任机制问题及解决方案 SSL Pinning的多种绕过技术 代理检测的识别与绕过 双向认证的破解方法 签名校验的绕过技巧 掌握这些技术可以帮助安全测试人员更有效地进行移动APP的安全评估和漏洞挖掘工作。需要注意的是,在实际测试中应根据具体情况选择合适的方法,并遵守相关法律法规。