首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

JavaScript原型链污染探讨

编程知识
2024年10月12日 20:45

如果你想弄明白什么怎样才可以实现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的时候会存在这个键。

From:https://www.cnblogs.com/weljoni/p/18461552
本文地址: http://shuzixingkong.net/article/2466
0评论
提交 加载更多评论
其他文章 (系列六).net8 全局异常捕获机制
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。 该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。 说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。 友情提醒:本篇文章是属于系列文章,看该
(系列六).net8 全局异常捕获机制 (系列六).net8 全局异常捕获机制 (系列六).net8 全局异常捕获机制
如何在kubernetes环境中共享GPU
随着人工智能和大模型的快速发展,云上GPU资源共享变得必要,因为它可以降低硬件成本,提升资源利用效率,并满足模型训练和推理对大规模并行计算的需求。 在kubernetes内置的资源调度功能中,GPU调度只能根据“核数”进行调度,但是深度学习等算法程序执行过程中,资源占用比较高的是显存,这样就形成了很
如何在kubernetes环境中共享GPU 如何在kubernetes环境中共享GPU
让查询可以使用 json path
记录一下最近sv.db的完善 1. 让查询可以使用 json path 有时候我们会存储 json 到 db,也有时会只取json部分数据,或者通过json部分数据进行过滤 所以sv.db 也支持这些场景,(目前只有 db 实现,json的操作都是依靠db json 函数) 举例: 数据 a.Exe
四、Spring Boot集成Spring Security之认证流程
Spring Security详细认证过程:包括登录时每个过滤器处理流程及业务处理和登出时每个过滤器处理流程及业务处理
四、Spring Boot集成Spring Security之认证流程 四、Spring Boot集成Spring Security之认证流程 四、Spring Boot集成Spring Security之认证流程
数据结构 - 栈
栈是一种特殊线性数据结构,操作遵循后进先出原则,可解决表达式求值等问题。栈分为顺序栈和链栈,各有特点。文章详细介绍了栈的定义、分类及实现方式,包括顺序栈和链栈的ADT定义及基本操作实现。
数据结构 - 栈 数据结构 - 栈 数据结构 - 栈
Spark任务OOM问题如何解决?
大家好,我是 V 哥。在实际的业务场景中,Spark任务出现OOM(Out of Memory) 问题通常是由于任务处理的数据量过大、资源分配不合理或者代码存在性能瓶颈等原因造成的。针对不同的业务场景和原因,可以从以下几个方面进行优化和解决。 一、业务场景及可能的OOM原因分析 数据量过大: 业务场
Nuxt3+PM2集群模式启动及勘误
起因 之前写过一篇 Nuxt3 的文章,Nuxt3 环境变量配置,用到了 PM2,但是里面的一些配置存在问题,最近有空又验证了一下,这里做一个勘误。 问题 PM2 的启动配置中有一项是exec_mode,默认是fork,另一个可选值是cluster,fork 是单进程模式,cluster 是多进程模
Nuxt3+PM2集群模式启动及勘误 Nuxt3+PM2集群模式启动及勘误 Nuxt3+PM2集群模式启动及勘误
Android 车载应用开发指南 - CAN Bus 协议详解
​ 在现代车载应用开发中,CAN(Controller Area Network)总线协议扮演着不可或缺的角色。作为一个汽车内部网络的标准协议,CAN Bus 已经成为了车载系统通信的基础。而在 Android 车载应用开发的过程中,理解并利用好 CAN Bus 协议是必不可少的。 那么,CAN B
Android 车载应用开发指南 - CAN Bus 协议详解 Android 车载应用开发指南 - CAN Bus 协议详解 Android 车载应用开发指南 - CAN Bus 协议详解