关注这个漏洞的其他相关笔记:JWT 漏洞 - 学习手册-CSDN博客
0x01:JWT 漏洞介绍
JWT(Json Web Token)是用于在网络应用环境间传递声明的一种基于 JSON 的开放标准。它通过使用 JSON 对象进行安全的信息传输,可以用于身份验证和信息交换,是目前最流行的跨域认证解决方案。
如果你不了解 JWT,可以先看看这篇文章:JWT 详解
尽管 JWT 是一种旨在确保信息交换安全性的技术,但是如果使用不当,它同样可能带来安全风险。
从安全性的角度来看,JWT 至少存在两个潜在的问题:
-
缺乏机密性:JWT 的 Header 和 Payload 部分只是采用了 Base64URL 编码,攻击者可以很轻松的获取明文数据。
-
密钥安全性: JWT 的安全性取决于签名采用的密钥是否安全,倘若密钥通过某种方式泄露了,那 JWT 的安全也就无从说起了。
下面笔者通过两个案例,来演示 JWT 存在的一些问题。注意,本文只是引入 JWT 漏洞的概念,JWT 具体的漏洞挖掘思路(碰到 JWT 验证可以测试的点有哪些),笔者会在后面单独出一个模块讲解。
0x0101:JWT 漏洞 - 信息泄露
实验环境准备
JWT 信息泄露 - 在线靶场:Leaky JWT (digi.ninja)
本次的实验环境,我们采用一个在线的靶场 Authentication Lab,该靶场是由 DigiNinja 提供的,专注于身份验证和未授权漏洞的一个实验平台。
访问上面提供的链接,进入靶场。可以看到,靶场给了我们一个 JWT 的数据,还有一个登录框,我们需要通过这个 JWT 认证信息解密出用户名和密码,来完成登录:
复制上面 JWT 的内容去 JWT 官网(http://jwt.io)进行解密:
我们成功获取了明文的用户名,但是密码似乎经过了加密,一眼定真为 MD5 加密。接下来,我们去 md5在线解密破解 进行 MD5 解密:
解密得到 Password 为 Password1
,现在我们成功获得了用户的用户名与密码: joe:Password1
,使用该用户名与密码去靶场登录,成功过关:
至此,JWT 的信息泄露漏洞已经演示完毕,可以看到,倘若攻击者通过某种渠道获取了用户的 JWT 信息,可以很轻松的解密出其中内容,并伪造用户的身份。
当然,这一切的前置原因,都是因为开发者将用户的敏感信息存放在了 JWT 的 Payload 中,是开发者对 JWT 的信任,导致了此次漏洞。
0x0102:JWT 漏洞 - 密钥泄露
实验环境准备
JWT 密钥泄露 - 在线靶场:Cracking JWT Keys (digi.ninja)
JWT 密钥破解工具 - 本地资源:CrackingJWTKeys.py
本次的实验,我们采用 Authentication Lab 中的 Craking JWT Keys。该关卡的考点是,爆破 JWT 密钥。
访问上面提供的链接,进入靶场。因为是演示,所以难度就调整为 Easy 了:
JWT 的安全性取决于最后的签名部分,倘若攻击者通过某种手段获取了签名的密钥,那么攻击者自己就可以伪造签名。
这里笔者使用自己开发的 JWT 破解工具,输入刚刚获取的 JWT 内容,然后导入字典,开始破解:
可以看到,成功破解,破解出来的签名密钥是 hello
,我们使用该密钥去 JWT 官网进行验证:
从 JWT 官网的解析来看,我们当前用户名为 jasper
,用户的权限等级是 user
,但是我们现在已经有签名的密钥了,我们直接自己修改 JWT 认证信息,把权限改为 admin
,用户名改为 Blue17
:
将我们篡改后的 JWT 认证信息发送给服务端,可以看到,服务端依旧接收并认可了我们的权限。
至此,JWT 密钥泄露漏洞演示完毕。产生此漏洞的原因,是由于使用者使用了过于简单的密钥,让攻击者可以通过暴力破解的手段获取签名密钥,从而导致攻击者可以伪造任意用户的身份信息以及等级权限。
另外,还要提的一点是,JWT 的 Payload 中不应该存放敏感信息以及与权限等级相关的内容,原因还是如上面一样,JWT 的 Payload 只是使用了 Base64URL 编码,而不是加密,获取了 JWT 认证信息的攻击者,可以很轻易的恢复 Payload 中的明文数据。
0x02:JWT 漏洞详解
0x0201:JWT 漏洞产生的原因
JWT 漏洞产生的主要原因是因为开发者在实现 JWT 认证机制时没有充分考虑到信息的安全性和对密钥的保护,导致攻击者可以轻易地获取和篡改 JWT 的明文数据,或者通过泄露的密钥伪造有效的 JWT,从而在用户不知情的情况下以用户的名义完成一些恶意操作,如访问敏感数据、执行未授权的操作等。
0x03:参考资料
-
JSON Web Token 入门教程 - 阮一峰的网络日志
-
什么是 JWT?深入理解 JWT 从原理到应用(上)-阿里云开发者社区