JWT攻击笔记
个人总结
参考:https://portswigger.net/web-security/jwt
- name: 个人总结
desc: 参考:https://portswigger.net/web-security/jwt
bgColor: '#F0DFB1'
textColor: 'green'
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"
}
}
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 签名验证
密钥暴力破解
JWT 标头参数注入
算法混淆攻击
# 5、一些用于公开 JWK 的标准端点
答案
/jwks.json
/.well-known/jwks.json
# 3JWT算法混淆攻击(密钥混淆攻击)
# 1、对称与非对称算法
# 2、算法混淆漏洞是如何产生的?
答案
JWT 库的实现有缺陷,隐式信任用户所指定的算法,并且只使用一个单一的函数来执行算法过程。
- 原来 - 服务器使用非对称算法(例如 RS256),使用私钥签名、公钥验证
- 攻击 - 手动指定算法为对称算法(例如 HS256),使用公钥加密恶意信息(由于使用了对称算法,这里的公钥会被视为一个单独的密钥)
- 结果 - 由于用户手动指定算法,所以服务器也改为使用对称算法,使用同一个公钥解密并信任恶意信息
# 3、实现算法混淆攻击的步骤?
答案
- 获取服务器的公钥
- 将公钥转换为合适的格式
- 生成一个恶意 JWT,修改其有效信息一栏,并且
alg
标头设置为HS256
。 - 使用 HS256 对令牌进行签名,将公钥作为密钥。
# 4、算法混淆攻击的注意要点?
和公钥有关。
答案
你用来加密信息的公钥,必须与服务器上存储的公钥完全相同。
- 这包括相同的格式(如 X.509 PEM)并保留任何非打印字符(如换行符)。
在实践中,你可能需要多次尝试不同的格式,才能使此攻击生效。
# 5、在找不到有效公钥的情况下,如何从现有的JWTs中提取公钥?
# 4防范JWT攻击
# 1、防范措施
答案
你可以采取以下高级措施来保护自己的网站,使其免受我们介绍的许多攻击:
- 使用最新的库来处理 JWTs,并确保开发人员完全了解其工作原理 以及 任何安全隐患。现代库能使你更安全地实现功能,但由于相关规范固有的灵活性,这并不是万无一失的。
- 确保对收到的任何 JWTs 执行可靠的签名验证,并考虑罕见情况,例如使用意外算法签名的 JWTs。
- 对于
jku
标头所允许的主机域,实施严格的白名单。 - 保护
kid
标头参数,使其不易受到路径遍历或 SQL 注入攻击。
# 2、处理JWT的其他最佳实践
答案
虽然避免漏洞并非绝对必要,但我们建议在应用程序中使用 JWTs 时遵循以下最佳实践:
- 始终为你颁发的任何令牌设置过期时间。
- 尽可能避免在 URL 参数中发送令牌。
- 同步发送
aud
(受众)声明以指定令牌的预期接收者(也可以是类似的声明)。这样可以阻止它在不同的网站上被使用。 - 颁发服务器能够吊销令牌(例如,在登出时让令牌过期)。