首页 > 编程语言 >JavaScript原型链污染探讨

JavaScript原型链污染探讨

时间:2024-10-12 21:46:27浏览次数:1  
标签:__ proto 对象 JavaScript dog 污染 原型 prototype

如果你想弄明白什么怎样才可以实现JavaScript的原型链污染,那么你首先需要弄清楚两个东西,那就是__proto__prototype

到底什么才是__proto__prototype?

那我们先来看看比较官方的说法吧:

__proto__:是每个对象的隐藏属性,指向创建该对象的构造函数的原型对象(prototype)。它是对象用于继承属性和方法的机制。它是一个对象。所有的对象都可以通过__proto__ 来访问它的原型,进而实现原型链查找。
prototype是函数(特别是构造函数)特有的属性,它用于定义由该构造函数创建的实例共享的属性和方法。prototype通常用来定义构造函数的实例方法。当我们创建一个新对象时,该对象会继承其构造函数 prototype上的属性和方法。
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true

在这个例子中,obj是通过Object构造函数创建的,所以obj.__proto__指向Object.prototype

那我们可以这样去理解,prototype是类通有的属性,当类被实例化为对象后,对象会拥有prototype中的属性和方法。当对象想去访问类的原型时用__proto__属性来访问类的原型。

prototype链

了解了__proto__prototype之后,那我们就要去深入了解JavaScript的继承链,在JavaScript中,每个对象都有一个指向其原型的内部链接(即__proto__),这个原型本身也是一个对象,通常还有自己的原型,这样就形成了一条原型链。当你访问一个对象的属性时,JavaScript 会沿着这条原型链逐级查找,直到找到该属性或者原型链的顶端(即Object.prototype)。

function Animal(name) {
  this.name = name;
}

function Something() {
  this.speak = console.log(this.name + ' makes a beautiful sound.');
};

const dog = new Animal('Dog');
dog.speak; // 输出: 'Dog makes a beautiful sound.'

实例化Animal类创建了dog对象,当访问speak属性时,在dog中寻找不到时,会在dog.__proto__.__proto__中寻找,发现dog.__proto__.__proto__中有speak属性,也就是Something.prototype中存在speak属性。也就是说JavaScript使用prototype链实现继承机制。

prototype链污染(原型链污染)

那我们学习继承、prototype链不就是为了进行链子污染,然后得到我们想得到的东西吗?

既然dog.__proto__.__proto__指向创建该对象的构造函数的原型对象(Something.prototype)。那么我们修改dog.__proto__.__proto__的内容是不是可以进而实现了修改Something类。

示例:

function Animal(name) {
    this.name = name;
}

function Something() {
    this.speak = console.log(this.name + ' makes a beautiful sound.');
};

const dog = new Animal('Dog');

dog.__proto__.speak = console.log('修改成功');

dog.speak;

image

通过这个结果我们可以看出我们轻易的将dog.__proto__.__proto__的speak值进行了更改。我们先将这个继承链给搞出来:

dog -> Animal.prototype -> Something.prototype -> Object.prototype -> null

那么攻击者如果通过一个入口点,控制并修改了一个对象的原型,那么将可能影响所有和这个对象来自同一个类、父类直到Object类的对象。

典型的便是merge操作导致原型链污染:

javascript
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 object1 = {}
let object2 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}')
merge(object1, object2)
console.log(object1.a, object1.b)

object3 = {}
console.log(object3.b)
//1 2
//2

在JSON解析的情况下,__proto__会被认为是一个真正的“键名”,而不代表“原型”,所以在遍历object2的时候会存在这个键。

标签:__,proto,对象,JavaScript,dog,污染,原型,prototype
From: https://www.cnblogs.com/weljoni/p/18461552

相关文章

  • JavaScript进阶笔记--深入对象-内置构造函数及案例
    深入对象创建对象三种方式利用对象字面量newObject({…})利用构造函数//1.字面量创建对象constobj1={name:'pig',age:18};console.log(obj1);//{name:"pig",age:18}//2.构造函数创建对象functionPig(name,age){......
  • JavaScript 异步编程入门
    最近开始不断学习实践JavaScript,出于性能测试的敏感,首先研究了JavaScript的异步编程实践,目前看跟之前学过的Java和Go都不太一样。使用的语法上相对更加复杂,也可能因为我实践得还太少。异步编程异步编程是一种在程序执行过程中,不阻塞主线程的任务处理方式。相较于同步编程......
  • 【JavaScript】LeetCode:61-65
    文章目录61课程表62实现Trie(前缀树)63全排列64子集65电话号码的字母组合61课程表Map+BFS拓扑排序:将有向无环图转为线性顺序。遍历prerequisites:1.数组记录每个节点的入度,2.哈希表记录依赖关系。n=6,prerequisites=[[3,0],[3,1],[4,1],[4,2],[5,3],[5,4]]。0、1......
  • 2000-2023年上市公司行业异质性数据(东中西、劳动密集型、技术密集型、资本密集型、高
    2000-2023年上市公司行业异质性数据(东中西、劳动密集型、技术密集型、资本密集型、高科技重污染分组)1、时间:2000-2023年2、指标:证券代码、年份、股票简称、行业代码、行业名称、是否stpt、是否金融、是否制造业、是否深证上市、是否上证上市、是否沪深上市、是否北证上市、是......
  • 前后端分离nodejs_vue+javascript个人身体健康档案管理系统
    目录技术栈具体实现截图开发工具和技术简介错误处理和异常处理nodejs类核心代码部分展示解决的思路其他题目推荐源码获取/联系我技术栈该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是MySQL,为了更加便捷地使用数据库,用到了......
  • JavaScript原型链污染漏洞分析
    原型链污染漏洞CVE:1、yargs-Parser输入验证错误漏洞(CVE-2020-7608)2、tough-cookie安全漏洞(CVE-2023-26136)3、JSON5原型污染漏洞(CVE-2022-46175) 漏洞描述:1、yargs-Parser输入验证错误漏洞(CVE-2020-7608):yargs-parser是一款选项解析器。yargs-parser13.1.2之前......
  • JavaScript
    什么是JavaScript?Web标准也称为网页标准,由一系列的标准组成,大部分由W3C(WorldWideWebConsortium,万维网联盟)负责制定。三个组成部分:HTML:负责网页的基本结构(页面元素和内容)。CSS:负责网页的表现效果(页面元素的外观、位置等页面样式,如:颜色、大小等)。JavaScript:负责网页的......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(篮球)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript培训机构(英语教育)
    HTML+CSS+JS【培训机构】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • JavaScript 第4章:函数与作用域
    在JavaScript中,函数是程序设计中的重要组成部分,它们用于封装一段代码以执行特定的任务。下面我们将逐一探讨第4章提到的各个概念。1.函数声明vs函数表达式函数声明(FunctionDeclaration)是使用function关键字定义一个函数,并给它命名的一种方式。这种方式定义的函数会......