|
原型污染——JavaScript的隐形杀手 摘要:原型污染(Prototype Pollution)是指攻击者修改JavaScript对象的内建原型(如Object.prototype),从而影响所有继承自该原型的对象,导致应用程序行为异常、XSS或RCE。这类漏洞常见于接受用户输入并递归合并对象的函数(如merge、clone)。本文讲解原型污染的传播方式及防御:冻结原型、避免危险递归合并。 关键词:黑客网站攻击;原型污染;渗透测试;JavaScript安全;对象注入 一、引言在JavaScript中,如果允许用户通过键值修改__proto__、constructor.prototype等属性,就能改变所有对象的默认行为。许多开源库(如lodash.merge)曾存在原型污染漏洞,导致大量Web应用被黑客攻击。此漏洞可引发DoS、属性覆盖甚至代码执行。 二、原型污染原理2.1 基础知识每个对象有一个隐藏的[[Prototype]],可通过__proto__访问(现代标准推荐Object.getPrototypeOf)。修改{}.__proto__.toString = () => 'hacked'会影响所有对象。 2.2 污染入口典型危险代码: [size=12.573px]javascript
function merge(target, source) { for (let key in source) { target[key = source[key; } return target;}
如果攻击者提交{"__proto__": {"isAdmin": true}},经过递归合并后,所有新建对象的isAdmin属性都将被设为true。 三、渗透测试中的利用属性覆盖:污染constructor.prototype.isAdmin = true绕过权限检查。 XSS:污染某个HTML元素的属性,如innerHTML或src。 DoS:污染toString为死循环。 RCE(极罕见):配合electron、vm2等沙箱逃逸。
四、防御措施冻结原型:Object.freeze(Object.prototype) 防止修改。 避免使用__proto__:检查用户输入的key,拒绝__proto__、constructor、prototype。 使用无原型对象:Object.create(null) 创建的对象没有原型。 升级库:修复已知原型污染漏洞(如lodash 4.17.12+)。 使用Map代替普通对象存储键值对,Map不受原型污染影响。
五、检测方法六、总结原型污染漏洞深埋在JavaScript对象的灵活性中。防御关键是永远不要递归合并用户控制的键到已有对象,并过滤特殊属性名。
|