首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用前端原型链漏洞污染拿下了服务器

0x01 JavaScript的原型链 1.1 基本概念 在javaScript,实例对象与原型之间的链接,叫做原型链。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。...然后层层递进,就构成了实例与原型的链条,这就是所谓原型链的基本概念。 三个名词: 隐式原型:所有引用类型(函数、数组对象)都有 __proto__ 属性,例如arr....__proto__ 显式原型:所有函数拥有prototype属性,例如:func.prototype 原型对象:拥有prototype属性对象,在定义函数时被创建 原型链之间的关系可以参考图1.1:...例如声明了一个arr数组类型的变量,arr变量却可以调用如下图中并未定义的方法和属性通过变量的隐式原型可以查看到,数组类型变量的原型已经定义了这些方法。...在实例化一个新对象b的时候,虽然没有role属性,但是通过原型链可以读取到通过对象a在原型链上赋值的‘administrator’。

3.2K20

前端原型链污染漏洞竟可以拿下服务器shell?

0x01 JavaScript的原型链 1.1 基本概念 在javaScript,实例对象与原型之间的链接,叫做原型链。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。...然后层层递进,就构成了实例与原型的链条,这就是所谓原型链的基本概念。 三个名词: 隐式原型:所有引用类型(函数、数组对象)都有 __proto__ 属性,例如arr....__proto__ 显式原型:所有函数拥有prototype属性,例如:func.prototype 原型对象:拥有prototype属性对象,在定义函数时被创建 原型链之间的关系可以参考图1.1:...例如声明了一个arr数组类型的变量,arr变量却可以调用如下图中并未定义的方法和属性通过变量的隐式原型可以查看到,数组类型变量的原型已经定义了这些方法。...在实例化一个新对象b的时候,虽然没有role属性,但是通过原型链可以读取到通过对象a在原型链上赋值的‘administrator’。

1K20
您找到你想要的搜索结果了吗?
是的
没有找到

学习lodash的几个常用方法

npm i --save lodash 在使用的时候引入一下,一般就是这样的↓ import_from'lodash'; 然后我浏览了一下公司的项目,看他们平时都用哪些方法,下面是我找到的,接下来我们看看这些方法主要是怎么用的...它和原生JS不同, 原生JSmap是只适用于数组的方法,但是在lodash,也可以适用于对象。...首先id和name就是我们在res解构出来的属性,他们的值就是遍历res后每一条数据的id和name的值,然后调了一个接口,每次调用使用参数的就是刚刚解构出来的id, 在得到返回的数据后, 对数据结果进行了处理...应该是模板要v-for渲染的,title应该是要展示的内容。 pick 对象方法 创建一个 object 中选中的属性对象。...,array数组的起始元素开始提取n个元素。

26810

Lodash那些“多余”和让人眼前一亮的 API

,可用于清空数组 // [1, 2] 眼前一亮的API pullAt (根据下标选择元素,分到两个数组) takeRight ( 返回结尾元素开始n个元素的数组切片 ) // 倒数解构...}] } } xor( 创建一个给定数组唯一值的数组 ) 眼前二亮的API remove(元素筛选,分到两个数组) sortedUniq (去重,排序) takeRightWhile ( array...数组的最后一个元素开始提取元素,直到 predicate 返回假值 ) uniqBy (去重,排序) 四、集合 Collection Collection很多API都能让人眼前一亮,在实际开发中都能得到应用...forEach(遍历数组对象) | forEachRight(反序遍历数组对象) // 遍历数组有点多余 lodash([1, 2]).forEach((val) => { console.log.../ true console.log(lodash.isEqual(postData1, postData3)) // true pick | pickBy:摘选对象属性,功能和omit |

3.4K10

JS基础知识总结(二):浅拷贝与深拷贝

1.jpg 2.实现方式 2.1浅拷贝的实现方式 2.1.1Object.assign() 可以把任意多个的源对象自身的可枚举属性拷贝给目标对象然后返回目标对象。...Object.assign()只会拷贝所有的属性值到新的对象,如果属性值是基本类型,则修改其中一个对象,不会影响另一个。而如果属性值是对象的话,拷贝的是对象的引用,而不是对象本身。...分两种情况: (1)属性值是基本类型,修改其中一个对象,不会影响另一个对象的该属性: var iniObj = { name: "peter", }; var newObj = Object.assign...,并没有创建一个新对象,而是把原对象在栈的地址(而非栈的数据)赋给了新对象,即赋的是原对象在栈的地址,原对象和新对象指向的是同一个地址。...因此,两个对象的联动的,修改其中一个,另一个也会改变。包括里面所有的属性,不论是基本类型的数据,还是对象引用。

2.8K361

前端面试拔高题

clone(this[attr]) : this[attr];} } return copy; }; 对象是 JS 基本类型之一,而且和原型链、数组等知识息息相关。...不管是面试,还是实际开发我们都会碰见深拷贝对象的问题。 顾名思义,深拷贝就是完完整整的将一个对象内存拷贝一份出来。所以无论用什么办法,必然绕不开开辟一块新的内存空间。...lodash的深拷贝实现 著名的 lodash 的 cloneDeep 方法同样是使用这种方法实现的,只不过它支持的对象种类更多,具体的实现过程读者可以参考 lodash 的 baseClone 方法...lodash 应对环对象办法.png 因为 lodash 使用的是栈把对象存储起来了,如果有环对象,就会栈里检测到,从而直接返回结果,悬崖勒马。...、数组属性遍历一遍,赋给一个新的对象

86441

lodash源码之slice看稀疏数组与密集数组

密集数组VS稀疏数组 我们先来看看犀牛书是怎样定义稀疏数组的: 稀疏数组就是包含0开始的不连续索引的数组。通常,数组的length属性值代表数组中元素的个数。...先来看下 MDN 对该参数的描述: 如果该参数为负数,则表示数组的倒数第几个元素开始提取。 如果省略,则从索引0开始 start = start == null ?...因为 lodash 的 slice 除了可以处理数组外,也可以处理类数组,因此第一个参数 array 可能为一个对象, length 属性不一定为数字。...用 while 循环, start 位置开始,获取原数组的值,依次存入新的数组。...因为是通过索引取值,如果遇到稀疏数组,对应的索引值上没有元素时,通过数组索引取值返回的是 undefined, 但这并不是说稀疏数组该位置的值为 undefined 。

1.1K00

JavaScript原型链污染原理及相关CVE漏洞剖析

0x01 JavaScript原型 JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象对象以其原型为模板、原型继承方法和属性...当我们访问person的一个属性时,浏览器首先查找person是否有这个属性.如果没有,然后浏览器就会在person的proto查找这个属性(也就是Person.prototype)。...攻击者可以通过注入其他值来覆盖或污染这些proto,构造函数和原型属性然后,所有继承了被污染原型的对象都会受到影响。原型链污染通常会导致拒绝服务、篡改程序执行流程、导致远程执行代码等漏洞。...POCextend函数的第2个参数是合并的目标对象,此处是空对象{},第3个参数开始,就是将要合并到目标对象的源对象options,jQuery用一个for循环依次处理它们。 ?...这一段循环代码的执行逻辑大致如下:按属性数组中元素的顺序,依次获取对象原有的属性值,并进行赋值;如果该属性不是数组的最后一个元素,那赋值为对象本身,或空数组,或{}。

3K20

5 个 JS 数组技巧可提高你的开发技能

对于数组嵌套的对象值而言,不是一个好的选择。...按属性对象数组 进行排序 我们知道 JS 数组的 sort 方法是按字典顺序进行排序的,所以对于字符串类, 该方法是可以很好的正常工作,但对于数据元素是对象类型,就不太好使了,这里我们需要自定义一个排序方法...数组中选择一个元素 对于此任务,我们有多种方式,一种是使用 forEach 组合 if-else 的方式 ,另一种可以使用filter 方法,但是使用forEach 和filter的缺点是: 在forEach...,我们要额外的遍历其它不需要元素,并且还要使用 if 语句来提取所需的值。...在filter 方法,我们有一个简单的比较操作,但是它将返回的是一个数组,而是我们想要是根据给定条件数组获得单个对象

1.2K11

lodash 是如何做类型检测的

所以要结合以下两个函数来判断,value 是否为 object 然后通过过 toString() 来获取每个对象的类型。...那么 lodash 为什么要对其进行检测,原来是创建一个显式包装器对象 ECMAScript 6 开始不再被支持,现在可以利用如下代码来模拟,虽然没什么用。...与 undefined 不同的是,它是一个字面量,而 undefined 是全局对象的一个属性逻辑角度来看,null 值表示一个空对象指针,null 是表示缺少的标识,指示变量未指向任何对象。...它有一个很重要的用途,就是在 JavaScript 的所有对象都来自 Object;所有对象Object.prototype继承方法和属性,尽管它们可能被覆盖。...在存在不同全局变量的环境,通过语义 instanceof 检测数组的时候,value instanceof Array只有当 value 是由该页面的原始 Array 构造函数创建数组时才能正常工作。

1.6K20

学会这几个JS知识点,面试包你通过

result } 使用Symbol作为key,是为了防止重复,例如targetFnKey设置为cb,当传入的targetObject自身拥有cb这个方法,就会导致执行之后便被delete,导致问题 3 New 创建对象...执行过程 创建一个空对象,作为将要返回的对象实例 将这个空对象的原型指向构造函数的prototype属性 将这个空对象赋值给函数内部的this 执行构造函数内部代码 function _new(/*...); // 取出构造函数 var constructor = args.shift(); // 创建一个空对象,继承构造函数的 prototype 属性 var context = Object.create...compose函数的作用就是组合函数的,将函数串联起来执行,将多个函数组合起来,一个函数的输出结果是另一个函数的输入参数,一旦第一个函数开始执行,就会像多米诺骨牌一样推导执行了 lodash 版本 var..., 'Interesting...' ] console.log(getUserComments({ user: { posts: [] } })); // null 7 对象原型链污染 通过原型可以将原型链上面的方式和属性进行污染

40050

如何在Node.js和Express中上传文件

在本教程,我们将讨论如何使用Node.js和Express后端处理单个和多个文件上传,以及如何将上传的文件保存在服务器上。 安装 首先,让我们通过运行以下命令来创建一个新的Node.js应用程序。...它解析multipart/form-data请求,提取文件(如果有),并在req.files属性下使它们可用。 morgan-用于记录HTTP请求的Node.js中间件。...lodash-一个JavaScript库,为数组,数字,对象,字符串等提供实用程序功能。 创建Express服务器 安装所需的依赖项之后,让我们开始创建Express服务器。...它使上传的文件可从req.files属性访问。 例如,如果您上传名为my-profile.jpg的文件,并且您的字段名是avatar,则可以通过req.files.avatar访问它。...我们使用lodash实用程序函数(_.forEach()和_.keysIn())遍历photos字段,然后将每张照片保存到uploads目录。 测试应用程序 我们快完成了!

6.4K31

5个技巧让你更好的编写 JavaScript(ES6) 条件语句

JavaScript 代码: function test(fruit) { // 条件提取数组 const redFruits = ['apple', 'strawberry', 'cherry...', 'cranberries']; if (redFruits.includes(fruit)) { console.log('red'); }} 我们将红色水果(条件)提取到一个数组。...注:如果你还不了解 ES6 函数默认参数的新特性,可以查看 JavaScript 函数默认参数 了解更多详情。 如果我们的 fruit 是一个 Object 对象怎么办?我们可以指定默认参数吗?...(无法解析’undefined’或’null’的属性名称)。因为 undefined 没有 name 属性。...不要局限于此。就个人而言,我尽可能使用对象字面量,但我不会设置硬规则来阻止使用 switch ,是否使用应该根据你的场景而决定。

1.2K20

前端MVC Vue2学习总结(六)——axios与跨域HTTP请求、Lodash工具库

https://github.com/axios/axios 服务器端跨域支持请查看:http://www.cnblogs.com/best/p/6196202.html#_label2 1.1、特点 浏览器创建...顺序是lib / defaults.js的库默认值,然后是实例的defaults属性,最后是请求的config参数。 后者将优先于前者。 这里有一个例子。...在上面的代码,开发者可以使用数组、字符串以及函数的方式筛选对象属性,并且最终会返回一个新的对象,中间执行筛选时不会对旧对象产生影响。...var objB = _.pick(objA, ['car', 'age']); // {"car": "suzuki", "age": 17} _.pick 是 _.omit 的相反操作,用于其他对象挑选属性生成新的对象...参数3): 迭代器this所绑定的对象.  返回值(Array): 映射后的新数组.

5.7K100

深入理解 JavaScript Prototype 污染攻击

比如上图中的foo对象,其天生就具有foo.show()方法。 我们可以通过Foo.prototype来访问Foo类的原型,但Foo实例化出来的对象,是不能通过prototype访问原型的。...一个Foo类实例化出来的foo对象,可以通过foo.__proto__属性来访问Foo类的原型,也就是说: foo....后来,我们又用Object类创建了一个zoo对象let zoo = {},zoo对象自然也有一个bar属性了。...其实找找能够控制数组对象)的“键名”的操作即可: 对象merge 对象clone(其实内核就是将待操作的对象merge到一个空对象) 以对象merge为例,我们想象一个简单的merge函数: function...而这里的lodash.merge操作实际上就存在原型链污染漏洞。 在污染原型链后,我们相当于可以给Object对象插入任意属性,这个插入的属性反应在最后的lodash.template

19620

菜菜零学习WCF十(序列化)

注意,当序列化或反序列化数组时,每个数组项都计为一个单独的对象 5.往返行程   在一次操作对象进行反序列化和重新序列化时将发生往返行程。...因此,往返行程是XML到对象实例,然后再返回到XML流。   ...在此默认模式,对于一个往返行程,可以将数据数据协定的较新版本发送到较旧版本然后再返回到较新版本而不会出现任何损失,前提是数据协定实现IExtensibleDataObject接口。...对象图保留此方法具有以下可能不需要的特征:   性能。复制数据的效率低。   循环引用。如果对象引用自身,甚至通过其他对象引用自身,则通过复制进行序列化会导致无限循环。...NET Framework类库包含的许多类型都属于此类别。

1.1K30

ECMAScript 2021新特性,1行代码搞定深拷贝

它使用属性名称和值,并将它们逐一分配给一个新创建的空对象。因此,产生的对象在结构上是相同的,但有它自己的属性和值列表的副本。值也被复制了,但所谓的原始值与非原始值的处理方式不同。...深度拷贝算法也是一个一个地拷贝一个对象属性,但是当它找到另一个对象的引用时,会递归地调用自己,同时也创建一个该对象的拷贝。...这对于确保两段代码不会意外地共享一个对象并在不知情的情况下操纵对方的状态非常重要。 过去,在JavaScript没有简单或好的方法来创建一个深度拷贝的值。...同样地,通过postMessage()向WebWorker发送消息需要将JS值从一个JS领域转移到另一个领域。用于此的算法被称为 "结构化克隆",直到不久之前,开发者还不容易直接使用。...结论 如果你需要在JS创建一个深度拷贝的值——可能是因为你使用了不可变的数据结构,或者你想确保一个函数可以在不影响原始对象的情况下操作一个对象——你不再需要去寻找黑魔法或第三方库。

2.4K41

浅析CTF的Node.js原型链污染

偏官方一点的解释如下 在JavaScript,每个对象都有一个原型,它是一个指向另一个对象的引用。...攻击者可以利用这个特性,通过修改一个对象的原型链,来污染程序的行为。例如,攻击者可以在一个对象的原型链上设置一个恶意的属性或方法,当程序在后续的执行访问该属性或方法时,就会执行攻击者的恶意代码。...简单来说,__proto__ 属性是指向该对象的原型,而 prototype属性是用于创建对象的构造函数的原型。...、在b对象寻找number属性 2、当在b对象没有找到时,它会在b....__proto__也是Object.prototype,所以此时它调用的number就是我们刚刚污染的属性,所以这也就是为什么c .number=520 它常见于当存在函数(其功能是将一个数组的内容复制到另一个数组

1.8K60
领券