当前位置: 首页 > news >正文

原型链污染

原型链污染(Prototype Pollution)是一种针对 JavaScript 应用的安全漏洞,攻击者通过操纵对象的原型链,向基础对象(如 Object.prototype)注入恶意属性,从而影响整个应用程序的行为。以下是详细解析:


核心原理

  1. JavaScript 原型链机制

    • 每个对象都有隐式原型 __proto__(或通过 Object.getPrototypeOf() 访问),指向其构造函数的原型对象。
    • 访问对象属性时,若自身不存在,会沿原型链向上查找(直到 Object.prototype)。
    • 修改原型对象的属性会影响所有继承该原型的对象。
  2. 污染触发条件

    • 当应用递归合并用户输入的 JSON 数据(如 Object.assign() 或自定义 merge 函数)。
    • 通过路径赋值动态设置属性(如 obj[a][b] = value)。
    • 攻击者构造包含 __proto__constructor/prototype 的恶意 payload。

攻击示例

场景1:递归合并对象
function merge(target, source) {for (const key in source) {if (typeof source[key] === 'object') {if (!target[key]) target[key] = {};merge(target[key], source[key]); // 递归合并} else {target[key] = source[key]; // 直接赋值}}
}const userInput = JSON.parse('{"__proto__": {"isAdmin": true}}');
merge({}, userInput); // 污染 Object.prototype// 验证
const obj = {};
console.log(obj.isAdmin); // true!所有对象继承恶意属性
场景2:路径赋值
function setValue(obj, path, value) {const keys = path.split('.');let current = obj;for (let i = 0; i < keys.length - 1; i++) {if (!current[keys[i]]) current[keys[i]] = {};current = current[keys[i]];}current[keys[keys.length - 1]] = value;
}// 攻击者输入路径 "__proto__.isAdmin" 和值 true
setValue({}, "__proto__.isAdmin", true);// 验证
console.log(({}).isAdmin); // true

危害

  1. 权限提升:添加 isAdmin: true 属性绕过身份检查。
  2. 拒绝服务(DoS):覆盖 toString() 等方法导致应用崩溃。
  3. 远程代码执行(RCE):结合其他漏洞(如模板注入)执行任意代码。
    // 若应用使用 eval 或类似功能
    Object.prototype.shell = "require('child_process').exec('rm -rf /')";
    

防御措施

  1. 避免原型属性操作
    • 使用 Object.create(null) 创建无原型的对象。
    • 检查属性名是否为 __proto__constructorprototype
      if (key.includes("__proto__") || key.includes("constructor")) return;
      
  2. 安全合并对象
    • 使用 Object.assign()(浅拷贝,不递归)替代自定义 merge。
    • 使用三方库如 lodash.merge(其新版已修复污染问题)。
  3. 冻结原型
    Object.freeze(Object.prototype); // 禁止修改原型
    
  4. 使用 Map 替代 ObjectMap 不受原型链影响。
  5. 输入过滤
    • 对用户输入的 JSON 数据过滤敏感键名。
    • 使用 JSON.parse() 替代 eval()

真实案例

  • Lodash(CVE-2018-3721):旧版 _.defaultsDeep 存在污染漏洞。
  • jQuery(CVE-2019-11358)$.extend(true, {}, payload) 可被利用。
  • Mongoose:未验证查询参数导致污染。

检测工具

  • Scanner:pp-finder
  • Chrome DevTools:检查 Object.prototype 是否有异常属性。

总结:原型链污染源于 JavaScript 的动态原型机制,通过严格控制对象操作、避免递归处理用户数据、冻结原型或使用无原型对象,可有效防御此漏洞。

http://www.xdnf.cn/news/1165555.html

相关文章:

  • uniapp请求封装上传
  • uniapp app打包流程
  • 【Python办公】Excel工作表拆分工具(按照sheet进行拆分-calamine-极速版)
  • NIO技术原理以及应用(AI)
  • Kotlin介绍
  • 重构创作边界:川翔云电脑 - UE5云端超算引擎​
  • Kafka——揭开神秘的“位移主题”面纱
  • Springboot+vue个人健康管理系统的设计与实现
  • 【电影剖析】千钧一发
  • ISPDiffuser文章翻译理解
  • 深入解析MIPI C-PHY (二)C-PHY三线魔术:如何用6种“符号舞步”榨干每一滴带宽?
  • uni-api交互反馈组件(showToast)的用法
  • SmartETL循环流程的设计与应用
  • 《Linux 环境下 Nginx 多站点综合实践:域名解析、访问控制与 HTTPS 加密部署》​
  • 【金仓数据库产品体验官】_KingbaseES(SQLServer兼容版)保姆级安装教程
  • AC身份认证实验之AAA服务器
  • Linux中ELF区域与文件偏移量的关系
  • 【牛客算法】小美的排列询问
  • DL00691-基于深度学习的轴承表面缺陷目标检测含源码python
  • Python可迭代归约函数深度解析:从all到sorted的进阶指南
  • scratch音乐会开幕倒计时 2025年6月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析
  • docker 软件bug 误导他人 笔记
  • Linux网络信息(含ssh服务和rsync)
  • 微信二维码扫描登录流程详解
  • 网络编程之 UDP:用户数据报协议详解与实战
  • 嵌入式八股文之 struct 和 union 的区别、大厂真题1、头文件中的#ifdef/#define/#endif作用是什么?
  • React探索高性能Tree树组件实现——react-window、react-vtree
  • Kafka 如何优雅实现 Varint 和 ZigZag 编码
  • AXI接口学习
  • 在github上搭建自己主页