APP客户端渗透测试之通信安全

APP客户端渗透测试之通信安全

https://cloud.tencent.com/developer/article/1517561

https://mp.weixin.qq.com/s/M1JdPGei-jaIX-LEw5K5NA

1. 使用ALLOW_ALL_HOSTNAME_VERIFIER忽略SSL证书域名验证

检测项概述

App在使用HTTPS相关函数时,如果调用setHostnameVerifier设置了ALLOW_ALL_HOSTNAME_VERIFIER或者AllowAllHostnameVerifier,SSLSocketFactory会忽略证书中的域名和真实域名是否匹配,导致在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。

测试详情

  1. 反编译apk文件,查看伪源代码,搜索ALLOW_ALL_HOSTNAME_VERIFIERAllowAllHostnameVerifier关键词,定位到对应的代码段,确认是否存在问题,如下图位不存在问题图片

如下图为存在问题的案例:

tips:有些APP能根据关键词定位到漏洞代码,但是需要关注这代码是不是第三方组件的还是自己实现的,如下代码来自 第三方库 com.loopj.android.http(即著名的 Android Async HTTP 库,也称 LoopJ,这是一个较老的 Android 网络请求库(现已基本被 Retrofit + OkHttp 取代)。

需要自己去验证App 直接或间接调用了 getFixedSocketFactory()getNewHttpClient(null),就会启用这个“信任所有证书 + 忽略主机名”的危险配置;没有直接或间接调用—低风险,直接调用了—高风险

2.自定义HostnameVerfier忽略SSL证书域名验证

检测项概述

App在使用HTTPS相关函数时,在setHostnameVerifier方法中使用自定义的HostnameVerifier,同时没有在该类的实现代码中进行域名校验,导致在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。

测试详情

1.在反编译得到的伪代码中搜索关键词setHostnameVerifier,发现在第三方代码中存在不合理的实现,但是并未被调用:

3. 自定义X509TrustManager未正确校验SSL证书链

检测项概述

App在使用HTTPS相关函数时,没有正确编写X509TrustManager类的相关函数,导致TrustManager无法校验证书的可靠来源。后果是在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。

测试详情

1.对APP进行反编译,搜索checkClientTrusted/checkServerTrusted关键词,分析相关代码,发现在com.zcy.gov.log.network.LogConfigClient类中实现自定义X509TrustManager时未能正确实现checkServerTrusted和checkClientTrusted方法:

不会分析直接让AI帮忙分析

测试结果

中风险。

修复建议

尽量不要使用自定义的X509TrustManager类进行证书校验;严格按照官方文档进行SSL Pinning的编写。

4.使用不安全的HTTP协议进行通信

检测项概述

应用数据交互采用明文传输数据、没有加密、完整校验等机制,在不可信的网络环境下,网络请求依然可以被进行中间人攻击,导致传输过程中的敏感信息能够被第三方程序监听,截获,篡改,重放等。

测试详情

1.使用抓包工具,抓取数据包查看发现使用了安全的HTTPS协议进行通信

测试结果

安全。

5. WebClient忽略SSL证书校验异常

检测项概述

App使用了WebViewClient进行网络数据交互,但没有正确处理onReceivedSslError函数,在该函数中忽略了证书错误。后果是在不可信的网络环境下,网络请求依然可以被进行中间人攻击(Man-in-the-MiddleAttack),导致传输过程中的敏感信息能够被第三方程序监听、截获、篡改、重放等。 Android系统内置了一些可信机构办法的证书,可用于作HTTPs证书校验。实际上,使用Webview组件进行HTTPs通信,其证书验证环节也是系统默认会去做的。若发现证书不合法,Webview将显示一个空白页面,其错误在onReceivedSslError()这个方法里进行处理。使用Webview进行HTTPs通信应当遵循安全规范:onReceivedSslError()方法里不能简单地用proceed()方法进行处理,建议给用户一定的提示(如“SSL证书错误,是否继续连接”等)

测试详情

  1. 查看反编译后的伪源代码,搜索onReceivedSslError 关键词,查看其中是否简单的使用了proceed()方法进行处理,如果是的话即存在问题,如下图:

测试结果

中风险。

修复建议

一般来说,使用Webview连接带有可信机构颁发证书的HTTPs站点,onReceivedSslError()方法里无需作任何处理(系统默认是拒绝连接的)。如果要重写WebViewClient类的onReceivedSslError函数,请不要使用paramSslErrorHandler.proceed();忽略证书校验异常

安全写法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    // 显示错误提示,让用户决定是否继续(但通常不应继续)
    // 或直接取消加载
    handler.cancel();  //一律拒绝
}

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    String url = view.getUrl();
    if (url != null && url.startsWith("https://trusted-intranet.example.com")) {
        // 仅内网自签名站点可放行(需结合其他验证)
        handler.proceed();
    } else {
        handler.cancel(); // 其他情况一律拒绝
    }
}

6. 证书明文存储

检测项概述

应用中的证书文件被用来验证服务器的合法性,以及在与服务器通信的过程中对传输数据进行加密、解密,保证数据传输的保密性、完整性。证书文件明文存储可能导致如下风险:

  1. 攻击者可以篡改明文存储的公钥证书,进行中间人攻击,解密通过HTTPS协议传输的数据,窃取用户的账号、密码等敏感信息。

2. 攻击者可以利用泄露的明文证书,批量向服务器发送数据请求,进行注册、刷单等操作,导致服务器相应异常或者损害开发者的利益等。

测试详情

1
2
$extensions = @("*.crt", "*.cer", "*.p12", "*.pfx", "*.jks", "*.bks", "*.key", "*.pem")
Get-ChildItem -Path "D:\Tools\Android\APKTOOL\base" -Include $extensions -Recurse -File | Select-Object FullName, Length

或者使用everything

1
path:D:\Tools\Android\APKTOOL\base ext:.crt|.cer|.p12|.pfx|.jks|.bks|.key|.pem

不输出文件信息则安全

特殊情况:有些开发会将证书文件命名为png/jpg这种图片文件

1.基于文件内容查找
1
path:D:\Tools\Android\APKTOOL\base content:"-----BEGIN CERTIFICATE-----"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 定义要扫描的目录
$dir = "D:\Tools\Android\APKTOOL\base"

# 获取所有“图片”文件(或其他可疑扩展名)
$suspiciousFiles = Get-ChildItem -Path $dir -Include *.png, *.jpg, *.jpeg, *.gif, *.dat, *.bin, *.txt -Recurse -File

# 遍历并检查是否包含证书特征
foreach ($file in $suspiciousFiles) {
    # 尝试读取前 200 字节(避免大文件卡顿)
    try {
        $bytes = [System.IO.File]::ReadAllBytes($file.FullName)
        if ($bytes.Count -gt 0) {
            # 转为文本(仅用于匹配 ASCII 片段)
            $text = [System.Text.Encoding]::ASCII.GetString($bytes[0..([Math]::Min(199, $bytes.Count-1))])
            
            if ($text -match "-----BEGIN.*CERTIFICATE-----" -or $text -match "PKCS") {
                Write-Host "[!] 可疑证书文件: $($file.FullName)" -ForegroundColor Red
                # 可选:输出文件类型猜测
                if ($text -match "-----BEGIN") { Write-Host "    类型: PEM 证书/私钥" }
                elseif ($text -match "PKCS") { Write-Host "    类型: PKCS#12 (p12/pfx)" }
            }
        }
    } catch {
        # 忽略无法读取的文件
    }
}

2.frida 动态hook证书文件

7. 敏感数据明文传输

检测项概述

应用数据交互采用明文传输数据、没有加密、完整校验等机制,在不可信的网络环境下,网络请求依然可以被进行中间人攻击,导致传输过程中的敏感信息能够被第三方程序监听,截获,篡改,重放等。

测试详情

1.抓取登录、请求账户信息的数据包,查看数据包,发现进行base64加密传输

测试结果

安全

By Lsec
最后更新于 Dec 30, 2025 16:00 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ