24、Android HTTPS抓包实战案例:社交应用抓包、金融应用抓包、电商应用抓包

说实话,前面讲了那么多理论,今天终于到了大家最期待的环节——真刀真枪地干一场。

我这些年做安全测试,抓过的包没有一千也有八百。社交、金融、电商这三类,基本覆盖了市面上90%的App场景。每一类都有自己的脾气,抓包手法也得跟着变。

今天我就拿三个真实案例,带大家走一遍完整的抓包流程。嗯,踩过的坑我也会一并说出来。

案例一:社交应用抓包——以某主流聊天App为例

社交App的特点是什么?数据量大、实时性高、协议杂。我当年第一次抓这类App时,差点被WebSocket搞疯。

抓包准备

  • 设备:Root过的Pixel 3,Android 10
  • 工具:Charles 4.6 + ProxyDroid
  • 证书:系统级安装Charles CA证书

操作步骤

  1. 先把手机代理指向Charles,端口8888
  2. 在Charles上开启SSL Proxying,添加目标域名:*.xxxchat.com
  3. 打开App,随便发条消息

结果呢?一片空白。Charles上什么都没抓到。

注意: 社交App普遍使用WebSocket进行消息推送,Charles默认抓不到WebSocket流量。你需要手动在Charles的Proxy → WebSocket Settings中勾选"Enable WebSocket capture"。

开启之后,再试一次。这次能看到消息内容了,但全是乱码。

// 抓到的原始数据
{"cmd":201,"seq":123456,"data":"\u00e4\u00bd\u00a0\u00e5\u00a5\u00bd"}

这其实是Unicode转义,不是加密。我习惯用Charles的"Edit"功能,把显示编码改成UTF-8,或者直接写个Python脚本解码。

小技巧: 我一般会在Charles上挂一个"Map Local"功能,把请求映射到本地JSON文件,这样就能随意修改响应内容,测试App的容错性。

避坑指南

我曾经遇到一个社交App,它会在启动时检测代理。检测到代理就直接断网。怎么破?

用VPN转发代替代理。我推荐使用PosternDrony,它们能创建VPN隧道,把流量转发到Charles。App检测不到代理,但流量照样能抓到。

案例二:金融应用抓包——以某银行App为例

金融App是硬骨头。证书绑定、双向认证、自定义协议,能上的安全手段全上了。

我记得有一次帮某银行做渗透测试,光是绕过证书绑定就花了两天。

证书绑定绕过方案

金融App普遍使用证书绑定(Certificate Pinning)。Charles的证书会被直接拒绝。

我常用的方案有两种:

方案 原理 适用场景 难度
Xposed + JustTrustMe Hook SSL验证方法,强制信任所有证书 Android 7以下,或App未做Native层校验
Frida + ssl-pinning-bypass 动态注入,绕过证书校验逻辑 Android 7+,大部分场景
Magisk + TrustMeAlready 系统级修改,注入CA证书到信任存储 Android 7+,需要Root

我个人最常用的是Frida方案。为什么呢?因为它不需要重启App,而且能绕过大部分Native层的校验。

// Frida绕过证书绑定脚本(简化版)
Java.perform(function() {
    var TrustManager = Java.use('javax.net.ssl.TrustManager');
    var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
    
    X509TrustManager.checkServerTrusted.implementation = function(chain, authType) {
        // 什么都不做,直接返回
        return;
    };
});
核心要点: 金融App的抓包,关键不在于技术有多复杂,而在于你能否找到App的证书校验入口。我建议先用Jadx反编译,搜索"checkServerTrusted"、"pinning"、"Certificate"等关键词,定位校验代码。

双向认证的处理

有些金融App还会做双向认证——不仅App要验证服务器的证书,服务器也要验证App的证书。

这种情况下,光绕过证书绑定还不够。你需要拿到App内置的客户端证书(通常是.p12或.bks格式),导入到Charles中。

我一般会在App的assets目录或res/raw目录下找。如果找不到,就反编译dex文件,搜索"PKCS12"或"BKS"关键词。

案例三:电商应用抓包——以某头部电商App为例

电商App的特点是接口多、参数复杂、签名校验严格。你想想看,一个商品详情页可能就要调十几个接口。

抓包难点

  • 参数签名: 几乎所有请求都带sign参数,服务端会校验
  • 数据加密: 响应体可能是加密的,需要找到解密密钥
  • 风控检测: 频繁请求会被封IP或账号

实战过程

我拿一个商品搜索接口举例。抓到的请求长这样:

POST /api/search HTTP/1.1
Host: xxx.taobao.com
Content-Type: application/json
x-sign: a1b2c3d4e5f6...
x-ts: 1698765432

{"keyword":"手机","page":1}

这个x-sign就是签名。怎么生成的?我习惯用Frida Hook App的加密函数。

// Hook签名生成函数
var SignClass = Java.use('com.xxx.taobao.utils.SignUtil');
SignClass.generateSign.implementation = function(params, timestamp) {
    console.log('params: ' + JSON.stringify(params));
    console.log('timestamp: ' + timestamp);
    var result = this.generateSign(params, timestamp);
    console.log('sign: ' + result);
    return result;
};

通过Hook,我发现签名算法是MD5(params + timestamp + secretKey)。secretKey是写死在Native层的,需要用Frida的NativeFunction去读内存。

经验之谈: 电商App的签名密钥,90%都在Native层(so文件里)。我建议你用IDA Pro打开对应的so文件,搜索"MD5"、"SHA"、"sign"等字符串,很快就能定位到密钥。

风控规避

电商App的风控很敏感。我曾经因为抓包频率太高,被某电商平台封了三天账号。

我的建议是:

  • 控制请求频率,加个1-2秒的延迟
  • 使用多个账号轮换
  • 模拟真实用户行为,不要只抓一个接口

三类应用的抓包对比总结

说了这么多,我画了一张图,帮大家理清思路。

三类App抓包对比 社交应用 特点: • WebSocket实时通信 • 数据量大 • 协议混杂 抓包方案: • Charles开启WebSocket • VPN转发绕过代理检测 • 解码Unicode转义 难度:★★☆☆☆ 金融应用 特点: • 证书绑定 • 双向认证 • 安全等级最高 抓包方案: • Frida绕过证书绑定 • 提取客户端证书 • 反编译定位校验点 难度:★★★★★ 电商应用 特点: • 参数签名 • 响应加密 • 风控严格 抓包方案: • Hook签名生成函数 • 分析Native层密钥 • 控制频率防封 难度:★★★☆☆ 核心思路:先分析App的安全机制,再选择合适的绕过方案,最后控制节奏避免触发风控

三类App的抓包,说白了就是一场攻防博弈。社交App拼的是协议理解,金融App拼的是逆向能力,电商App拼的是耐心和细节。

我个人的建议是:先从社交App练手,难度低、反馈快。等熟练了再挑战电商App,最后啃金融App这块硬骨头。

最后说一句: 抓包只是手段,不是目的。我们做安全测试,最终是为了发现漏洞、修复漏洞。别为了抓包而抓包,要时刻想着"这个接口有什么安全问题"。

公众号:蓝海资料掘金营,微信deep3321