如果你想弄明白什么怎样才可以实现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;

通过这个结果我们可以看出我们轻易的将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的时候会存在这个键。

JavaScript原型链污染探讨的更多相关文章

  1. javascript 原型链污染

    原理①javascript中构造函数就相当于类,并且可以将其实例化 ②javascript的每一个函数都有一个prototype属性,用来指向该构造函数的原型同样的javascript的每一个实例对象 ...

  2. 初探JavaScript原型链污染

    18年p师傅在知识星球出了一些代码审计题目,其中就有一道难度为hard的js题目(Thejs)为原型链污染攻击,而当时我因为太忙了(其实是太菜了,流下了没技术的泪水)并没有认真看过,后续在p师傅写出w ...

  3. redpwnctf-web-blueprint-javascript 原型链污染学习总结

    前几天看了redpwn的一道web题,node.js的web,涉及知识点是javascript 原型链污染,以前没咋接触过js,并且这个洞貌似也比较新,因此记录一下学习过程 1.本机node.js环境 ...

  4. JavaScript原型链及其污染

    JavaScript原型链及其污染 一.什么是原型链? 1.JavaScript中,我们如果要define一个类,需要以define"构造函数"的方式来define: functi ...

  5. js原型链污染详解

    前言 之前打某湖论剑,两道js的题,给我整懵逼了,发现以前都没对js做过多少研究,趁着被毒打了,先研究一波js原型链,未雨绸缪. 基础 protype 首先我们研究js原型链,得搞明白原型是什么,这里 ...

  6. JavaScript学习总结(十七)——Javascript原型链的原理

    一.JavaScript原型链 ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.在JavaScript中, ...

  7. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = { d: 40 }; var a = { x: 10, calculate: function (z) ...

  8. 明白JavaScript原型链和JavaScrip继承

    原型链是JavaScript的基础性内容之一.其本质是JavaScript内部的设计逻辑. 首先看一组代码: <script type="text/javascript"&g ...

  9. Javascript 原型链资料收集

    Javascript 原型链资料收集 先收集,后理解. 理解JavaScript的原型链和继承 https://blog.oyanglul.us/javascript/understand-proto ...

  10. 资料--JavaScript原型链

    JavaScript原型链 原文出处:https://www.cnblogs.com/chengzp/p/prototype.html 目录 创建对象有几种方法 原型.构造函数.实例.原型链 inst ...

随机推荐

  1. 【SpringCloud】Re04 Gateway

    微服务网关: 1.身份认证 和 权限校验 2.服务路由.负载均衡 3.请求限流 搭建服务网关: 网关是一个独立的服务,同样需要被注册中心注册到,这里依然使用的是Nacos <?xml versi ...

  2. 人形机器人(humanoid)(双足机器人、四足机器人) —— 硬件测试的方法

    硬件测试的方法: 硬件的稳定性.鲁棒性.为机器人设定好固有的执行策略,然后长时间的让机器人重复执行这些既定好的动作.该种测试方法主要测试硬件的设计是否合理,硬件在长时间的运行中是否可以稳定运行而不是出 ...

  3. YouTube上的很多时视频就是有问题的,还经常不允许评论,妥妥的双标网站

    过多的事情不说了,这些个外国反华势力的网站真是无时无刻的不在视频中加私货,你想评论吧他还能判断你的个人价值观来预估你的评价倾向然后禁止你评价,十分的气人.要是立场不够坚定的人真的是很容易被带偏,像这种 ...

  4. 再用国产操作系统deepin出现拖影现象

    问题如题,使用deepin系统后发现不论是网页的拖动.滑动都会出现明显拖影现象,最神奇的是使用爱奇艺的客户端播放器时同样出现拖影现象. 不过这个拖影现象截图还体现不出来这个拖影的效果,估计只有录屏才可 ...

  5. Sentry 开源版与商业 SaaS 版的区别

    您会在官方的文档中找到大量对 sentry 和 getsentry 的引用.两者都是 Django 应用程序,但 sentry 是开源的, getsentry 是闭源的.里面有什么? https:// ...

  6. Edge实验性功能中文翻译

    平行下载 启用平行下载以加速下载速度.- Mac, Windows, Linux, Android #enable-parallel-downloading 已启用 临时恢复 M125 标记 临时恢复 ...

  7. uniapp苹果开发用什么截屏

    uniapp开发好苹果的app后,需要上架到app store connect后,用户才能使用app store进行安装. 在上架app store的过程中,却要求我们提供多种尺寸的app运行的设备截 ...

  8. 全志T113s3工业开发板文章汇总

    全志T113s3工业开发板 T113开发交流QQ群:120575746 交流论坛:https://forums.100ask.net/c/aw/ 文章目录汇总 教程共计7章,下面是章节汇总:第0章_T ...

  9. 22.11.20 ICPC合肥站 打星记录

    A,B,H签到. B题:注意区分相对误差与绝对误差!!小数相对误差小于1e-6,至少要输出十二位! G题优先队列.场上十几分钟就想出来了,表扬自己一波,留个坑位写题解. M题情况不多直接暴搜, 最后一 ...

  10. 使用 iRingo 解锁本该属于你的苹果服务

    为什么别人的 Spotlight 可以通过航班号查询航班信息,而我的不行?为什么别人的 Spotlight 可以直接看英超联赛的比分信息?为什么我的 Apple News 打不开?这其实是因为这些功能 ...