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

JavaScript原型链污染是什么意思,有什么影响?

发布时间:2023-05-18 14:21:33 所属栏目:安全 来源:
导读: 这篇文章我们来了解一下JavaScript原型链污染攻击,对于JavaScript原型链污染有一些朋友不清楚是什么,对此本文就给大家来介绍一下,感兴趣的朋友接下来就跟随小编来了解看看吧!

在讲这个漏洞之前我们来
    这篇文章我们来了解一下JavaScript原型链污染攻击,对于JavaScript原型链污染有一些朋友不清楚是什么,对此本文就给大家来介绍一下,感兴趣的朋友接下来就跟随小编来了解看看吧!

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

    什么是原型语言

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

    2.“原型对象”是核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性。

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

    关于Function.prototype和Object.__proto__

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

    2.对象由函数生成;

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

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

    什么是JavaScript原型链污染

    原型链污染来自一个CVE,这个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的,不过这个蓝色组件看上去好像有点年久失修而且没啥人用,看了源代码其中就有这样的一句话

    可以看到类似的写法都是存在问题的(主要是我没找到具体的基于xtend的影响应用)。所以基于这个,大家是不是有了刷CVE的思路了?没错…只要你敢花时间去爬全部的dependence就可以有机会获得javascript pollution attack CVE。

    案例一远程命令执行

    作者在github上搜到了一款叫做ghost cms的应用,当然这个漏洞已经修复,当无意识黑客发送以下任何请求即可实现无意识的控制任意对象的方法或者控制的对象的操作系统的任意属性。当然也就是rce了

    在一切皆对象的JavaScript中,所有对象都可以调用toString和valueOf方法,当你通过__proto__重写这2个方法的时候,就容易在express等web框架中产生dos,导致服务无法正常运行。类似以下的写法就容易产生拒绝服务。

    案例二DOS

    在一切皆对象的JavaScript中,所有对象都可以调用toString和valueOf方法,当你通过__proto__重写这2个方法的时候,就容易在express等web框架中产生dos,导致服务无法正常运行。类似以下的写法就容易产生拒绝服务
 

(编辑:汽车网)

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

    推荐文章