欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

JavaScript 原型链污染

来源:本站整理 作者:佚名 时间:2019-04-22 TAG: 我要投稿

0x01 前言
最近看到一篇原型链污染的文章,自己在这里总结一下
 
0x02 javascript 原型链
js在ECS6之前没有类的概念,之前的类都是用funtion来声明的。如下

可以看到b在实例化为test对象以后,就可以输出test类中的属性a了。这是为什么呢?
原因在于js中的一个重要的概念:继承。
而继承的整个过程就称为该类的原型链。
在javascript中,每个对象的都有一个指向他的原型(prototype)的内部链接,这个原型对象又有它自己的原型,直到null为止
function i(){
    this.a = "test1";
    this.b = "test2";}

可以看到其父类为object,且里面还有许多函数,这就解释了为什么许多变量可以调用某些方法。
在javascript中一切皆对象,因为所有的变量,函数,数组,对象 都始于object的原型即object.prototype。同时,在js中只有类才有prototype属性,而对象却没有,对象有的是__proto__和类的prototype对应。且二者是等价的

当我们创建一个类时

原型链为
b -> a.prototype -> object.prototype->null
创建一个数组时

原型链为
c -> array.prototype -> object.prototype->null
创建一个函数时

原型链为
d -> function.prototype -> object.prototype->null
创建一个日期

原型链为
f -> Data.prototype -> object.prototype->null
所以,测试之后会发现:javascript 一切皆对象,一切皆始于 object.prototype
原型链变量的搜索
下面先看一个例子:

我们实例要先于在i中添加属性,但是在j中也有了c属性。这是为什么呢
答:
当要使用或输出一个变量时:首先会在本层中搜索相应的变量,如果不存在的话,就会向上搜索,即在自己的父类中搜索,当父类中也没有时,就会向祖父类搜索,直到指向null,如果此时还没有搜索到,就会返回 undefined
所以上面的过程就很好解释了,原型链为
j -> i.prototype -> object.prototype -> null
所以对象j调用c属性时,本层并没有,所以向上搜索,在上一层找到了我们添加的test3,所以可以输出。
 
prototype 原型链污染
先看一个小例子:
mess.js
----
(function()
{
    var secret = ["aaa","bbb"];
    secret.forEach();
})();
attach.html

结果:

在mess.js中我们声明了一个数组 secret,然后该数组调用了属于 Array.protottype的foreach方法,如下

但是,在调用js文件之前,js代码中将Array.prototype.foreach方法进行了重写,而prototype链为secret -> Array.prototype ->object.prototype,secret中无 foreach 方法,所以就会向上检索,就找到了Array.prototype 而其foreach方法已经被重写过了,所以会执行输出。
这就是原型链污染。很明显,原型链污染就是:在我们想要利用的代码之前的赋值语句如果可控的话,我们进行 ——__proto__ 赋值,之后就可以利用代码了
 
如何应用?
在javascript中可以通过 test.a or test['a'] 对数组的元素进行访问,如下:

同时对对象来说说也是一样的

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.ylxj.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载