加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

JS原型链污染攻击有何影响,如何阻止

发布时间:2023-06-02 08:47:57 所属栏目:安全 来源:
导读:在讲这个漏洞之前我们来理解一下Javascript。与其他的语言不同的是,Js在Es6之前是没有class的,他更多的是一个原型语言,在Js里有一句话很有名——“一切皆对象”。

什么是原型语言

1.只
在讲这个漏洞之前我们来理解一下Javascript。与其他的语言不同的是,Js在Es6之前是没有class的,他更多的是一个原型语言,在Js里有一句话很有名——“一切皆对象”。

什么是原型语言

1.只有对象,没有类;对象继承对象,而不是类继承类。

2.“原型对象”是核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以在创建和运行时享有其所定义的属性,而且可以从原型对象那里得到更多和更多的应用功能。

3.每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统。root节点的顶层对象是一个语言原生的对象,只有它没有原生对象,其他所有对象都直接或间接继承它的属性。

关于Function.prototype和Object.__proto__

1.对象有__proto__属性,函数有prototype属性;

2.对象由函数生成;

3.生成对象时,对象的__proto__属性指向函数的prototype属性。

在没有手动修改__proto__属性的指向时,以上三条便是JavaScript默认原型链指向逻辑。

什么是JavaScript原型链污染

原型链污染来自一个CVE(https://github.com/jquery/jquery/pull/4333),这个CVE是一个在jquery中修复的漏洞,但是这个漏洞广义的推广的话,受影响的范围应该是一切使用了ecmascript的应用,无论前后端。关于这个漏洞,是修复了jQuery的$.extend(true…)方法,在jQuery中,这个方法用于将一个或多个对象的内容合并到目标对象。所以你永远不知道有没有人会不会写出一些类似以下的代码

当我们可控$.extend的参数的时候,我们就可以覆盖对象的__proto__或者prototype方法从而控制整个原型链的最顶端的方法,重写该方法将覆盖子对象或者函数的方法,从而导致水蒸气污染超过了原本的方法本身的意图。

在npmjs官方搜下对象操作的库可以看到一大堆,例如“xtend”、 “deepmerge”、 “webpack-merge”、 “merge2”、 “lodash.merge”。假如一些应用使用了这些方法,但是对参数没有做任何处理。

提出这个Javascript原型污染攻击的作者写了一个pdf,在该pdf中,作者不仅做了漏洞的成因分析,还针对此漏洞做了受害范围分析,他在github上搜索了部分的组件,这些组件都是可以操作的对象,一般都是对象合并操作的,较为底层,因此也会有大量的应用基于这些组件。例如“hoek”,“lodash”,“defaults-deep”等修复了这个原型污染的可能性,当然还有一些组件他没统计到,例如“xtend”之类的,光weekly download的数量就有“12,097,425”。

笔者在npm上搜索了基于xtend的一些应用,找到一个language-exec这样的一个组件。这个组件是一个基于xtend的,不过这个组件好像年久失修而且没啥人用,看了源代码其中就有这样的一句话。那么我们可以看到,这个组件的作用就是用来实现一个语言转换的功能,而且还可以通过这个组件来进行一些自定义的操作。

所以基于这个,大家是不是有了刷CVE的思路了?没错…只要你敢花时间去爬全部的dependence就可以有机会获得javascript pollution attack CVE。
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章