现代 Web 应用通常使用密钥签名的 JWT 来验证用户身份;如果该密钥较弱,则可以对其进行暴力破解(例如使用 hashcat),并伪造冒充任何用户或角色的令牌。由于此漏洞能够绕过所有常规访问控制,因此这是一个至关重要的发现,它可以让攻击者完全攻陷应用程序。
介绍
大多数现代 Web 应用程序都包含两个部分:前端和后端。前端通常使用 React.js、VUI 或 Angular 编写,而后端则是某种 API。当前端与 API 通信时,它必须发送某种身份验证信息,以便 API 知道哪个用户正在与其通信。如果您习惯于使用 PHP 编写的旧应用程序,您可能已经习惯了使用 Cookie 来保存用户身份验证信息。然而,绝大多数现代应用程序都使用 JWT 令牌,如果开发人员使用弱密钥,则可能会被破解。
JWT 令牌
由于目前已经有很多相关信息,我不会过多地介绍 JWT 令牌,但我还是想介绍一些基础知识,以便您快速理解。根据 Google 的说法,JWT(JSON Web Token)是一种紧凑的编码令牌,用于在各方之间安全地传输信息。它由标头、有效负载和签名组成,通常用于 Web 应用程序中的身份验证和授权。简而言之,他们所说的 JWT 令牌用于保存用户数据,这些数据通常由后端应用程序签名,因此在不知道密码的情况下无法修改。
如上图所示,我们有一个 JWT 令牌。在本例中,该令牌用于保存用户 ID、邮箱和角色。如果我们能以某种方式创建自己的 JWT 令牌,就可以输入自己的 ID、邮箱和角色,用于以其他用户或角色的身份进行身份验证。通常情况下,这是不可能的,因为这些令牌是使用秘密密码签名的。然而,与任何秘密密码一样,有时人们会选择易于破解的弱密码。如果你能猜出秘密密码,你就可以伪造自己的令牌,这基本上允许你以任何你想要的用户身份登录。
查看原始请求时,通常会看到这些令牌作为名为“Authorization”的请求标头传递。如果您看到该标头以及以“ey”开头的字符串,则很可能正在处理 JWT 令牌。
破解 JWT 令牌
如果您发现 JWT 令牌,请务必使用 hashcat 等密码破解程序进行破解。您可能会惊讶于我完全控制应用程序的次数,因为开发人员使用弱密码签署了他们的 JWT 令牌。这种情况发生的频率比您预期的要高。我还注意到,随着人工智能的兴起,当它生成用于生成这些令牌的代码时,它总是会选择一个弱密码,如果开发人员复制粘贴代码,这可能会导致严重的问题。
如上图所示,我们可以看到生成这些令牌的代码。仔细看看“SECRET_KEY”,这就是我们要破解的。如果我们能猜出这个密钥,就能伪造自己的 JWT 令牌,从而允许我们指定任何我们想要的邮箱/角色,后端 API 也会认为它是有效的。
运行代码将为您提供以下令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE3NDY5MzI3NDd9.2LIuNqxJ4F_M1W6kvWieOq5V8UJo35zrnMaD93dh8VU
同样,在实际应用中,您可以通过查看请求标头中名为“Authorization”的标头来找到它。如果它以“ey”开头,则很可能是 JWT 令牌。您可以通过将令牌粘贴到https://jwt.io/来验证这一点,这将允许您解码令牌并查看其中的内容。如果您想修改令牌,则需要知道密钥。
要破解令牌,我们首先需要将其复制到一个用于 hashcat 的文件中。然后,选择一个合适的单词列表,例如 rockyou.txt ,运行 hashcat,并祈祷开发者使用的密码足够弱。
hashcat -m16500 jwt_hash.txt /path/to/rockyou.txt
正如您在上面的 hashcat 输出中看到的,我们能够破解 JWT 令牌。现在我们有了用于签名令牌的密码,我们可以轻松伪造自己的令牌。这使我们能够以任何我们想要的用户/角色登录!如果您发现了这一点,您可以将其视为一个关键发现,因为我们可以绕过身份验证检查并接管任何我们想要的用户。
结论
大多数使用 API 的现代应用程序也使用 JWT 令牌来保存用户身份验证信息。登录后,API 会返回一个包含所有用户信息的 JWT 令牌。这些令牌使用秘密密码签名,如果开发人员选择了弱密码,很容易被破解。如果能破解密码,你就可以伪造自己的 JWT 令牌,控制平台上的任何用户。你可能会惊讶于我在渗透测试中见过这种情况的次数!
原文始发于微信公众号(Ots安全):API 攻击 - 破解 JWT 令牌
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论