Node.js基础+原型链污染

news2025/3/17 2:26:45

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.coloradmin.cn/o/1520074.html

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

相关文章

【iOS ARKit】PhysicsBodyComponent

在学习完 RealityKit 进行物理模拟的相关理论知识后,下面通过使用 PhysicsBodyComponent 组件进行物理模拟演示,主要代码如下所示,稍后对代码进行详细解析。 // // PhysicsBodyView.swift // ARKitDeamo // // Created by zhaoquan du on…

禁止ie自动跳转edge

因为微软对ie已经彻底停止维护了,对于没有升级系统的用户来说,会自动更新edge然后将ie给禁止使用。下面方法有效的解决windows10下,禁止ie自动跳转edge。 方法一:对于2023年10月份前的更新可用 打开控制面板,点击网络…

一个能够自我游戏的贪吃蛇(pygame与搜索算法)

贪吃蛇小游戏再经典不过了,作为编程爱好者,代码编译的贪吃蛇,又能有怎样的成绩呢? 带着好奇,开始! 先做一个普通的贪吃蛇游戏 引入相关package import pygame 定义相关配置变量 # 定义字体 font pyg…

Java 根据IP获取IP地址信息(离线)

<!-- https://mvnrepository.com/artifact/org.lionsoul/ip2region --><dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency> 地址&#xff1a;http…

DBA面试题:MySQL缓存池LRU算法做了哪些改进?

下图是MySQL&#xff08;MySQL5.7版本&#xff09;体系架构图 MySQL的InnoDb Buffer Pool 缓冲池是主内存中的一个区域&#xff0c;用来缓存InnoDB在访问表和索引时的数据。对于频繁使用的数据可以直接从内存中访问&#xff0c;从而加快处理速度。如果一台服务器专用作MySQL数据…

逻辑数据平台的 NoETL 之道(内含QA)

作者简介&#xff1a; 余俊&#xff0c;Aloudata 合伙人 & 技术副总裁。拥有 18 年互联网技术和大数据平台相关架构经验。作为主架构师及核心研发主导并完成了 Alibaba B2B 首个海量分布式 KV 存储系统&#xff0c;作为网站架构师负责 Aliexpress 全球买全球卖交易系统的第…

【四 (1)数据可视化之如何选用正确的图表】

目录 文章导航一、数据分析中可视化的作用1、揭示数据关联和模式2、支持数据分析和决策3、提升沟通和共享效果4、强调关键信息和发现5、增强故事叙述和记忆效果6、有效增强数据交互性数据7、复杂信息易理解8、数据多维度显示 二、如何选用合适的图表1、简洁性避免使用过于复杂或…

Adobe PDF背景设置护眼模式,缓解眼部疲劳

一、背景 在用Adobe PDF看论文时&#xff0c;默认的白色背景看久了&#xff0c;眼睛会特别疲劳&#xff0c;下面介绍如何设置背景为护眼模式。 二、设置PDF为护眼模式 使用Adobe Acrobat Pro DC打开任意PDF文件&#xff0c;在上方工具栏选择“编辑”&#xff0c;在下拉菜单栏…

VS2022一个项目中运行多个c++程序

VS2022一个项目中运行多个c程序设置 问题情况解决 问题 一般使用vs2022都需要配置好一些路径依赖&#xff0c;但一个项目中只能使用一个源文件&#xff0c;这也是为了避免找不到那些依赖&#xff0c;可是我们就是想为了可以快速编写&#xff0c;而不是浪费在那些配置环境的时间…

基于java实用的音乐软件微信小程序的设计与实现【附项目源码】分享

基于实用的音乐软件微信小程序的设计与实现: 源码地址&#xff1a;https://download.csdn.net/download/weixin_43894652/88842586 一、引言 随着移动互联网的普及和微信小程序的兴起&#xff0c;音乐类小程序成为了用户随时随地享受音乐的重要工具。本需求文档旨在详细阐述一…

mac安装rust开发环境,使用brew安装和全局配置

mac下使用brew可以一键安装环境&#xff1a; brew install rustup 安装完成执行&#xff1a; rustup-init 按照提示配置即可&#xff1a; 出现&#xff1a; 想要全局生效&#xff1a; echo export PATH"$HOME/.cargo/bin:$PATH" >> ~/.bash_profile source…

企业级授权源码 – 高价值企业授权系统,内含授权系统、工单系统和盗版检测功能

企业授权系统功能简介&#xff1a; 1、网站管理&#xff1a;包括基本管理、系统设置、公告设置、接口设置、价格设置和下载设置等。 2、内容管理&#xff1a;包括文章管理和广告轮图管理&#xff0c;以及添加授权、授权列表和授权日志等。 3、订单管理&#xff1a;包括支付订…

iOS 腾讯Pag动画框架-实现PagView的截图功能

背景 产品想要一个首页的截图功能&#xff0c;一听这个功能&#xff0c;心想那还不简单&#xff0c;将父视图控件转换成图片保存就行了。按照这个思路实现&#xff0c;很快就打脸啦&#xff0c;首页的这些动画一个都没有截出来&#xff0c;就像消失啦似的。然后蠢蠢的将动画暂…

STM32初识2

复位和时钟控制&#xff08;RCC&#xff1a;reset clock control&#xff09; 系统复位 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a; 1. NRST 引脚上的低电平 ( 外部复位 ) 2. 窗口看门狗计数终止 (WWDG 复位 ) 3. 独立看门狗计数终止 (IWDG 复位 ) …

4、鸿蒙学习-@ohos.promptAction (弹窗)

创建并显示文本提示框、对话框和操作菜单。 说明 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 该模块不支持在UIAbility的文件声明处使用&#xff0c;即不能在UIAbility的生命周期中调用&#xff0c;需要在创建…

云计算 3月14号 (TCP三次握手和四次挥手)

1.TCP三次握手和四次挥手 1.TCP的传输过程&#xff1a; Seq 序列号 保障传输过程可靠。 ACK &#xff08;确认消息&#xff09; SYN &#xff08;在建立TCP连接的时候使用&#xff09; FIN &#xff08;在关闭TCP连接的时候使用&#xff09; 3.TCP建立连接的过程&…

3.Gen<I>Cam文件配置

Gen<I>Cam踩坑指南 我使用的是大恒usb相机&#xff0c;第一步到其官网下载大恒软件安装包,安装完成后图标如图所示&#xff0c;之后连接相机&#xff0c;打开软件&#xff0c;相机显示一切正常。之后查看软件的安装目录如图&#xff0c;发现有GenICam和GenTL两个文件&am…

arcgis pro植被冠层分析及单木识别

测试正射影像和点云数据介绍(文末分享):点云数据每平方米包含 0.5-1 个点。准备的课程如下;地面、水、桥或未分类。两个数据的最小单位覆盖面积为 2.5 x 2.5 公里。两个数据均位于 SWEREF 99 TM 坐标系中。正射影像数据由 RGBI(红、绿、蓝和近红外)波段组成。两个数据的空…

Spark杂谈

文章目录 什么是Spark对比HadoopSpark应用场景Spark数据处理流程什么是RDDSpark架构相关进程入门案例&#xff1a;统计单词数量Spark开启historyServer 什么是Spark Spark是一个用于大规模数据处理的统一计算引擎Spark一个重要的特性就是基于内存计算&#xff0c;从而它的速度…

计算机网络——物理层(奈氏准则和香农定理)

计算机网络——物理层&#xff08;奈氏准则和香农定理&#xff09; 失真码间串扰奈氏准则&#xff08;奈奎斯特定理&#xff09;极限数据率 噪声信噪比香农定理奈氏准则和香农定理的区别 前面我们已经了解一些数据通信的基本知识&#xff0c;没有看过上一篇得小伙伴可以点击这里…