24、Android HTTPS抓包实战案例:社交应用抓包、金融应用抓包、电商应用抓包
说实话,前面讲了那么多理论,今天终于到了大家最期待的环节——真刀真枪地干一场。
我这些年做安全测试,抓过的包没有一千也有八百。社交、金融、电商这三类,基本覆盖了市面上90%的App场景。每一类都有自己的脾气,抓包手法也得跟着变。
今天我就拿三个真实案例,带大家走一遍完整的抓包流程。嗯,踩过的坑我也会一并说出来。
案例一:社交应用抓包——以某主流聊天App为例
社交App的特点是什么?数据量大、实时性高、协议杂。我当年第一次抓这类App时,差点被WebSocket搞疯。
抓包准备
- 设备:Root过的Pixel 3,Android 10
- 工具:Charles 4.6 + ProxyDroid
- 证书:系统级安装Charles CA证书
操作步骤
- 先把手机代理指向Charles,端口8888
- 在Charles上开启SSL Proxying,添加目标域名:*.xxxchat.com
- 打开App,随便发条消息
结果呢?一片空白。Charles上什么都没抓到。
开启之后,再试一次。这次能看到消息内容了,但全是乱码。
// 抓到的原始数据
{"cmd":201,"seq":123456,"data":"\u00e4\u00bd\u00a0\u00e5\u00a5\u00bd"}
这其实是Unicode转义,不是加密。我习惯用Charles的"Edit"功能,把显示编码改成UTF-8,或者直接写个Python脚本解码。
避坑指南
我曾经遇到一个社交App,它会在启动时检测代理。检测到代理就直接断网。怎么破?
用VPN转发代替代理。我推荐使用Postern或Drony,它们能创建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要验证服务器的证书,服务器也要验证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的风控很敏感。我曾经因为抓包频率太高,被某电商平台封了三天账号。
我的建议是:
- 控制请求频率,加个1-2秒的延迟
- 使用多个账号轮换
- 模拟真实用户行为,不要只抓一个接口
三类应用的抓包对比总结
说了这么多,我画了一张图,帮大家理清思路。
三类App的抓包,说白了就是一场攻防博弈。社交App拼的是协议理解,金融App拼的是逆向能力,电商App拼的是耐心和细节。
我个人的建议是:先从社交App练手,难度低、反馈快。等熟练了再挑战电商App,最后啃金融App这块硬骨头。
公众号:蓝海资料掘金营,微信deep3321