0x01 背景
相信很多小伙伴在渗透测试的过程中会经常遇到jwt认证的身份鉴别方式,如果你不知道什么是jwt那你在渗透测试的过程中一定会遇到这种认证方式。这种以3个"."分割开的认证信息就是jwt认证。
0x02 JWT爆破
jwt的认证信息由"."分割分为三部分。以刚提到的图片来举例,该信息分别被分割为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
、eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
和SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
第一部分base64解码后可以看到jwt的加密方式。
-
第二部分base64解码后可以看到jwt中存储的内容。
-
第三部分则是将第一部分和第二部分连起来使用第一部分的加密算法配合密钥加密出来的完整性验证字符串。这部分最主要的功能就是为了防止用户擅自修改jwt认证信息。
-
jwt密钥爆破有两种方式,一种是使用密钥尝试jwt解密可以解密就表示密钥有效。另一种是使用密钥对前两部分进行加密,如果相同则表示密钥有效。
0x03 为什么你爆破不出来
现在市面上的jwt密钥爆破的工具很多,但为什么你遇到一个jwt就尝试下爆破结果过了20年没一个成功呢?
笔者在一个项目中发现了这个问题,明明知道密钥,但就是解密不出来。最后发现是jjwt组件的问题,jjwt是java一个常见的jjwt认证框架。关键就是该框架在设置密钥时,框架会对密钥进行base64解码之后将解码后的结果设置为jwt的密钥。(如果设置的密钥不是4的倍数就从后往前删除字符直到是4的倍数)
那么爆破不出来的原因显而易见了,你的字典里会有字节码吗?
解决方案
解决方法也很简单,在每次爆破密钥时先将密钥减少为4的倍数,再进行base64解码即可正常进行爆破。以下代码为密钥基本的处理流程,在此基础上添加字典文件读取和解密结果判断,就可以对jwt密钥进行爆破了。
#来自pyjwt库
import jwt
import base64
#密钥
key="wadsadac"
#jwt认证字符串
st = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.VFb0qJ1LRg_4ujbZoRMXnVkUgiuKq5KxWqNdbKq_G9Vvz-S1zZa9LPxtHWKa64zDl2ofkT8F6jBt_K4riU-fPg"
secret=base64.b64decode(key[:len(key)-(len(key)%4)])
#jwt解码
s = jwt.decode(st, secret,algorithms=["HS512", "HS256"]) # 解密,校验签名
print(s)
结语
创作不易,转载需注明出自公众号"地表最强伍迪哥" ,
该文章主要用来协助开发者排查漏洞,请勿用于非法用途。
原文始发于微信公众号(地表最强伍迪哥):为什么你的jwt密钥爆破不出来?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论