JavaScript原型链污染

JavaScript原型链污染

  • 一、什么是原型链污染(JS)
  • 二、前置知识
    • 2.1 JS对象
      • 2.11 通过类创建
      • 2.12 字面量模式创建
      • 2.13构造函数模式创建
    • 2.2 默认属性
  • 三、污染利用

一、什么是原型链污染(JS)

原型链污染(Prototype Pollution)是一种安全漏洞,在 JavaScript 中可能会导致意外和不安全的行为。它利用了 JavaScript 中的原型继承机制,通过修改对象的原型链来污染或篡改目标对象的属性。

二、前置知识

2.1 JS对象

属性声明及调用格式如下

key:value //声明

classname.key //调用

方法声明及调用格式如下

methodname:function(){
	……
} //声明

classname.methodname()  //调用

2.11 通过类创建

类的声明与实例化和其他语言相似,如果不声明构造函数,则该函数仍存在但内容为NULL

class demo{
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}
let person = new demo(ELITE,25);
// 访问对象的属性
console.log(person.name); // 输出:ELITE
console.log(person.age); // 输出: 25

2.12 字面量模式创建

JavaScript中对象的字面量模式定义类似于python中的字典,属性是键值对的组合,方法也以类似的形式定义示例如下

var person = {
	name:"ELITE",
	age:19,
	gender:'male',
	sayName:function(){
		console.log("hello world!");
	}
};

2.13构造函数模式创建

// 定义一个函数,将作为对象的构造方法
function Person(name, age) {
  this.name = name;
  this.age = age;
}
// 使用构造方法创建对象实例
var person1 = new Person('Alice', 25);  //给构造方法传值
// 访问对象的属性
console.log(person1.name); // 输出: Alice
console.log(person1.age); // 输出: 25

JavaScript里的构造方法和其他语言中的构造方法相同,都会在对象初始化时自动执行

2.2 默认属性

在JavaScript中一切皆对象(这里就和python类似了),函数也可以理解为一种特殊的变量

  • __proto__ 属性,它是对象独有的,指向对象(构造函数)的原型(可以说是父类)
  • constructor属性,它是对象独有的,指向对象的构造函数
  • prototype属性,它是函数独有的,指向函数的原型对象,也可以说是该函数作为构造函数创建的实例的原型对象

具体关系如图所示
在这里插入图片描述

并且存在这样一个等式

对象.__proto__ == 构造函数.prototype

一般创建的对象的原型默认都是object,例如:

let person = {
  name: 'John',
  age: 30,
  city: 'New York'
};
//未指明构造函数

三、污染利用

污染需要用到这样一个合并函数,和python里的merge函数差不多

function merge(target, source) {
    console.log('merge', target, source);
    // 遍历 source 中的 key。
    for (let key in source) {
        if (key in source && key in target) {
            merge(target[key], source[key])  //递归遍历
        } else {
            target[key] = source[key]  //合并赋值
        }
    }
}

重点在于这一条语句

merge(target[key], source[key])

假定对象如下

let a = {}
let b = {"id": 1, "__proto__": {"no": 2}}

//这俩都未指定原型,默认都为Object

我们要通过a与b的合并,去污染object对象,b为原对象

当for语句迭代到b对象的第二个属性时污染开始,我们的目的是得到 a[_proto_]属性,也就是Object对象,但是我们这种字面量定义方式是错的

let b = {"id": 1, "__proto__": {"no": 2}}

__proto__并不会被原封不动的解释为键值,而是会被当做默认属性解析为 b对象 的原型,这时b对象的原型发生改变,不再是默认的Object,而是后来定义的 {“no”: 2},这样b对象的键值只有a和b,b是在原型(父类)中的,这样只是会正常的合并,而不会污染到上一层

示例如下

demo:

function merge(target, source) {
    for (let key in source) {
        if (key in source && key in target) {
           merge(target[key], source[key])
        } else {
           target[key] = source[key]
        }
   }
}
let a = {}
let b = {"id": 1, "__proto__": {"no": 2}}
merge(a, b)
console.log(a.id,a.no)
console.log(a.__proto__)

结果
在这里插入图片描述

我们应该对payload进行JSON解析处理,这样**_proto_**就可以被当做键值,而不会被解析,示例如下

let b = JSON.parse('{"id": 1, "__proto__": {"no": 2}}')

运行结果
在这里插入图片描述

可以看到成功污染到了Object对象

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

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

相关文章

零基础搭建个人影音媒体平台,实现远程访问Jellyfin播放器的简易方法

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

VBA中如何将if写到一行

在VBA中,可以使用以下两种方式来编写一行if语句: 使用三元运算符: Dim result As String result "Yes" If True Else "No"在这个例子中,如果条件为真,则result变量的值为"Yes"&#…

抖音小程序开发教学系列(1)- 抖音小程序简介

章节一:抖音小程序简介 1.1 抖音小程序的背景和概述 抖音小程序的发展背景和市场趋势: 抖音作为一款热门的短视频社交平台,用户群体庞大,社交共享的特性也为小程序的发展提供了广阔的空间。抖音小程序作为抖音在社交和用户粘性…

质谱技术对蛋白质进行鉴定

参考B站教学视频: 质谱如何鉴定蛋白质_哔哩哔哩_bilibili 针对该视频,别人的 笔记 质谱是一台体重秤,称的不是人,而是分子、原子的体重 不同分子有不同分子量是质谱仪工作的底层逻辑 图片来自:【蛋白组】蛋白质组定量技术的原理和…

HTML+JavaScript+CSS DIY 分隔条splitter

一、需求分析 现在电脑的屏幕越来越大,为了利用好宽屏,我们在设计系统UI时喜欢在左侧放个菜单或选项面板,在右边显示与菜单或选项对应的内容,两者之间用分隔条splitter来间隔,并可以通过拖动分隔条splitter来动态调研…

GaussDB数据库SQL系列-行列转换

一、前言 二、简述 1、行转列概念 2、列转行概念 三、GaussDB数据库的行列转行实验示例 1、行转列示例 1)创建实验表(行存表) 2)静态行转列 3)行转列(结果值:拼接式) 4&…

maven部署

一、下载Maven 地址:Maven – Download Apache Maven 二、解压缩,设置环境变量 tar -xvf apache-maven-3.8.8-bin.tar.gz export MAVEN_HOME/opt/apache-maven-3.8.8 export PATH$MAVEN_HOME/bin:$PATH echo $MAVEN_HOME echo $PATH mvn -v

Android AGP版本

做个记录: Android AGP版本 https://developer.android.com/studio/releases/gradle-plugin?hlzh-cn

mac idea启动没反应 无法启动

遇到的问题如下: 启动idea,没反应 无法启动,不论破解还是别的原因,总之无法启动了 应用程序–找到idea–右击显示包内容–Contents–MacOS–打开idea 弹出框提示如下: 双击这个idea可执行文件 1)先查看日志…

Kafka3.0.0版本——Leader故障处理细节原理

目录 一、服务器信息二、服务器基本信息及相关概念2.1、服务器基本信息2.2、LEO的概念2.3、HW的概念 三、Leader故障处理细节 一、服务器信息 三台服务器 原始服务器名称原始服务器ip节点centos7虚拟机1192.168.136.27broker0centos7虚拟机2192.168.136.28broker1centos7虚拟机…

docker安装grafana,prometheus,exporter以及springboot整合详细教程(GPE)

springboot项目ip:192.168.168.1 测试服务器ip:192.168.168.81 文章来自互联网,自己略微整理下,更容易上手,方便自己,方便大家 最终效果: node springboot 1.下载镜像 docker pull prom/node-exporter docker pull prom/mysqld-exporter docker pull google/cadvisor dock…

「黄钊的AI日报·第一季」免费试读!最后5天,早鸟价60元~

1、每天5条AI内容点:不是常见的新闻汇总模式,而是站在AI产品经理的视角,把每篇AI干货的最核心内容,直接拎出来、甚至用自己的话来描述,是在展示“what I see”,和原文已经不是一个东西了! 2、已…

MIT6.824 Spring2021 Lab 1: MapReduce

文章目录 0x00 准备0x01 MapReduce简介0x02 RPC0x03 调试0x04 代码coordinator.gorpc.goworker.go 0x00 准备 阅读MapReduce论文配置GO环境 因为之前没用过GO,所以 先在网上学了一下语法A Tour of Go 感觉Go的接口和方法的语法和C挺不一样, 并发编程也挺有意思 0x01 MapRed…

OpenAI推出ChatGPT企业版,提供更高安全和隐私保障

🦉 AI新闻 🚀 OpenAI推出ChatGPT企业版,提供更高安全和隐私保障 摘要:OpenAI发布了面向企业用户的ChatGPT企业版,用户可以无限制地访问强大的GPT-4模型,进行更深入的数据分析,并且拥有完全控制…

如何使用 Amazon EMR 在 Amazon EKS 上构建可靠、高效、用户友好的 Spark 平台

这是 SafeGraph 技术主管经理 Nan Zhu 与亚马逊云科技高级解决方案架构师 Dave Thibault 共同撰写的特约文章。 SafeGraph 是一家地理空间数据公司,管理着全球超过 4100 万个兴趣点(POI,Point of Interest),提供品牌隶…

单片机-芯片怎么看图连接

单片机连接数码管 硬件连接线路图 单片机中的IO口连接端子 J25 ,J25 连接 2个电阻 PR14 ,引出管脚 P22 ,P23,P24 P22 、P23、P24 连接 3-8 译码器 三输入、8输出 8 输出 ,连接8个LED1~LED8 用到三个芯片&#xff…

如何将 PDF 转换为 Word:前 5 个应用程序

必须将 PDF 转换为 Word 才能对其进行编辑和自定义。所以这里有 5 种很棒的方法 PDF 文件被广泛使用,因为它非常稳定且难以更改。这在处理法律合同、财务文件和推荐信等重要文件时尤其重要。但是,有时您可能需要编辑 PDF 文件。最好的方法是使用应用程序…

回归拟合 | 灰狼算法优化核极限学习机(GWO-KELM)MATLAB实现

这周有粉丝私信想让我出一期GWO-KELM的文章,因此乘着今天休息就更新了(希望不算晚) 作者在前面的文章中介绍了ELM和KELM的原理及其实现,ELM具有训练速度快、复杂度低、克服了传统梯度算法的局部极小、过拟合和学习率的选择不合适等优点,而KEL…

OceanBase安全审计之传输加密

上一期我们讲了关于 OceanBase 安全审计的《身份鉴别》和《用户管理与访问控制》 两个部分,OceanBase 的安全机制介绍其支持传输加密,今天我们主要来实践一下如何配置传输加密以及验证是否真的加密。 作者:金长龙 爱可生测试工程师&#xff0…

【Stable Diffusion安装】支持python3.11 window版

前言 主要的安装步骤是参考B站播放量第一的视频,但是那位阿婆主应该是没有编程经验,只强调使用3.10,而python最新版本是3.11。 理论上来说,只是一个小版本的不同,应该是可以安装成功了。自己摸索了下,挺费…