JavaScript原型链污染探讨

2024-10-23 28 0

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

JavaScript原型链污染探讨插图

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

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

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

典型的便是merge操作导致原型链污染,以下是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]
        }
    }
}

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

webpack打包站点,js文件名批量获取思路
加密对抗靶场enctypt——labs通关
【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键
蓝队技术——Sysmon识别检测宏病毒
内网渗透学习|powershell上线cs
LLM attack中的API调用安全问题及靶场实践

发布评论