ctfshow-jwt

web345

看源码发现/admin

放问/admin在cookie生成了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGkbqn1H-1672128200707)(ctfshowjwt.assets/image-20221227134805327.png)]

把他用jwt解密

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CRQr5Sc0-1672128200711)(ctfshowjwt.assets/image-20221227135052517.png)]

在alg中是None所以是无加密,吧user改为admin再base64加密即可

web346

和上题差不多但有了个加密,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QoDSDmu-1672128200713)(ctfshowjwt.assets/image-20221227135950267.png)]

我们还是要把user改成admin,但不知道秘钥,盲猜一波123456

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWRk4uxi-1672128200714)(ctfshowjwt.assets/image-20221227140038725.png)]

将cookie提交再去访问/admin/即可

web347

和上题一样key是123456

web348

相同的前端,题目提示爆破,把cookie拿出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6YgXACU-1672128200714)(ctfshowjwt.assets/image-20221227144415947.png)]

加密的,还是要把user改成admin,但不知道key用jwtcrack爆破一下

下载地址https://github.com/brendan-rius/c-jwt-cracker

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XunPwbHD-1672128200715)(ctfshowjwt.assets/image-20221227145537385.png)]

爆破出aaab来就跟上面的布置相同了

web349

app.js

/* 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');
	  }
	});
});

通过访问/private.keypublic.key来获得公私钥

之后在jwt.io中填入,修改admin后将得到的cookie传入,同时post一个参数就可以了

web350

HS256算法使用密钥为所有消息进行签名和验证。

而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。

如果将算法从RS256改为HS256,则后端代码将使用公钥作为密钥,然后使用HS256算法验证签名。

由于攻击者有时可以获取公钥,因此,攻击者可以将头部中的算法修改为HS256,然后使用RSA公钥对数据进行签名。

这样的话,后端代码使用RSA公钥+HS256算法进行签名验证。
node脚本

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)

ken = jwt.sign({ user: ‘admin’ }, privateKey, { algorithm: ‘HS256’ });
console.log(token)


运行 nodejs 获取 cookie 去替换即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值