freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

JWT安全风险全解析:攻击手段与防护要点
2025-03-11 21:00:38
所属地 四川省

什么是JWT?

JSON Web令牌(JWT)是一种标准化格式,用于在系统之间发送经过加密签名的JSON数据。理论上,它可以包含任何类型的数据,但最常用于在身份验证、会话处理和访问控制机制中发送关于用户的信息("声明")。

与经典会话令牌不同,服务器所需的所有数据都存储在客户端的JWT本身中。这使得JWT成为高度分布式网站的热门选择,用户需要无缝地与多个后端服务器进行交互。

JWT格式

JWT由3部分组成:头部、负载和签名。这些部分通过点分隔,如以下示例所示:

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

JWT的头部和负载部分只是base64url编码的JSON对象。头部包含关于令牌本身的元数据,而负载包含关于用户的实际"声明"。例如,可以解码上面令牌的负载,以显示以下声明:

{ "iss": "portswigger", "exp": 1648037164, "name": "Carlos Montoya", "sub": "carlos", "role": "blog_author", "email": "carlos@carlos-montoya.net", "iat": 1516239022 }

在大多数情况下,任何可以访问令牌的人都可以轻松读取或修改此数据。因此,任何基于JWT的机制的安全性在很大程度上依赖于加密签名。

JWT签名

颁发令牌的服务器通常通过哈希头部和负载来生成签名。在某些情况下,他们还会加密生成的哈希。无论哪种方式,此过程都涉及一个秘密签名密钥。这种机制提供了一种方法,使服务器可以验证自颁发以来令牌内的数据未被篡改:

  • 由于签名直接从令牌的其余部分派生,因此更改头部或负载的单个字节将导致签名不匹配。

  • 如果不知道服务器的秘密签名密钥,理论上不可能为给定的头部和负载生成正确的签名。

JWT与JWS与JWE

JWT规范实际上非常有限。它仅定义了一种格式,用于将信息("声明")表示为可以在两方之间传输的JSON对象。实际上,JWT并不是一个独立的实体。JWT规范通过JSON Web签名(JWS)和JSON Web加密(JWE)规范进行了扩展,这些规范定义了实际实现JWT的具体方法。


换句话说,JWT通常是JWS或JWE令牌。当人们使用"JWT"一词时,几乎总是指JWS令牌。JWE非常相似,只是令牌的实际内容是加密的,而不是仅仅编码的。

什么是JWT攻击?

JWT攻击涉及用户向服务器发送修改后的JWT,以实现恶意目标。通常,这个目标是通过冒充其他已通过身份验证的用户来绕过身份验证和访问控制。

JWT攻击的影响是什么?

JWT攻击的影响通常是严重的。如果攻击者能够创建具有任意值的自己的有效令牌,他们可能能够提升自己的权限或冒充其他用户,完全控制他们的帐户。

导致JWT攻击漏洞的原因是什么?

JWT漏洞通常是由于应用程序本身对JWT的处理不当引起的。与JWT相关的各种规范在设计上相对灵活,允许网站开发人员自行决定许多实现细节。这可能导致他们即使使用经过实战考验的库,也会意外引入漏洞。

这些实现缺陷通常意味着JWT的签名未被正确验证。这使得攻击者可以篡改通过令牌的负载传递给应用程序的值。即使签名得到稳健验证,其是否真正可信在很大程度上依赖于服务器的秘密密钥保持秘密。如果此密钥以某种方式泄露,或者可以被猜出或暴力破解,攻击者可以为任何任意令牌生成有效签名,从而危及整个机制。

利用JWT签名验证缺陷

按设计,服务器通常不会存储有关其颁发的JWT的任何信息。相反,每个令牌是一个完全独立的实体。这有几个优点,但也引入了一个根本问题——服务器实际上并不了解令牌的原始内容,甚至不知道原始签名是什么。因此,如果服务器未正确验证签名,攻击者可以随意更改令牌的其余部分。

例如,考虑一个包含以下声明的JWT:

{ "username": "carlos", "isAdmin": false }

如果服务器根据此username标识会话,修改其值可能使攻击者能够冒充其他已登录用户。同样,如果isAdmin值用于访问控制,这可能提供一个简单的权限提升向量。

接受任意签名

JWT库通常提供一种方法来验证令牌,另一种方法只是解码它们。例如,Node.js库jsonwebtoken具有verify()decode()

有时,开发人员会混淆这两种方法,只将传入的令牌传递给decode()方法。这实际上意味着应用程序根本不验证签名。

通过未经验证的签名绕过 JWT 验证-靶场

靶场地址:https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-unverified-signature

# 网络安全 # web安全 # 漏洞分析 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录