某不知名博客 某不知名博客
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carsaid

安全界的小学生
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前言

  • 服务器端主题(翻译)

  • 客户端主题(翻译)

  • 高级主题(翻译)

  • 扩展阅读(翻译)

  • 个人学习笔记

    • 说明
    • 笔记-服务端主题

    • 笔记-客户端主题

    • 笔记-高级主题

      • 不安全的反序列化笔记
      • GraphQL API漏洞笔记
      • 服务端模板注入笔记
      • Web缓存投毒笔记
      • HTTP主机头攻击笔记
      • HTTP请求走私笔记
      • OAuth身份验证漏洞笔记
      • JWT攻击笔记
        • JWTs基本知识
          • 1、JWTs是什么?
          • 2、JWTs的数据会被存储在后端服务器?
          • 3、JWT数据的格式
          • 4、JWT机制的安全性依赖于?
          • 5、JWT签名是如何生成的?有什么作用?
          • 6、JWT规范和其他扩展规范
          • 7、常见的JWT标头参数
          • 8、其他一些JWT标头参数
        • JWT攻击
          • 1、什么是JWT攻击?
          • 2、JWT攻击的影响是什么?
          • 3、JWT攻击这种漏洞是如何产生的?
          • 4、执行JWT攻击
          • 5、一些用于公开 JWK 的标准端点
        • JWT算法混淆攻击(密钥混淆攻击)
          • 1、对称与非对称算法
          • 2、算法混淆漏洞是如何产生的?
          • 3、实现算法混淆攻击的步骤?
          • 4、算法混淆攻击的注意要点?
          • 5、在找不到有效公钥的情况下,如何从现有的JWTs中提取公钥?
        • 防范JWT攻击
          • 1、防范措施
          • 2、处理JWT的其他最佳实践
      • 原型链污染笔记
  • 实验室做题记录

  • BurpSuite及官方实验室
  • 个人学习笔记
  • 笔记-高级主题
carsaid
2024-02-13
目录

JWT攻击笔记

个人总结

参考:https://portswigger.net/web-security/jwt

- name: 个人总结
  desc: 参考:https://portswigger.net/web-security/jwt
  bgColor: '#F0DFB1'
  textColor: 'green'
1
2
3
4

# JWT攻击笔记

# 1JWTs基本知识

# 1、JWTs是什么?

答案

JSON Web Tokens(JWTs)是一种用于传输 JSON 数据的标准化格式,可以在系统之间发送经过加密签名的 JSON 数据。但从理论上讲,除了 JSON 数据以外,该格式也可以包含任何类型的数据。

该格式最常用于发送有关用户信息的(“声明”),并将其作为身份验证、会话处理和访问控制机制的一部分。

# 2、JWTs的数据会被存储在后端服务器?

判断。

答案

错误。与传统的会话令牌不同,服务器所需的一切数据都存储在客户端本身的 JWT 中。

这使得 JWTs 成为大型分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。

# 3、JWT数据的格式

答案

JWT 由 3 部分组成:标头、有效信息和签名。

  • 前两个部分会经过 Base64url 编码
  • 前两个部分 + 预期算法 + 密钥 = 签名
  • 然后三者分别用一个点号分隔:<标头的base64>.<有效信息的base64>.<签名>

示例:

eyJraWQiOiI5MTM2ZGRiMy1jYjBhLTRhMTktYTA3ZS1lYWRmNWE0NGM4YjUiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwb3J0c3dpZ2dlciIsImV4cCI6MTY0ODAzNzE2NCwibmFtZSI6IkNhcmxvcyBNb250b3lhIiwic3ViIjoiY2FybG9zIiwicm9sZSI6ImJsb2dfYXV0aG9yIiwiZW1haWwiOiJjYXJsb3NAY2FybG9zLW1vbnRveWEubmV0IiwiaWF0IjoxNTE2MjM5MDIyfQ.SYZBPIBg2CRjXAJ8vCER0LA_ENjII1JakvNQoP-Hw6GG1zfl4JyngsZReIfqRvIAEi5L4HV0q7_9qGhQZvy9ZdxEJbwTxRs_6Lb-fZTDpW6lKYNdMyjw45_alSCZ1fypsMWz_2mTpQzil0lOtps5Ei_z7mM7M8gCwe_AGpI53JxduQOaB5HkT5gVrv9cKu9CsW5MS6ZbqYXpGyOG5ehoxqm8DL5tFYaW3lB50ELxi0KsuTKEbD0t5BCl0aCR2MBJWAbN-xeLwEenaqBiwPVvKixYleeDQiBEIylFdNNIMviKRgXiYuAvMziVPbwSgkZVHeEdF5MQP1Oe2Spac-6IfA

# 4、JWT机制的安全性依赖于?

答案

JWT 由 3 部分组成:标头、有效信息和签名。

任何基于 JWT 机制的安全性都严重依赖于第三个部分的加密签名(JWT 签名)。

# 5、JWT签名是如何生成的?有什么作用?

答案

通常,颁发令牌的服务器会对 标头和有效信息 进行哈希处理,从而生成签名。在某些情况下,它们还会对生成的哈希值进行加密。无论是哪种生成方式,签名的过程都需要用到私有签名密钥。

这种机制为服务器提供了一种方法(防篡改性),可用于验证令牌中的数据是否从未被篡改:

  • 由于签名源自令牌的前两个部分,因此更改标头或有效信息中的单个字节时,会导致签名不匹配。
  • 如果不知道服务器的私有签名密钥,则无法为给定标头或有效信息生成正确的签名。

# 6、JWT规范和其他扩展规范

答案

JWT 规范实际上非常有限。它只定义了一种格式,用于将信息(“声明”)表示为 JSON 对象,并在两方之间传输。在实践中,JWTs 指的并不是一个单独的个体,应该说是各种规范的集体实现。

  • JSON Web Token(JWT)规范
  • JSON Web Signature(JWS)规范
  • JSON Web Encryption(JWE)规范

JWT 规范由 JSON Web Signature(JWS)和 JSON Web Encryption(JWE)规范进行扩展,这些规范定义了实现 JWTs 的具体方式。

  • 搭配各种规范实现相应的 JWTs 功能
  • 其中 JWS 令牌是最常用的实现方式

# 7、常见的JWT标头参数

JWT 标头(也称为 JOSE 标头)

答案
  • alg - 告诉服务器使用哪种 算法 对令牌进行签名。相应的,在验证签名时也需要使用同一种算法。
  • kid(Key ID)- 提供一个 ID,在有多个密钥可供选择的情况下,服务器可以使用该 ID 来标识正确的密钥。根据密钥格式的不同,应该具有一个相匹配的kid参数。
  • jwk(JSON Web Key)- 嵌入一个 JSON 对象,用于表示密钥。
  • jku(JSON Web Key Set URL)- 提供一个 URL,服务器可以从中获取包含正确密钥的一组密钥。
{
    "kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
    "typ": "JWT",
    "alg": "RS256",
    "jwk": {
        "kty": "RSA",
        "e": "AQAB",
        "kid": "ed2Nf8sb-sD6ng0-scs5390g-fFD8sfxG",
        "n": "yy1wpYmffgXBxhAUJzHHocCuJolwDqql75ZWuCQ_cb33K2vh9m"
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 8、其他一些JWT标头参数

答案
  • cty(Content Type,内容类型)- 有时用于声明 JWT 有效信息内容的媒体类型。这通常在标头中被省略,但底层解析库可能仍然支持它。如果你找到了绕过签名验证的方法,你可以尝试注入cty标头,以将内容类型更改为text/xml或application/x-java-serialized-object,这可能会为 XXE (opens new window) 和反序列化 (opens new window)开辟新的攻击向量。
  • x5c(X.509 Certificate Chain,X.509 证书链)- 用于传递对 JWT 进行数字签名的密钥所属的 X.509 公钥证书或证书链。此标头参数可用于注入自签名证书,类似于上面讨论的jwk标头注入 (opens new window)攻击。由于 X.509 格式及其扩展的复杂性,解析这些证书还可能引入其他漏洞。这些攻击的细节超出了本材料的范围,有关更多详细信息,请参阅 CVE-2017-2800 (opens new window) 和 CVE-2018-2633 (opens new window)。

# 2JWT攻击

# 1、什么是JWT攻击?

答案

篡改 JWTs 并将其发送到服务器,以实现某些恶意目的。

通常,攻击者会冒充另一个已通过身份验证的用户,从而绕过身份验证和访问控制。

# 2、JWT攻击的影响是什么?

答案

JWT 攻击的影响通常很严重。如果攻击者能够使用任意值 来创建自己的有效令牌,则他们可以:

  • 提升自己的权限
  • 冒充其他用户
  • 进一步完全控制受害帐户

# 3、JWT攻击这种漏洞是如何产生的?

答案

因 “有缺陷的 JWT 处理” 而产生。与 JWTs 相关的各种规范 (opens new window)在设计上相对灵活,允许网站开发人员自定义许多实现细节。这可能导致他们意外地引入漏洞,就算使用久经沙场的库也是如此。

一些常见的缺陷:

  • JWT 签名没有得到正确验证,致使攻击者可以操纵令牌中的有效信息,篡改传递给应用程序的值。
  • 密钥被泄露、猜测或暴力破解,攻击者可以为任何令牌生成有效签名,从而危害整个机制。(即使签名得到了正确验证也是如此)

# 4、执行JWT攻击

答案

利用有缺陷的 JWT 签名验证

  • 接受任意签名
  • 接受没有签名的令牌

密钥暴力破解

  • 使用hashcat暴力破解密钥

JWT 标头参数注入

  • 通过jwk参数注入自签名JWTs
  • 通过jku参数注入自签名JWTs
  • 通过kid参数注入自签名JWTs

算法混淆攻击

  • 算法混淆攻击
  • 算法混淆攻击-从现有令牌中导出公钥

# 5、一些用于公开 JWK 的标准端点

答案
  • /jwks.json
  • /.well-known/jwks.json

# 3JWT算法混淆攻击(密钥混淆攻击)

# 1、对称与非对称算法

  • 对称与非对称算法

# 2、算法混淆漏洞是如何产生的?

答案

JWT 库的实现有缺陷,隐式信任用户所指定的算法,并且只使用一个单一的函数来执行算法过程。

  • 原来 - 服务器使用非对称算法(例如 RS256),使用私钥签名、公钥验证
  • 攻击 - 手动指定算法为对称算法(例如 HS256),使用公钥加密恶意信息(由于使用了对称算法,这里的公钥会被视为一个单独的密钥)
  • 结果 - 由于用户手动指定算法,所以服务器也改为使用对称算法,使用同一个公钥解密并信任恶意信息

# 3、实现算法混淆攻击的步骤?

答案
  1. 获取服务器的公钥
  2. 将公钥转换为合适的格式
  3. 生成一个恶意 JWT,修改其有效信息一栏,并且alg标头设置为HS256。
  4. 使用 HS256 对令牌进行签名,将公钥作为密钥。

# 4、算法混淆攻击的注意要点?

和公钥有关。

答案

你用来加密信息的公钥,必须与服务器上存储的公钥完全相同。

  • 这包括相同的格式(如 X.509 PEM)并保留任何非打印字符(如换行符)。

在实践中,你可能需要多次尝试不同的格式,才能使此攻击生效。

# 5、在找不到有效公钥的情况下,如何从现有的JWTs中提取公钥?

  • 从现有令牌中导出公钥

# 4防范JWT攻击

# 1、防范措施

答案

你可以采取以下高级措施来保护自己的网站,使其免受我们介绍的许多攻击:

  • 使用最新的库来处理 JWTs,并确保开发人员完全了解其工作原理 以及 任何安全隐患。现代库能使你更安全地实现功能,但由于相关规范固有的灵活性,这并不是万无一失的。
  • 确保对收到的任何 JWTs 执行可靠的签名验证,并考虑罕见情况,例如使用意外算法签名的 JWTs。
  • 对于jku标头所允许的主机域,实施严格的白名单。
  • 保护kid标头参数,使其不易受到路径遍历或 SQL 注入攻击。

# 2、处理JWT的其他最佳实践

答案

虽然避免漏洞并非绝对必要,但我们建议在应用程序中使用 JWTs 时遵循以下最佳实践:

  • 始终为你颁发的任何令牌设置过期时间。
  • 尽可能避免在 URL 参数中发送令牌。
  • 同步发送aud(受众)声明以指定令牌的预期接收者(也可以是类似的声明)。这样可以阻止它在不同的网站上被使用。
  • 颁发服务器能够吊销令牌(例如,在登出时让令牌过期)。
编辑 (opens new window)
OAuth身份验证漏洞笔记
原型链污染笔记

← OAuth身份验证漏洞笔记 原型链污染笔记→

最近更新
01
API测试笔记
04-30
02
msfvenom
03-29
03
Metasploit
03-29
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Carsaid | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式