6、HTTPS抓包原理:中间人攻击原理、证书伪造、SSL剥离攻击

说实话,很多做Android开发的朋友一听到「HTTPS抓包」就觉得头大。总觉得这玩意儿太底层,跟自己没关系。但我在实际项目里踩过太多坑了——有一次线上支付接口突然报证书错误,排查了整整两天,最后发现是第三方SDK偷偷把证书绑定给改了。嗯,从那以后我就把HTTPS抓包原理当成了必修课。

今天咱们就来聊聊,HTTPS抓包到底是怎么一回事。说白了,就是中间人攻击(MITM)的实战应用。你想想看,HTTPS本身是安全的,那抓包工具凭什么能解密你的流量?答案很简单——它在你和服务器之间,扮演了一个「中间人」的角色。

中间人攻击原理

中间人攻击,英文叫Man-in-the-Middle Attack,简称MITM。我习惯叫它「二五仔攻击」——表面上两边都跟你握手,实际上两边都在骗你。

正常的HTTPS通信流程是这样的:

  1. 客户端向服务器发起TLS握手
  2. 服务器返回数字证书
  3. 客户端验证证书合法性
  4. 协商对称密钥,建立加密通道

但中间人攻击介入后,流程就变了味:

  1. 客户端向服务器发起连接,但被中间人截获
  2. 中间人伪装成服务器,向客户端返回自己的伪造证书
  3. 客户端(如果没有严格验证)接受了伪造证书
  4. 中间人同时与真实服务器建立合法连接
  5. 所有数据都经过中间人转发,明文可见

核心要点:中间人攻击成功的关键,在于客户端是否严格验证了服务器证书。如果客户端「信任」了中间人的伪造证书,那整个加密通道就形同虚设。

我在一次安全审计中遇到过这样的情况:某个金融App的登录接口,居然没有做证书校验。我用Fiddler一抓,用户名密码直接明文显示在请求体里。你想想看,这要是被恶意WiFi劫持了,后果不堪设想。

证书伪造

证书伪造是中间人攻击的核心技术。抓包工具(比如Charles、Burp Suite)之所以能解密HTTPS流量,就是因为它生成了一个「根证书」,并让你安装到设备上。

具体流程是这样的:

  • 生成根证书:抓包工具自己创建一个CA根证书
  • 安装到设备:你把这个根证书安装到Android系统的信任存储中
  • 动态签发:每次抓包时,工具用这个根证书动态签发目标域名的证书
  • 完成欺骗:客户端信任了根证书,自然也就信任了动态签发的域名证书

说白了,这就是「我信任你,所以你说谁可信,我就信谁」的逻辑。但这里有个大坑——

警告:Android 7.0(API 24)及以上版本,系统默认只信任系统级CA证书,不信任用户安装的证书。这意味着,你装的那些抓包工具根证书,默认情况下对App是无效的!

为什么会这样?因为Google也意识到了中间人攻击的风险。很多恶意软件就是通过诱导用户安装伪造证书来实现流量劫持的。所以从Android 7.0开始,系统做了这个安全加固。

那抓包工具怎么应对?有两种常见方式:

  • Root设备:把用户证书移动到系统证书目录(/system/etc/security/cacerts/)
  • 修改App配置:在App的AndroidManifest.xml中设置network_security_config,允许用户证书

我个人习惯用第一种方式,因为不需要改App代码。但要注意,移动系统证书需要root权限,而且不同Android版本的证书格式可能不一样——我踩过这个坑,Android 10的证书目录结构跟Android 8完全不同。

SSL剥离攻击

SSL剥离攻击,也叫SSL Stripping,是另一种更「阴险」的攻击方式。它不伪造证书,而是直接让HTTPS降级成HTTP。

攻击流程是这样的:

  1. 用户输入网址(比如 https://example.com)
  2. 中间人拦截请求,把HTTPS链接替换成HTTP链接
  3. 中间人自己跟服务器建立HTTPS连接
  4. 用户看到的是HTTP页面,所有数据明文传输

你想想看,用户明明输入的是HTTPS地址,结果实际走的却是HTTP。浏览器地址栏的小锁图标不见了,但很多用户根本不会注意到这个细节。

避坑指南:我曾经在测试一个电商App时发现,它的登录页面虽然用了HTTPS,但登录后的跳转链接却是HTTP。这就给了SSL剥离攻击可乘之机。正确的做法是:全站强制HTTPS,并且启用HSTS(HTTP Strict Transport Security)。

HSTS是什么?简单说,就是告诉浏览器:「以后访问我这个网站,只能用HTTPS,别给我走HTTP」。浏览器收到这个指令后,会把这个策略缓存起来,下次直接走HTTPS,不给中间人任何降级的机会。

但HSTS也有一个「第一次访问」的问题——如果用户第一次访问时就被攻击了,那HSTS还没生效,攻击照样能成功。所以现在很多浏览器内置了HSTS预加载列表,把常用网站的HTTPS策略直接写死在浏览器里。

三种攻击方式的对比

攻击方式 核心原理 防御手段 抓包工具代表
中间人攻击 伪造证书,欺骗客户端 证书绑定(Certificate Pinning) Charles、Burp Suite
证书伪造 安装恶意根证书 系统证书校验、Android 7.0+安全策略 mitmproxy
SSL剥离攻击 HTTPS降级为HTTP HSTS、全站HTTPS sslstrip

这张表我建议你收藏一下。每次做安全测试时,对照着看看自己的App能防住哪几种攻击。

知识体系总览

下面这张图,是我梳理的HTTPS抓包与中间人攻击的核心知识结构。你可以把它当成一个「思维导图」来看:

HTTPS抓包与中间人攻击 中间人攻击(MITM) 截获TLS握手 → 伪造证书 → 双向欺骗 证书伪造 安装根证书 → 动态签发域名证书 Android 7.0+ 默认不信任用户证书 SSL剥离攻击 HTTPS降级为HTTP → 明文传输 防御:HSTS + 全站HTTPS 防御措施 证书绑定(Pinning) 系统证书校验 / HSTS预加载

这张图把三种攻击方式的关系理清楚了。你会发现,它们虽然手法不同,但核心目标都一样——破坏HTTPS的加密信任链。理解了这一点,你就能举一反三,知道该怎么防御了。

个人经验:我建议你在做App安全测试时,至少用两种抓包工具交叉验证。因为有些App对特定工具的证书做了特殊处理,换一个工具可能就抓不到了。我遇到过Charles抓不到、但mitmproxy能抓到的情况,原因是App对Charles的证书指纹做了黑名单检测。

好了,这一章的内容就到这里。记住一句话:没有绝对的安全,只有不断升级的攻防。下一章我们会深入证书绑定的具体实现,到时候再聊。


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