Node.js基础+原型链污染

Node.js基础

概述:简单来说Node.js就是运行在服务端的JavaScript,Node.js是一个基于Chrome JavaScript运行时建立的一个平台

大小写变换:

toUpperCase():将小写字母转为大写字母,如果是其他字母则原字符不变

toLowerCase():将大写字母的字符转换成小写,如果是其他字符,则原字符保持不变

(但有一些类似字符,函数会将其当作字母字符转换)

弱类型比较:

数字与字符串

数字与字符串比较时,会优先将纯数字型的字符串转为数字之后再进行比较,而字符串与字符串比较时,会将字符串的第一个字符转化为ASCLL码之后再进行比较,因此就会出现(“111”>"3")程序判断为错误的情况;而非数字型字符串与任何数字进行比较都是false

数组比较

空数组之间比较永远为false,数组之间比较数组间的第一个值,对第一个值采用前面总结的比较方面,数组与非数值型字符串比较,数组永远小于非数值型字符串;数组与数值型字符串比较,取第一个之后按前面总结的方法进行比较

关键字比较

null==undefined返回true

null===undefined输出false

NaN==NaN输出false

NaN===NaN输出false

nodejs md5的绕过

补充知识:在Node.js中,可以使用crypto模块来实现MD5加密功能。MD5是一种常见的哈希算法,用于将任意长度的数据转换为固定长度的哈希值。在Node.js中,可以通过以下步骤来生成MD5哈希值

const crypto = require('crypto');

function generateMD5(input) {
    const hash = crypto.createHash('md5');
    hash.update(input);
    return hash.digest('hex');
}

const input = 'Hello, MD5!';
const md5Hash = generateMD5(input);
console.log(md5Hash);

这样就可以在Node.js中使用MD5算法对数据进行加密操作。

编码绕过

用16进制编码,unicode编码,base64编码代替字符

命令执行

exec()child_process 模块中的 exec() 方法。这个方法用于执行 shell 命令并获取其输出。

作用有:执行复杂的 shell 命令,包括管道、重定向等。

处理命令执行的结果:通过回调函数可以处理命令执行的结果,包括标准输出、标准错误等。

eval() 函数(代码执行)用于执行字符串中的 JavaScript 代码,并返回执行结果。它可以用来动态执行代码或计算表达式的值,需要注意的是,eval() 函数在 Node.js 中同样存在安全风险,因为它可以执行任意代码。因此,在实际开发中应该谨慎使用,并避免直接执行来自不受信任来源的代码。

例如(eval(“document.cookie”))执行document.cookie

文件读写

writeFileSync()

require('ls').writeFileSync('input.txt','sss');

解释代码:

require('ls'):这行代码导入了ls模块。

writeFileSync('input.txt','sss'):这行代码调用了ls模块中的writeFileSync方法,传入了两个参数:

第一个参数是文件路径 'input.txt',指定了要写入数据的文件。

第二个参数是字符串'sss',即要写入文件的数据。

补充知识:

writeFileSync方法是一个同步操作,它会阻塞代码的执行,直到写入操作完成。

如果你想在一个Node.js应用程序中使用这段代码,你需要确保ls模块已经安装在你的项目中。

writeFile()

require('fs').writeFile('input.txt','test',(err)=>{})

解释代码:

require('fs'):这行代码导入了Node.js内置的fs模块,用于文件操作。

writeFile('input.txt','test',(err)=>{}):这行代码调用了fs模块中的writeFile方法,传入了三个参数:

第一个参数是文件路径 'input.txt',指定了要写入数据的文件。

第二个参数是字符串'test',即要写入文件的数据。

第三个参数是一个回调函数(err)=>{},用于处理写入操作完成后的回调逻辑。在这个例子中,回调函数为空,即不做任何处理。

补充知识:writeFile方法是一个异步操作,它会将数据写入文件并在完成后调用回调函数。如果写入过程中出现错误,错误信息会通过回调函数的err参数传递。

readFileSync()

require('fs').readFile('/etc/passwd','utf-8',(err,data))=>{

if(err)throw err;

console.log(data);
});

解释代码:

readFileSync(): 这个函数同步地读取文件的内容,即在读取完成之前会阻塞程序的执行。

require('fs').readFile('/etc/passwd', 'utf-8', (err, data) => { ... });: 这行代码使用 Node.js 内置的 fs 模块来读取 /etc/passwd 文件的内容。它使用了 readFile 函数来异步地读取文件,第一个参数是要读取的文件路径,第二个参数是文件的编码格式,第三个参数是一个回调函数,用于处理读取文件时可能出现的错误和读取到的数据。

(err, data) => { ... }: 这是一个回调函数,用于处理读取文件时可能出现的错误和读取到的数据。如果读取文件出现错误,err 参数将会被赋值为错误信息;如果读取成功,data 参数将会包含文件的内容。

if (err) throw err;: 这行代码用于检查是否有错误发生,如果有错误发生,则抛出该错误。

console.log(data);: 这行代码用于将读取到的文件内容输出到控制台

readFile()

require('fs').readFile('/etc/passwd','utf-8'),

与上述函数只有回调函数不同

原型链污染

概述:原型链污染是一种针对JavaScript运行时的注入攻击。通过原型链污染攻击者可能控制对像的默认值。这允许攻击者篡改应用程序的逻辑,还可能导致拒绝服务,或者在极端情况下,远程代码执行 

prototype原型:

在JavaScript中,每个对象都有一个原型(prototype),它是对象的基础,用于继承属性和方法。当你创建一个对象时,这个对象会自动拥有一个指向其原型的引用。

你可以使用 Object.getPrototypeOf() 方法来访问对象的原型,也可以通过 __proto__ 属性来访问对象的原型。

创建对象  let obj = {};

补充知识:

继承

// 父类(超类)
function Animal(name) {
  this.name = name;
}

Animal.prototype.walk = function() {
  console.log(this.name + ' is walking.');
};

// 子类(派生类)
function Dog(name, breed) {
  Animal.call(this, name); // 调用父类构造函数
  this.breed = breed;
}

// 使用原型链继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
  console.log(this.name + ' is barking.');
};

// 创建实例并调用方法
var myDog = new Dog('Buddy', 'Labrador');
myDog.walk(); // 输出:Buddy is walking.
myDog.bark(); // 输出:Buddy is barking.


原型链污染演示

可以发现修改了son的原型属性之后会影响到另外一个具有相同原型的对象,不难看出我们是通过设置了__proto__的值来影响原型的属性

运行代码,发现没有被污染,这是因为,我们用JavaScript创建o2的过程(leto2={a:1,"proto":{b:2}})中,_proto 已经代表o2的原型了,此时遍历o2的所有键名,你拿到的是[a,b],proto 并不是一个key,自然也不会修改Object的原型。

可见,新建的o3对象,也存在b属性,说明Object已经被污染这是因为,JSON解析的情况下--proto__会被认为是一个真正的“键名”,而不代表“原型”,所以在遍历o2的时候会存在这个键。

merge操作时最常见可能控制键名的操作,也最能被原型链攻击很多常见的库都存在这个问题

补充知识:merge函数的作用是将两个对象合并成一个新的对象,通常是将一个对象的属性复制到另一个对象中。在合并过程中,如果两个对象有相同的属性,通常会使用后者(source对象)的属性值覆盖前者(target对象)的属性值。

具体来说,merge函数通常会遍历source对象的所有属性,将每个属性复制到target对象中。如果两个对象有相同的属性,merge函数会使用source对象的属性值覆盖target对象的属性值。最终,merge函数会返回一个新的对象,其中包含了两个对象合并后的属性。

merge函数在前端开发和后端开发中经常被使用,用于合并配置对象、处理数据等场景。然而,在使用merge函数时,需要注意处理重复属性的情况,避免出现意外的覆盖行为或安全问题,如原型链污染等。

举例假设有一个merge函数,用于将两个对象合并:

function merge(target, source) {

        for (let key in source) {

                if (source.hasOwnProperty(key)) {

                         target[key] = source[key];

}

} return target;

}

然后有一个用于加载用户配置的函数:

function loadUserConfig(config) {

        const defaultConfig = { isAdmin: false };

        const mergedConfig = merge(defaultConfig, config);

         return mergedConfig;

}

攻击者可以构造一个恶意的用户配置对象,将__proto__属性设置为一个包含恶意代码的对象:

const maliciousPayload = { __proto__: { isAdmin: true } };

调用loadUserConfig函数,并传入恶意的用户配置对象:

const userConfig = loadUserConfig(maliciousPayload);

此时,userConfig对象的原型链已经被污染,使得userConfig对象具有isAdmin属性并且值为true,从而导致安全漏洞。

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

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

相关文章

【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…

使用FFmpeg源码配置程序configure查看所有支持的编码器/解码器/封装/解封装及网络协议

查看支持编码器: configure --list-encoders 查看支持编码器: configure --list-decoders 查看所有支持的封装: configure --list-muxers 查看所有支持的解封装: configure --list-demuxers 查看所有支持的网络通信协议: configure --list-protocols

解决jsp request.getParameter乱码问题(兼容Tomcat 6~8三个版本)

JSP页面写法&#xff1a; <% page contentType"text/html; charsetutf-8" language"java" %> <% page import"java.io.*" %> <%! int getServerVersion(HttpServletRequest request) {ServletContext application request.getS…

移远通信亮相AWE 2024,以科技力量推动智能家居产业加速发展

科技的飞速发展&#xff0c;为我们的生活带来了诸多便利&#xff0c;从传统的家电产品到智能化的家居设备&#xff0c;我们的居家生活正朝着更智能、更便捷的方向变革。 3月14日&#xff0c;中国家电及消费电子博览会&#xff08;Appliance&electronics World Expo&#xf…

【物联网】Modbus 协议及Qinghub物联网平台应用

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集&#xff0c;这里就我们的实际项目经验分享Modbus协议 你可以通过QingHub作业直接体验试用&#xff0c;也可以根据手册开发相应的代码块。 qinghub项目已经全面开源。 …

sqllab第十九关通关笔记

知识点&#xff1a; 错误注入 最大长度为32位&#xff1b;如果目标长度>32时&#xff0c;需要利用截取函数进行分段读取referer注入 insert语句update语句 通过admin admin进行登录发现页面打印除了referer字段的信息 这应该是一个referer注入 首先进行测试一下 构造payl…

基于SpringBoot和Echarts的全国地震可视化分析实战

目录 前言 一、后台数据服务设计 1、数据库查询 2、模型层对象设计 3、业务层和控制层设计 二、Echarts前端配置 1、地图的展示 2、次数排名统计 三、最终结果展示 1、地图展示 2、图表展示 总结 前言 在之前的博客中基于SpringBoot和PotsGIS的各省地震震发可视化分…

C++提高笔记(四)---STL容器(stack、queue、list)

1、stack容器&#xff08;栈&#xff09; 1.1 栈stack基本概念 概念&#xff1a;stack是一种先进后出&#xff08;First In Last Out&#xff0c;FILO&#xff09;的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界调用&#xff0c;因此栈不允许有遍历行…

使用C#的winform控制数据库实例服务的运行状态

一、得到sqlserver的实例名 二、引用对应的程序集和命名空间 using System.ServiceProcess; C#操作服务要用的类 ServiceController 声明类 private ServiceController serviceController new ServiceController("MSSQLSERVER"); 三、判断服务状态 serviceCon…

上证指数000001行情数据API接口

# 测试&#xff1a;返回不超过10条数据&#xff08;2年历史&#xff09; https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker000001&order2Python示例 import requestsurl f"https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker000…

要将镜像推送到GitLab的Registry中的步骤

1、通过cli 模式登录gitlab &#xff08;命令行模式&#xff09; docker login git.asc-dede.de Username: haiyang Password: Login Succeeded 2、查看我的本地镜像&#xff1a; 3&#xff0c;推送镜像apollo_core到对应的gitlab项目的Registry 中 docker push registry.gi…

「Linux系列」Linux简介及常见的Linux系统

文章目录 一、Linux简介二、常见的Linux系统三、Linux 应用领域四、Linux对比Windows五、相关链接 一、Linux简介 Linux是一种自由和开放源代码的类Unix操作系统&#xff0c;它最初是作为Unix操作系统的替代品而开发的。Linux操作系统的内核由林纳斯托瓦兹在1991年首次发布&am…

Sunday 算法介绍

1. Sunday 算法介绍 「Sunday 算法」 是一种在字符串中查找子串的算法&#xff0c;是 Daniel M.Sunday 于1990年提出的字符串模式匹配算法。 Sunday 算法思想&#xff1a;对于给定文本串 T 与模式串 p&#xff0c;先对模式串 p 进行预处理。然后在匹配的过程中&#xff0c;当发…

UE5.1 iClone8 正确导入角色骨骼与动作

使用iClone8插件Auto Setup 附录下载链接 里面有两个文件夹,使用Auto Setup C:\Program Files\Reallusion\Shared Plugins 在UE内新建Plugins,把插件复制进去 在工具栏出现这三个人物的图标就安装成功了 iClone选择角色,导入动作 选择导出FBX UE内直接导入 会出现是否启动插件…

docker的常用指令

docker的常用指令 从docker镜像仓库&#xff0c;搜索所有和mysql有关的镜像 docker search mysql 从docker仓库拉取mysql docker pull mysql这里的mysql是指使用search搜索出来的所有容器的NAME 如果和我一样遇到以下问题&#xff1a; 我可以登录阿里云的官网&#xff0c;找…

基于springboot+vue实现计算机等级考试报名系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现计算机等级考试报名演示 摘要 在进入二十一世纪之后&#xff0c;网络发展越来越迅速&#xff0c;人们的很多生活习惯与消费习惯都随之发生了改变&#xff0c;计算机技术为人们的生活带来了很多的便利。而计算机技术是我国各个教育阶段中的一门必修课程&a…

Golang中map数据结构字段解析

Golang里map底层数据结构具体如下图所示&#xff1a; map其实就是一个指向 hmap 的指针&#xff0c;占用了8个字节 hmap各自段存放的字段意义如下&#xff1a; 字段含义countmap中元素的个数&#xff0c;对应len (map)的值flags状态标志位&#xff0c;标记map的一些状态B桶数…

Spring中使用内置的tomcat容器启动后自动退出问题解决方法

在Spring中使用内置的tomcat 启动后自动退出 退出代码为0 且不报任务错误的解决方法. 日志如下: Connected to the target VM, address: 127.0.0.1:51129, transport: socket 三月 15, 2024 11:55:00 下午 org.apache.coyote.AbstractProtocol init 信息: Initializing Proto…

C/C++ Socket 获取或设置 TCP MSS 大小

通过 Socket 系统接口&#xff0c;链接到一个TCP服务器&#xff0c;那么在链接成功之后会被配置一个从本地端到目的端最佳的TCP_MSS大小。 我们通过这个特点&#xff0c;即可轻松的实现&#xff0c;链路MTU大小发现功能&#xff0c;在不依赖ROOT管理员权限的情况下&#xff0c;…

免费阅读篇 | 芒果YOLOv8改进111:注意力机制CBAM:轻量级卷积块注意力模块,无缝集成到任何CNN架构中,开销可以忽略不计

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 该篇博客为免费阅读内容&#xff0c;YOLOv8CBAM改进内容&#x1f680;&#x1f680;&am…