前言
我们都知道想要抓取HTTPS网站的数据,只需要在BP(Burp Suite)中生成一个CA证书然后导入到浏览器中即可。但是我们又有多少人知道这里面的底层逻辑和实现原理是什么呢,虽然你不了解这些只要会操作也可以继续做渗透测试~ 之前也有人问过相关的问题:【提问】有关https中间人攻击 这里不多讲其他过于文绉绉的知识,只是让大家有个概念即可。
什么是HTTPS?
HTTPS(Hypertext Transfer Protocol Secure),中文叫做超文本传输安全协议。HTTPS本质上是HTTP协议的安全版本,属于应用层协议,那么有一个公式:
HTTPS=HTTP+SSL/TLS作用是啥呢,大家都知道HTTP是明文传输,为了解决被嗅探窃取、篡改,就加入了HTTPS的技术,让HTTP进行加密后再进行传输,这样一来就解决了HTTP的保密性问题。 大家是不是有个疑问,那HTTPS加密了数据为什么我用BP还是可以看到明文呢?
什么是SSL/TLS?
从上面的HTTPS知识可以看到有一个叫SSL的名称,那么大家可能会听说过SSL漏洞、SSL证书。这些专有名词存在的作用是什么,又是怎么构成的?
什么是SSL?
SSL称为安全套接层(Secure Sockets Layer)协议是在Internet基础上提供的一种保证私密性的安全协议。 严格来说,SSL不是纯粹的传输层协议(如 TCP/UDP),而是位于传输层之上、应用层之下的安全层协议。 但SSL必须依赖 TCP(因为需要可靠传输),而 TCP 是标准的传输层协议:
应用层(HTTP/FTP/SMTP)
↓
SSL(加密/解密)
↓
传输层(TCP/UDP)
↓
网络层(IP)从上面我们知道了SSL是一种专有协议,那SSL怎么才能实现加密通信呢?我们先来看一下使用Wireshark抓访问baidu.com的数据包:
这里显示TLS(后续会讲和SSL的区别),梳理了一下流程:

这里对AES和RSA的算法就不再展开,只说三点:
- 身份认证使用证书
- 传输AES密钥使用RSA算法
- 数据传输使用AES算法 因为RSA算法如果用来做数据传输会导致速度很慢,所以只用RSA进行传输AES密钥。由此可延伸出SSL证书的部份,证书在这过程充当身份认证,这里就和我们使用bp安装证书才能抓取https网站密切相关了。
什么是SSL证书
SSL证书是一种遵循SSL协议的数字证书,包含拥有者的公钥及相关身份信息,由受信任的数字证书颁发机构(CA)颁发。通俗来讲SSL证书就是证明身份的,告诉客户端这个域名是可信的。
证书认证机构CA(Certificate Authority) CA是负责颁发、认证和管理证书的第三方机构,具有权威性,公正性。CA的作用是检查数字证书持有者身份的合法性,并签发数字证书(在证书上进行数字签名),以防证书被伪造或篡改,以及对证书和密钥进行管理。 CA证书相当于公安局,那么SSL证书就会盖上CA证书的章。
- 问题一:如果没有证书能不能用https进行传输呢? 答案是可以的,因为SSL证书在https传输过程只是充当身份认证,我客户端与服务器进行加密传输,不一定要身份认证啊,我只要保证我的数据是加密传输的就行了。 但是你没有证书,浏览器会显示告警页面,而且服务器中间件配置SSL基本上都是强制要证书的。
- 问题二:那证书是怎么来的呢?
一般证书分为两种:
自签名证书:适合测试或内部使用,但浏览器会标记为“不安全”。
CA签发证书:由受信任的证书颁发机构(如Let’s Encrypt、DigiCert)签发,适用于生产环境。
生成的步骤就是使用openssl工具生成证书文件,你用自签名就生成
.crt或.pem文件,如果是申请CA签发证书,那么就生成.csr文件去CA申请然后会给你.crt或.pem文件。(具体命令可以百度谷歌查询学习) - 问题三:那浏览器是怎么识别这个证书是否有效?
很多主流的浏览器、比如 Chrome、Firefox等他们都会内置颁发机构的证书文件,如果https的网站通过CA机构申请的证书,浏览器识别到了就会有安全SSL的标志:
重点来了,那burp是怎么能实现解密https的数据,然后进行重放数据包呢?
客户端会验证服务器的证书,你代理通过burp,但是没有证书返回给客户端是无法进行通信的,因为身份验证失败了,所以为什么要在系统中安装burp的CA证书充当颁发机构来信任burp。
具体是怎么实现的这里挖个坑,先讲下TLS的知识,后面会在实战部份进行讲解。
什么是TLS?
我们看下百科的概念:
TLS(Transport Layer Security,传输层安全协议)是一种用于保障网络通信安全的加密协议,旨在为互联网通信提供隐私和数据完整性。它是SSL(Secure Sockets Layer)的后续版本,广泛应用于网页浏览、电子邮件、即时通讯等场景。
SSL由Netscape(网景通信公司)创建,共有三个版本:SSL1.0、SSL2.0、SSL3.0。TLS 1.0是IETF(互联网标准组织)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。整体来说TLS1.0和SSL3.0几乎没有区别,仅修复了早期SSL协议中的一些安全漏洞。实际上我们使用的”SSL证书”都是SSL/TLS证书。
说白了SSL和TLS其实是一样东西,只是名称、版本不一致,可以看下SSL的发展史:
这些漏洞其实大部份都是加密套件(RC4和MD5已被证明不安全,可被破解)、证书(自签名证书易受中间人攻击(MITM),弱密钥(如1024位RSA)可被破解)导致的。
Burp Suite中间人攻击实战
原理剖析
回到本文的主旨:burp是怎么能实现解密https的数据,然后进行重放数据包呢? 我们先看下Burp Suite 的 HTTPS 拦截流程:
- 启动 Burp 代理(默认监听
127.0.0.1:8080)。 - 浏览器配置代理,将所有流量转发到
127.0.0.1:8080 - 安装 Burp 的 CA 证书(关键步骤!)
Burp 会生成一个自签名的根证书(如
PortSwigger CA),需手动将其安装到系统的信任证书库中。 为什么装一个CA证书就可以通过burp获取到了HTTPS网站的明文数据呢?我们看下访问过程: 当用户访问https://example.com时(ds生成的,比我画的要好😭):
| 步骤 | 正常 HTTPS 访问 | Burp Suite 拦截后的 HTTPS |
|---|---|---|
| 1. 客户端发起请求 | 直接连接 example.com | 请求先发送到 Burp 代理 |
| 2. TLS 握手 | 与 example.com 服务器完成握手 | Burp 伪造一个假的 example.com 证书(用自签名 CA 签发) |
| 3. 证书验证 | 浏览器验证服务器的真实证书 | 浏览器检查证书时,发现它是由已信任的 PortSwigger CA 签发的,误认为合法 |
| 4. 密钥交换 | 客户端与服务器直接协商密钥 | 客户端与 Burp 协商密钥(Burp 同时与真实服务器建立另一个 TLS 连接) |
| 5. 数据传输 | 加密数据直接传输 | Burp 解密客户端流量 → 查看明文 → 重新加密 后转发给服务器 |
| 其实正常访问的时候就跟我们上面讲SSL过程是一样的,那么到了burp这里你可以这样理解: | ||
![]() |
- 安装
PortSwigger CA证书这块主要是解决浏览器和burp身份认证所需的 - burp和服务器通信是正常https访问流程,可以使用双方协商的AES算法进行加解密
有同学会问,我burp跟服务器使用https通信就可以,burp拿到服务器返回来的明文直接通过http传给浏览器不就行了,那为什么还要安装
PortSwigger CA证书呢? 好问题,借鉴上图右边的一个交互过程,确实是可以把burp解密的明文给到左边,但是你burp是代理,是基于浏览器进行的,也就是说你通过浏览器访问一个https的网站,那么浏览器就必须要你出示证书,走ssl的协议流程。
实战过程
实验环境:
Burp Suite Community Edition
Chrome
TCPView我们先在Chrome进行代理,然后访问http://burp:
然后将该证书导入到浏览器证书配置或者macOS的Keychain里面。
现在从浏览器访问burp这块已经完成,大致上就可以进行中间人攻击了。
我们从浏览器访问https://www.baidu.com,然后使用`TCPView`工具进行查看,可以看到浏览器是连接到burp的代理:
在burp这边却不是8080端口连接百度的服务器,那是因为8080端口只是为了接收浏览器的数据,burp访问服务器会重新随机生成一个端口:
基本上实战这块已经结束了,由此也可以延伸出另外一个知识点:双向认证。
双向认证
双向认证又称为mutual TLS ,简称 mTLS,是一种相互身份验证的方法。mTLS 通过验证他们都拥有正确的私有来确保网络连接两端的各方都是他们声称的身份。
大部份网站都是只需要认证服务器是否可信即可,但是在APP、OpenVPN、银行系统中会大量使用该认证。
我们从上面可以知道单向认证的过程为:

那么双向认证的过程就要添加多一项:
讲白了,就是你需要验证服务器是否可信,那么服务器也需要验证你是否可信。
那么服务器怎么验证你是可信的,客户端证书又怎么来的呢?
我们知道服务器证书是由CA机构进行颁发,由浏览器识别是否可信,那么服务器验证客户端的证书是通过中间件来配置的,比如nginx、apache等。
那客户端证书怎么申请呢?我们知道验证服务器可信是要去CA进行购买的,那么服务器来验证客户端证书一般是服务器自建的CA。
burp如何突破双向认证
一般想要获取到客户端的证书,想必大家都有所了解,比如app逆向、保存在安装包中等等,具体的技术实现这里不展开实战。
拿到客户端证书后,我们可以在burp的这里进行导入(大部份都带密码):

小小科普文,若有错误请各位大佬斧正!
参考
https://www.0xby.com/3701.html https://www.cloudflare.com/zh-cn/learning/access-management/what-is-mutual-tls/
