第一部分:原型链污染成因与原理
1. 原型链污染成因
在 JavaScript 中,对象是通过原型链(Prototype Chain)来实现继承的。每个对象都有一个内部属性 [[Prototype]]
,指向它的原型对象。当我们访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或到达原型链的顶端(null
)。
原型链污染(Prototype Pollution)是一种安全漏洞,攻击者通过操纵对象的原型链,使得某些对象继承了恶意属性或方法,从而导致意外的行为或安全漏洞。
2. 原型链污染原理
原型链污染通常发生在以下场景中:
-
对象合并:当两个对象合并时,如果其中一个对象的属性是
__proto__
或其他原型属性,合并操作可能会意外地修改原型链。 -
属性赋值:当对象的属性被动态赋值时,如果属性名是
__proto__
或其他原型属性,赋值操作可能会修改原型链。
示例代码
function merge(target, source) {
for (let key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key];
}
}
}
let obj1 = {};
let obj2 = JSON.parse('{"__proto__":{"isAdmin":true}}');
merge(obj1, obj2);
console.log(obj1.isAdmin); // 结果为true
console.log({}.isAdmin); // 结果为true
在这个例子中,obj2
的 __proto__
属性被赋值为 { isAdmin: true }
,导致所有对象的原型链都被污染,isAdmin
属性被添加到所有对象的原型中。
第二部分:CTF 中的题目示例
1. 题目描述
此处例题为网络与信息安全竞赛初赛中简单难度的原型链污染题目easyjs
题目如图所示
此处只作为演示,不提供具体过程
通过本文的介绍,我们了解了 Node.js 中原型链污染的成因、原理以及如何在 CTF 题目中利用这一漏洞。希望本文能帮助你更好地理解原型链污染,并在实际开发中避免类似的安全问题。