1.什么是原型链污染
原型链污染是JavaScript中的一种安全漏洞,它利用了JavaScript的原型继承机制。在JavaScript中,对象通过原型链继承属性和方法。如果攻击者能够修改对象的原型,那么所有从该原型继承的对象都可能受到影响,这就是原型链污染。
2.原型链污染的原理
在JavaScript中,每个对象都有一个名为__proto__的属性,它指向该对象的原型。原型对象本身也可能有原型,形成一个原型链。当访问对象的属性或方法时,如果该对象本身没有该属性或方法,JavaScript引擎会沿着原型链向上查找,直到找到为止。如果在原型链上插入恶意代码,那么所有通过这个原型链查找属性或方法的对象都可能执行这些恶意代码。
在原型链污染中离不开__proto__
和prototype
__proto__和prototype
在JavaScript
中,每个对象都有一个名为__proto__
的内置属性,它指向该对象的原型。同时,每个函数也都有一个名为 prototype
的属性,它是一个对象,包含构造函数的原型对象应该具有的属性和方法。简单来说,__proto__
属性是指向该对象的原型,而 prototype
属性是用于创建该对象的构造函数的原型。
1、prototype是一个类的属性,所有类对象在实例化的时候将会拥有prototype中的属性和方法
2、一个对象的__proto__属性,指向这个对象所在的类的prototype属性
关系图如下所示
3.原型链污染的实施
举一个例子
var a = {number : 520} var b = {number : 1314} b.__proto__.number=520 var c= {} c.number
在这个例子中先创建了两个对象:a和b,并对这两个对象的键number进行赋值。
然后通过实例对象b,利用__proto__对原型进行修改,将键赋值为520。(这个修改并不会影响a和b的键的值)
我们在创建一个新的对象c,但并不对c进行初始化。但在查询c.number的值时,我们能得到.number=520
原因:
1、在b对象中寻找number属性 2、当在b对象中没有找到时,它会在b.__proto__中寻找number属性 3、如果仍未找到,此时会去b.__proto__.__proto__中寻找number属性
因此在查询b.number时,在对象b中直接找到了number属性,得到了b.number=1314
而后在查询c.number时,由于对象c中没有number属性,会再次进入c.__proto__中寻找number属性。而b.__proto__和c.__proto__是一样的,都是实例原型,因此c.__proto__=520
实战
攻防世界-wife_wife
参考文章:浅析CTF中的Node.js原型链污染 - FreeBuf网络安全行业门户
标签:__,proto,对象,number,污染,原型,属性 From: https://www.cnblogs.com/bwcen/p/18568478