js原型链污染简单解析

通过一道题认识到这个漏洞

[GYCTF2020]Ez_Express 1 

于是就学了一下

首先呢JavaScript是一门灵活的语言,基于原型实现继承,原型是Javascript的继承的基础。

对于原型的理解可以类似为java语言里的类和对象的关系,对象是类的实例化类就是对象的原型

原型是Javascript的继承的基础

在js中我们构建一个类如下

function Test() {
    this.test = "test"
}

构造了一个Test类

在js中每个实例对象都有一个私有属性__proto__  这个属性是每一个实例对象都具有的

而__proto__指向它的构造函数的原型prototype也就是

现在我们实例化了一个对象test1,

test1.__proto__ == Test.prototype

也就是实例化的对象的属性的__proto__等于类的 prototype

那么如果能修改类实例属性,是不是就能修改类的相关信息呢?

可能你觉得只是相等而已,其实这里面有个指针,当其中一个变了另一个也会变(__proto__或prototype)

请看一下案例

这里修改test2.__proto__ 之后test1.b也被赋予了值 

这就要知道是怎么去给它赋值的

是因为:对于对象test1,在调用test1.b的时候,实际上JavaScript引擎会进行如下操作:

1.在对象test1中寻找b

2.找不到,在test1.__proto__中寻找b(这里的test1.__proto__同样指向Test的原型prototype)

3.如果仍然找不到,则继续在test1.__proto__.__proto__中寻找b

4.依次寻找,直到找到null结束。比如,Object.prototype的__proto__就是null

所以说我们可以发现事情的端倪了,然后加以利用

那么在Javascript中,我们何时可以控制实例对象的__proto__来污染原型链呢,只要找到可以控制数组(对象)的键名的位置即可,比如

1.对象clone

2.对象merge

以merge举例,要使__proto__作为key被赋值,还需要一个条件为传递的参数需要是以json来做解析,否则__proto__会被当作原型而不是一个key,故也就无法成功污染

也就是说如果看到clone或者merge就有可能存在原型链污染

这里直接用前辈的实例举例子

直接赋值,污染原型链失败:

使用Json.parse,污染成功

 也就是说我们可能通过实例修改类的相关值了

大体思路就是这样

本文是由前辈文章加以解释修改的原文:初探JavaScript原型链污染 - Escape-w - 博客园 (cnblogs.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,原型链污染是一种特殊的攻击技术,它利用JavaScript的原型继承机制来修改对象的原型链并注入恶意代码。通过修改对象的原型链,攻击者可以影响对象的行为并执行恶意操作。 实现原型链污染的过程如下: 1. 攻击者首先要找到一个合适的目标对象,该对象通常是在代码中被使用的,并且具有对外部输入进行处理的功能。 2. 攻击者通过修改目标对象的原型链,向其原型对象中添加恶意代码或属性。这通常是通过修改被攻击对象的__proto__属性来实现的。 3. 当目标对象在后续的代码中被使用时,恶意代码或属性将会被执行或访问。 例如,在Node.js中,如果一个Web应用程序使用了一个处理JSON数据的库,并且对外部的JSON数据没有进行充分的验证和过滤,那么攻击者可以通过构造恶意的JSON数据来实现原型链污染。攻击者可以将恶意代码添加到JSON数据中的__proto__属性,当应用程序解析并使用该JSON数据时,恶意代码将被执行。 总结起来,Node.js原型链污染是一种利用JavaScript的原型继承机制来修改对象的原型链并注入恶意代码的攻击技术。攻击者可以通过修改目标对象的__proto__属性来实现原型链污染,并在后续的代码中执行恶意操作。因此,在开发过程中,需要注意对外部输入的验证和过滤,以防止原型链污染攻击的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值