什么是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
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)