BurpSuite是一个手动Web安全测试工具,主要通过拦截HTTP、HTTPS、WebSockets这三种网络流量给安全测试者可以便捷分析流量中所呈现的问题。

下面主要讨论HTTP、HTTPS的流量转发过程,经过的节点。

HTTP协议抓包

这个协议的流程是最简单的。

  1. 浏览器根据代理设置,将原本要发往 example.com:80 的 HTTP 请求包,发送给了本地的 127.0.0.1:8080 (Burp)。

  2. Burp 接收到请求,这是其可以拦截和查看明文数据的关键。

  3. Burp 以自己的网络身份(源IP变为Burp主机的IP,即 192.168.1.100)将请求原样或修改后转发给真正的目标服务器 93.184.216.34:80。

  4. 目标服务器处理请求,并将响应发送回请求的源地址,即 192.168.1.100(Burp所在机器)。

  5. 操作系统将收到的响应数据包交给监听端口的 Burp。

  6. Burp 将响应返回给浏览器。


HTTPS协议抓包

这个协议的流程稍微复杂些。需要理解 Burp Suite 是如何作为中间人介入这个过程的。其核心在于,Burp 需要让浏览器信任Burp“伪造”的证书。

如下主要介绍,服务器证书和Burp证书分别做了什么操作。

先复习一下无代理的HTTPS流程:

下面的流程主要是浏通信双方共同计算出一个相同的会话秘钥,用于对称加密 。

sequenceDiagram
participant C as 浏览器
participant S as 服务器

Note over C, S: TLS 握手开始
C->>S: 1. Client Hello<br/>(支持加密套件、随机数C)
S->>C: 2. Server Hello<br/>(选择加密套件、随机数S)<br/>+ Server Certificate<br/>(服务器证书)
Note right of C: 浏览器验证证书:<br/>1. 颁发者CA是否可信?<br/>2. 域名是否匹配?<br/>3. 是否在有效期内?
C->>S: 3. Pre-Master Secret<br/>(用证书公钥加密)
Note over C, S: 双方根据随机数C、S、Pre-Master<br/>计算出相同的会话密钥
S->>C: 4. Finished<br/>(用会话密钥加密)
C->>S: 5. Finished<br/>(用会话密钥加密)
Note over C, S: 安全通道建立完成!
C->>S: 应用数据传输<br/>(全部用会话密钥加密)

对上图关键步骤的说明:

Server Certificate (服务器证书):

  • 它是什么? 一个数字文件,由公共可信的证书颁发机构 (CA)签发。

  • 它的作用?做身份认证:向浏览器证明“我就是 example.com”,而不是一个钓鱼网站。

  • 携带公钥:证书内包含了用于加密的公钥。浏览器会用这个公钥来加密信息,只有持有对应私钥的真正服务器才能解密。

  • 浏览器如何验证它? 浏览器和操作系统中都预装了一个可信CA根证书列表。浏览器会检查收到的服务器证书是否由这个列表中的某个CA签发。如果是,则证书可信;如果不是,浏览器就会弹出严重警告。(需要先理解证书信任链流程。)

Pre-Master Secret :

  • 由浏览器生成一个随机值(Pre-Master Secret),用服务器证书里的公钥加密后,发送给服务器。

  • 只有拥有对应私钥的服务器才能解密它。随后,双方利用这个值和之前交换的随机数,各自生成完全相同的会话密钥。

会话密钥 (Session Keys) :

  • 生成会话秘钥后,所有的应用数据(HTTP请求/响应)都将使用这个对称的会话密钥进行加密和解密。

  • 对称加密比非对称加密(公钥私钥)快得多,适合大量数据传输。

有代理的HTTPS流程:

对上图及证书角色的详细解释:

本地证书(Burp Suite 的 CA 根证书):

  • Burp的证书需要你手动安装到浏览器或操作系统中的证书。它由 Burp Suite 自己生成,代表 Burp 自己成为一个私有的、本地的证书颁发机构 (CA)。

  • 它的作用? 建立信任锚点。你告诉浏览器:“这是我的测试工具,我完全信任它颁发的任何证书,请不要报警”。一旦安装并信任此证书,浏览器就会将 Burp CA 加入到它的“可信CA根证书列表”中。(需要先理解证书信任链流程。)

从服务器下载的证书(在 Burp 场景中):

  • 当 Burp 收到浏览器对 https://example.com 的请求时,它会立即同时进行两个独立的 TLS 握手。

  • Burp 服务器:Burp 作为一个标准的客户端,与真实服务器完成 TLS 握手。它会收到并验证服务器的真实证书(步骤3)。如果服务器的证书无效(如域名不匹配、由不可信CA签发),Burp 会在 Alerts 标签页向你告警。

  • 浏览器 Burp:与此同时,Burp 会动态地、实时地为 example.com 这个域名伪造一个证书。这个假证书的“颁发者”是 Burp CA(步骤4)。

浏览器验证的是谁的证书?

  • 浏览器收到的是 Burp 代理发送给浏览器“伪造”的证书(步骤4)。伪造证书的大致流程: Burp拿到真实证书后,截取出证书里的关键字段,Burp用它自己的CA私钥,完全“重新签发”了一张新的假证书。这个新证书里的公钥,是 Burp 自己临时生成的密钥对中的公钥,而不是服务器的公钥。

  • 浏览器执行验证流程:“这个证书是给 example.com 的吗?是的。是可信CA签发的吗?我来看看颁发者...哦,颁发者是 ‘PortSwigger CA’(Burp CA),而我已经把这位CA加入信任列表了。所以这个证书没问题!” → 验证通过。

  • 因为浏览器信任了 Burp CA,所以它信任 Burp CA 颁发的所有证书。

解密的奥秘:

  • 浏览器用 Burp 假证书里的公钥加密 Pre-Master Secret(步骤5)。

  • 因为 Burp 伪造了这个证书,所以它持有对应的私钥,因此它可以解密这个 Pre-Master Secret。

  • 至此,Burp 就成功截获了这个最关键的参数。然后,它再拿着这个参数,用服务器真实证书的公钥加密,发送给服务器(步骤6)。

  • 最终,Burp 和浏览器之间建立了一条加密通道(使用会话密钥①),而 Burp 和服务器之间建立了另一条独立的加密通道(使用会话密钥②)。Burp 坐在中间,可以解密两条通道上的所有流量。

注:企业的网络架构中也会有很多HTTPS流量转发场景,原理是一样的。把企业中的流量代理服务器替换成BurpSuite去代入理解即可。


WebSockets协议了解

WebSockets协议是什么?

WEB领域里已经有一个主流通信协议——HTTP了(HTTPS只是加密后的HTTP),为什么还要有WebSockets协议?

因为 HTTP 协议有一个缺陷:通信只能由客户端发起。

WebSockets解决一件HTTP不能完成的事:

WebSockets协议解决了服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。(这个技术也属于服务器推送技术的一种)

标识符:

协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

ws://example.com:80/some/path

wss://example.com:80/some/path

协议的数据格式和HTTP类似,但又有所区别,用到在查吧,这里只做一个大致了解即可。


证书钉扎(Certificate Pinning)

也称HTTP公钥固定(或称 HTTP公钥钉扎,HTTP Public Key Pinning,缩写HPKP)

证书钉扎指应用程序或服务器不再信任所有根CA,而是预先知道并“锁定”它期望看到的特定证书(或公钥)。

简单来说:服务器使用了白名单校验制度

这个技术可以有效防止客户端使用中间代理的情况,一般应用在APP领域。

公钥固定原理:

flowchart TD
A[App启动或首次请求] --> B[从服务器获取当前证书链]
B --> C[提取当前证书公钥<br>(或整个证书)]
C --> D[计算其哈希值<br>(如SHA256)]
D --> E{与App内预嵌的<br>可信哈希值比对}

E -- 匹配 --> F[校验成功<br>连接继续]
E -- 不匹配 --> G[校验失败]
subgraph G [失败处理措施]
H[立即终止连接]
I[记录安全事件]
J[向服务器告警]
K[通知用户]
end

对上图流程的详细说明:

  1. 预置信任锚点:

    • 在开发阶段,开发人员提取目标服务器证书的公钥(或整个证书)。
    • 计算该公钥的哈希值(例如 SHA-256)。
    • 将这个哈希值硬编码到应用程序的源代码中,或者放在一个配置文件中,然后随应用一起发布。
  2. 运行时校验:

    • 当应用程序(或启用了钉扎的浏览器)与服务器建立 HTTPS 连接时,它会照常接收服务器的证书链。
    • 在完成了标准的证书验证(检查域名、有效期、CA签名等)之后,钉扎逻辑会额外执行以下操作:
      • 从服务器发送来的证书中提取出公钥。
      • 使用相同的哈希算法(如 SHA-256)计算该公钥的哈希值。
      • 将计算得到的哈希值与应用程序内部预置的哈希值进行比对。
  3. 决策与执行:

    • 匹配:如果两个哈希值完全一致,说明服务器提供的证书正是应用程序所信任的特定证书。连接被允许建立,数据传输继续。
    • 不匹配:如果哈希值不一致,即使该证书由全球可信的CA(如 Let's Encrypt, DigiCert)签发且完全有效,应用程序也会立即终止连接。这就是它防御中间人攻击的关键——Burp Suite 生成的假证书,其公钥哈希值绝对不可能与App内预置的真证书公钥哈希值相同。

APP公钥固定 防御过程:

  1. 你试图用 Burp Suite 拦截一个启用了证书钉扎的 App 的流量。
  2. App 发起 HTTPS 请求,请求被路由到 Burp。
  3. Burp 与真实服务器建立连接,获取到服务器的真实证书。
  4. Burp 动态生成一个伪造的证书,这个证书的域名虽然正确,但是由 Burp 自己的 CA 签发的,因此其公钥与真实证书的公钥完全不同
  5. Burp 将这个伪造的证书返回给 App。
  6. App 的钉扎逻辑启动:
    • 提取伪造证书的公钥。
    • 计算其哈希值。
    • 与内部预置的正确公钥哈希值进行比对。
    • 结果:不匹配!
  7. App 立即触发错误,断开连接。你在 Burp Suite 中通常会看到 SSL Handshake FailedConnection Reset 之类的错误,根本无法看到任何明文流量。

证书钉扎的优缺点:

优点 缺点
极大的增强安全性:有效防止MITM攻击,即使攻击者控制了CA或用户信任了恶意根证书也无济于事。 维护复杂性:服务器证书到期或更换时(尤其是更换CA),必须同时更新客户端App内预置的钉扎信息,否则会导致大规模连接中断。
减少信任依赖:不依赖外部CA系统的绝对安全。 部署风险:如果部署不当(例如只钉扎了一个证书而没有备份),证书失效会导致服务彻底瘫痪。
针对性强:只保护特定的、重要的域名和连接。 安全性并非绝对:如果App本身被逆向分析,攻击者可以提取出预置的哈希值,从而伪造证书(但需要一定逆向、脱壳技术,难度相对高)。

为了平衡安全性和维护性,通常采用以下策略:

  • 备份 pin:不仅钉扎当前证书的公钥,还钉扎备份证书的公钥,以防当前证书出现意外。
  • 有效期:为钉扎信息设置有效期,超过期限后不再检查,以避免长期失效的风险。
  • 报告机制:校验失败时,不仅断开连接,还尝试向服务器发送报告,帮助管理员发现问题。

注:在制定安全方案时,需要考虑的事项。

BurpSuite 代理原理 和 证书钉扎检测技术的更多相关文章

  1. BurpSuite 代理设置的小技巧

    原文:https://www.anquanke.com/post/id/85925 作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在We ...

  2. 【技术分享】BurpSuite 代理设置的小技巧

    作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在Web渗透测试过程中,BurpSuite是不可或缺的神器之一.BurpSuite的核心是 ...

  3. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

  4. Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结

    Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结 1. 普通代理1 1.1.1. 普通代理2 2. 隧道代理3 3. 反向代理 4 4. 正向代理也可以使用apache实现 ...

  5. HTTP 代理原理及实现

    本文转载自 https://imququ.com/post/web-proxy.html HTTP 代理原理及实现(一) 文章目录 普通代理 隧道代理 Web 代理是一种存在于网络中间的实体,提供各式 ...

  6. 动态代理 原理简析(java. 动态编译,动态代理)

    动态代理: 1.动态编译 JavaCompiler.CompilationTask 动态编译想理解自己查API文档 2.反射被代理类 主要使用Method.invoke(Object o,Object ...

  7. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  8. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  9. Spring AOP动态代理原理与实现方式

    AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物   2.日志处理:3.安全验证 ...

  10. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...

随机推荐

  1. springboot~入门第一篇~

    首先新建个 maven 项目菜单 -> File -> New -> Other -> Maven -> Maven -> Maven Project -> ...

  2. C# WInForm 各种控件的移动

    groupPrint.MouseDown += GroupBox1_MouseDown; #region 弹出层移动        [System.Runtime.InteropServices.Dl ...

  3. 扩展若依@Excel注解,使其对字段的控制是否导出更加便捷

    基于若依框架实现按角色控制 Excel 字段导出功能 一.背景介绍 在我们的项目开发中,采用了若依(RuoYi)的 Java Spring 框架进行系统搭建.若依框架提供了 @Excel 注解,通过在 ...

  4. 将各种实体类转成JSON(com.alibaba.fastjson.JSONObject)

    当和其他系统对接时,因为某些原因,本系统需要根据不同条件查询不通的实体类,并以JSON格式传输数据,需要将各种实体类转成json 1 public <U> JSONObject proce ...

  5. electron-builder 在打包universal的时候报错 both x64 and arm64 builds and not cover

    ⨯ Detected file "Contents/Resources/src/files/adbtool/mac/adb" that's the same in both x64 ...

  6. 比特位计数 leetcode 338

    简介 问题的答案就在问题之中 问题说不允许使用 如 C++ 中的 __builtin_popcount 那么我们知道了可以用的为什么不去试试呢? 参考连接 https://leetcode-cn.co ...

  7. linux cmake 报错 the c compiler identification is unknown

    简介 RT 解决方案 cmake .. -DCMAKE_CXX_COMPILER=/usr/bin/c++ -DCMAKE_C_COMPILER=/usr/bin/gcc 另一个解决方案 也可以通过在 ...

  8. DeepCompare文件深度对比软件操作使用方法详细介绍

    DeepCompare文件深度对比软件下载地址 可以通过以下网址下载软件,官网下载速度较慢,推荐通过CSDN或百度网盘下载. CSDN下载链接:https://download.csdn.net/do ...

  9. Typora常用插件

    好的,我现在需要回答用户关于Typora的所有好用插件.下载方式和安装方法的问题.首先,我要仔细阅读用户提供的我搜索到的资料,从中提取相关的信息,并注意可能的矛盾或不同方法. 首先,提到了VLOOK插 ...

  10. 快麦ERP退货借助APPlink快速同步CRM

    什么是APPlink? APPlink是RestCloud打造的一款简单易用的零代码自动化集成平台,为业务流程提供自动化的解决方案,将企业内部的核心系统以及第三方应用程序和云服务等进行集成.无论是开发 ...