admin 发表于 5 天前

原型污染——JavaScript的隐形杀手

原型污染——JavaScript的隐形杀手摘要:原型污染(Prototype Pollution)是指攻击者修改JavaScript对象的内建原型(如Object.prototype),从而影响所有继承自该原型的对象,导致应用程序行为异常、XSS或RCE。这类漏洞常见于接受用户输入并递归合并对象的函数(如merge、clone)。本文讲解原型污染的传播方式及防御:冻结原型、避免危险递归合并。关键词:黑客网站攻击;原型污染;渗透测试;JavaScript安全;对象注入一、引言在JavaScript中,如果允许用户通过键值修改__proto__、constructor.prototype等属性,就能改变所有对象的默认行为。许多开源库(如lodash.merge)曾存在原型污染漏洞,导致大量Web应用被黑客攻击。此漏洞可引发DoS、属性覆盖甚至代码执行。二、原型污染原理2.1 基础知识每个对象有一个隐藏的[],可通过__proto__访问(现代标准推荐Object.getPrototypeOf)。修改{}.__proto__.toString = () => 'hacked'会影响所有对象。2.2 污染入口典型危险代码: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不受原型污染影响。
五、检测方法
[*]构造{"__proto__":{"test":"polluted"}} 发送到接受JSON的API,之后检查{}是否有test属性。
[*]使用自动化工具如ppmap。
六、总结原型污染漏洞深埋在JavaScript对象的灵活性中。防御关键是永远不要递归合并用户控制的键到已有对象,并过滤特殊属性名。
页: [1]
查看完整版本: 原型污染——JavaScript的隐形杀手