目录
1.什么是原型链污染
原型链污染(Prototype Pollution)是一种web应用程序中常见的安全漏洞,主要影响使用JavaScript的应用程序。它是一种攻击技术,通过修改JavaScript对象的原型链,来实现对应用程序的非法操作和控制。
JavaScript中的对象是通过原型链进行继承的。每个对象都有一个指向其原型的链接,它允许对象从其原型中继承属性和方法。当JavaScript代码在处理输入时,如果不适当地允许用户控制原型链上的属性,攻击者就可以操纵原型链,并在目标对象上添加、修改或删除属性。
攻击者利用原型链污染可以实现多种攻击,包括但不限于:
- 修改对象的原型,从而覆盖或扩展原有属性和方法,导致应用程序的意外行为或漏洞。
- 污染全局对象的原型,导致全局范围内的异常行为,可能导致系统崩溃或敏感信息泄露。
- 在原型链上添加恶意方法或属性,用于劫持或篡改应用程序的逻辑。
- 绕过应用程序的安全控制,获取未授权的访问权限。
原型链污染漏洞通常是由于开发者未正确验证和过滤用户提供的输入数据所导致的。为了防止原型链污染,开发者应该始终对用户输入进行严格的验证和过滤,并避免直接使用用户提供的数据来操作原型链上的属性。另外,更新JavaScript运行时环境和库到最新版本也可以帮助防范已知的原型链污染漏洞。
在一个应用中,如果攻击者控制并修改了一个对象的原型,那么将可以影响所有和这个对象来自同一个类、父祖类的对象。这种攻击方式就是原型链污染。
2.原型链三属性
1)prototype
prototype
是函数对象特有的属性。在 JavaScript 中,每个函数都有一个prototype
属性,它是一个指向对象的引用。这个对象被称为该函数的原型对象,它包含了可以由该函数的所有实例共享的属性和方法。当通过构造函数创建对象实例时,实例的__proto__
属性会指向构造函数的prototype
对象。
2)constructor
constructor
属性是原型对象的一个属性,它指向构造函数本身。当你创建一个函数并给它设置prototype
属性后,prototype
对象会自动获得一个名为