一文学习JWT造成的各种安全漏洞利用手法(二)
真爱和自由 WEB安全 195浏览 · 2025-03-06 17:57

一文学习JWT造成的各种安全漏洞利用手法

前言



上次写了我们基础的类型,这次是更复杂的JWT攻击手法

无密钥算法混淆

这个相比于上一个就没有什么泄露了,不过我们可以使用工具去

图片加载失败


而工具的作用就是

图片加载失败


首先我们需要获取两个 jwt

登录获得的 jwt

我退出再次登录获取的 jwt

然后按照教程

结果如下

然后就是一个一个尝试了,但是因为

图片加载失败
bp已经说了,我们就不需要再去尝试了

然后之后的步骤和上一个一模一样的,就不再去弄了



jwk 头部注入

漏洞基础

什么是 jwk 呢?上面已经介绍过了

不过这里还是需要把基础的知识了解了解才能明白漏洞的原理

JWK 注入漏洞通常发生在服务器错误地配置了公钥验证机制时,特别是在服务器不检查公钥来源或没有正确实现公钥白名单时。具体而言,服务器有时会错误地信任 JWT 中包含的公钥,而没有对其进行额外的验证或严格的来源检查。

JWK(JSON Web Key) 参数是 JWS 规范中允许的一个字段,它可以用于在 JWT 头部嵌入公钥。服务器在验证签名时,会从 JWT 的 header 获取 jwk,并使用其中的公钥进行签名验证。然而,如果服务器未正确实施验证逻辑(如不检查 jwk 公钥的合法性或来源),攻击者可能利用这个缺陷执行恶意操作。

什么意思呢,就是公钥我们是可以控制的,我们知道 RSA 的验证是一个密钥对,那么我们只需要自己生成一个公私钥

我们使用自己的私钥去验证就 ok 了

漏洞利用

首先我们使用插件生成一个 RSA 的密钥

图片加载失败


然后我们获取一个 jwt



同样的把我们的 sub 改为 admin
图片加载失败
然后我们使用刚刚的 RSA 密钥来 jwk 注入 这个工具可以一把梭哈

图片加载失败


点击攻击后我们就可以直接访问 admin 界面了

图片加载失败


jku 头部注入

漏洞基础

漏洞原理和上面的几乎一样,不过是获取密钥的地方变了,上一个是直接通过 jwk 头去获取,而这个是通过 jku 头

JKU(JSON Web Key Set URL) 是 JWT 头部中的一个字段,指向一个 URL,该 URL 指定了存储用于验证 JWT 签名的公钥集合(JWK Set)。与 jwk 参数直接嵌入公钥不同,jku 允许客户端(或服务器)通过 HTTP 请求从指定的 URL 获取公钥。攻击者可以通过操控 jku 参数,利用该漏洞注入恶意的公钥来绕过 JWT 验证。

比如一个例子

漏洞利用

靶场 https://0a31002a040dccb682221ff100ba006d.web-security-academy.net/

图片加载失败


图片加载失败


我们可以把这个作为我们利用的点,这里放入我们的 jwk

首先是生成一个 jwk

还是一样的步骤,生成一个 RSA

图片加载失败
然后复制 jwk

放入我们的 exploit 的 body,但是需要加入 key 头

我们可以看看 jwk 的标准形式

图片加载失败
保存成功后我们修改 jwt

图片加载失败
需要 kid 和自己远程 jwk 一致

然后使用刚刚的生成的密钥签名就 ok 了

kid 头部注入

漏洞基础

在 JWS(JSON Web Signature)规范中,kid(Key ID)字段没有严格的格式要求。它只是一个由开发人员选择的任意字符串,可以是 UUID、文件名、数据库条目的标识符,或者任何其他字符串。由于 kid 没有约定的格式,攻击者可以利用这一点,尝试通过特定的路径或标识符来影响服务器的密钥验证过程,进而发起攻击。

原理就是我们可以指定 kid 参数来指定加密的验证密钥,而且这个参数是没有严格的格式要求的,还有一个很重要的一点就是可以指定文件内容作为验证密钥

而 linux 的/dev/null 文件很特殊,是存在且为空的



图片加载失败


所以我们可以以这个文组为验证密钥,采用对称加密的算法的时候,我们只需要知道就可以尝试进行攻击

漏洞利用

https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-kid-header-path-traversal

图片加载失败


这次很简单 先生成一个 null 的验证密钥

图片加载失败




然后抓一个 jwt 出来
图片加载失败


然后使用刚刚的密钥签名方便认证

图片加载失败
成功

敏感信息泄露

一般我们的 jwt 都是存放用户的 id 信息,可是有一些 jwt 存放的是我们用户的相关的敏感信息,而 jwt 是可以 base64 解码获取部分信息的

漏洞利用 我们可以访问

https://authlab.digi.ninja/Leaky_JWT

图片加载失败
我们将获取的 JWT 解码

图片加载失败
可以发现获取了 admin 的账号和密码 我们尝试登录

图片加载失败
但是登录失败了,怀疑 password 应该是 md5 编码

在线网站解密

图片加载失败
获得了密码

图片加载失败
登录成功了

密钥硬编码类

这个其实是比较验证的一个漏洞,比如 NacosJWT 密钥硬编码漏洞

nacos 通过 jwt 进行身份认证,由于配置文件中存在默认 jwt 签名密钥,由于开发者安全意思不强,可能并未更换该签名密钥,导致可伪造 jwt 从而绕过身份认证。

0 条评论
某人
表情
可输入 255

没有评论