JWT漏洞利用完全指南:从原理到实战

本文深入解析JWT安全漏洞的7种攻击方法,包括None算法绕过、签名验证缺失、算法混淆攻击、JWK欺骗、KID注入攻击等,提供完整的技术实现细节和防护建议。

利用JWT漏洞:高级利用指南

JSON Web令牌(JWTs)是什么

JSON Web令牌通常用于处理Web服务(如Web应用程序、API和SPA)中的身份验证会话,但还有其他常见用例:

  • 用于获取新会话令牌的刷新令牌
  • 密码重置和电子邮件确认令牌
  • 共享和邀请链接
  • 提供对数据对象临时访问的其他密钥令牌

当JWT实现存在缺陷时,可能使目标应用程序容易受到多种JWT攻击。

解构JSON Web令牌

JSON Web令牌由3部分组成:头部、有效载荷和签名。头部包含基本信息,用于指示库如何签名和验证令牌;有效载荷包含声明和其他任意数据属性;签名确保头部和有效载荷不能被篡改。

在标准JWT令牌中,所有3部分都用点(.)字符分隔,并进行base64(URL安全)编码。

头部

头部包含元数据,作为JWT库的指令,帮助验证、解密和签名令牌。元数据可以包括使用的算法、令牌类型、任何标识符(如kid)和其他相关元数据。

有效载荷

有效载荷包含实际的JWT声明和应用程序需要的任何数据。最佳实践是不包含任何敏感数据,除非它是加密的。

签名

签名需要验证令牌的完整性。这意味着没有密钥就无法篡改数据。

利用JWT漏洞

JWT漏洞源于实现过程中的错误配置和不正确的输入验证。下面我们将介绍7种测试JWT漏洞的方法。

1. 允许None算法

在某些情况下,开发人员启用对none算法的支持,允许他们颁发和使用未签名的令牌。

如果生产环境中处理不正确,任何人都能够篡改JWT,包括修改任何声明以提升应用程序内权限或利用注入攻击。

2. 缺失签名验证

与之前的错误配置类似,在某些情况下,开发人员在未提供签名时完全跳过签名验证。

一旦执行了不正确的解析,它可能允许攻击者篡改声明,并可能冒充其他用户以提升应用程序内权限或在服务器错误处理用户输入时利用注入攻击。

3. JWT算法混淆攻击

如果之前所有将算法设置为"none"的尝试都失败,强烈建议进行额外测试,因为可能支持其他算法,这可能导致JWT密钥混淆攻击。

JWT算法(或密钥)混淆攻击源于开发人员错误处理JWT的算法,启用了除默认使用算法之外的其他算法的支持。

4. JWK欺骗

在其他情况下,您可能会注意到JWT解析库存在缺陷,允许包含自己的密钥对。CVE-2018-0114是一个明显的例子,源于类型混淆,攻击者可以通过简单地在令牌中包含任意密钥对来伪造令牌。

5. 密钥ID(kid)注入攻击

正如我们之前看到的,当头参数处理不当时,可能会出现错误配置。在某些情况下,您可能会注意到密钥ID(kid)在JSON Web令牌的头部部分中被引用。

当目标使用一组密钥时,将使用kid参数来标识哪个密钥对用于签名。在这种情况下,我们可以测试可能的路径遍历、SSRF和注入攻击,具体取决于参数的处理方式。

通过JWT kid属性利用路径遍历

考虑以下易受攻击的代码示例:

1
2
// 易受攻击的代码示例
const key = fs.readFileSync(`/keys/${header.kid}`);

我们可以清楚地看到,应用程序读取kid参数并将其附加在文件检索函数中,没有任何进一步验证。

通过JWT kid属性利用SQL注入

与之前的情况类似,如果您的目标在从数据库加载签名密钥时考虑kid属性,我们实际上也可以测试SQL甚至NoSQL注入。

6. 暴力破解常见/弱JWT密钥

使用常见或弱密钥也可以促进伪造令牌。使用John The Ripper或JWT_tool等工具,我们可以轻松暴力破解用于签名和验证令牌的弱密钥。

7. 枚举硬编码的JWT密钥

密钥有时会意外推送到公共代码库、JavaScript文件和其他配置文件中。这些可能包括用于签名和验证JSON Web令牌的JWT密钥。

始终建议利用公共信息和侦察方法,如JavaScript枚举、GitHub搜索和Google搜索,以发现意外硬编码的密钥。

结论

JSON Web令牌漏洞可能源于各种错误配置、不遵循最佳实践和解析缺陷。在本文中,我们介绍了开发人员在实现JSON Web令牌过程中不注意时可能发生的几种处理缺陷。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计