最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何识别 原型污染Prototype Pollution 安全漏洞及其防御措施
时间:2026-06-04 10:12:27 编辑:袖梨 来源:一聚教程网
原型污染漏洞源于JavaScript原型继承机制被恶意篡改,攻击者通过不安全的对象合并、深拷贝或动态赋值将__proto__等敏感键注入Object.prototype,影响所有对象行为;典型场景包括lodash.merge处理用户输入、手动递归赋值未过滤敏感键、JSON.parse后直接合并及动态路径赋值。
识别原型污染漏洞,关键在于发现代码中是否允许用户输入直接影响对象原型链。它不依赖复杂利用链,往往一个合并操作、一次反序列化或一段动态赋值就可能触发。
哪些代码行为容易暴露原型污染风险
以下几类操作是典型高危入口,需逐行审查:
- 使用
_.merge、_.set、_.defaultsDeep(lodash ≤4.17.20)等函数处理用户提交的 JSON、查询参数或表单数据 - 手动实现递归赋值逻辑,例如
for (let key in source) target[key] = source[key],且未过滤__proto__、constructor、prototype - 对
JSON.parse()结果不做清洗,直接合并进配置对象或路由参数容器 - 用点号或方括号动态设置属性,如
obj[path] = value,其中path来自 URL 或请求体(例如"a.__proto__.b")
快速验证是否存在污染(本地检测方法)
在开发或测试环境运行以下检查,能直观确认系统是否已受污染:
- 执行
JSON.parse('{"__proto__":{"polluted":true}}'),再检查({ }).polluted === true是否成立 - 尝试
JSON.parse('{"constructor":{"prototype":{"xss":1}}}'),随后验证({}).xss === 1 - 若返回
true,说明原型已被写入,当前环境存在可利用漏洞
防御措施要落在具体动作上
防护不是加一层“安全中间件”,而是贯穿输入解析、对象操作、运行时环境三个环节:
-
输入层强制清洗:所有外部数据进入业务逻辑前,递归遍历并删除含
__proto__、constructor、prototype的键路径,正则推荐/b(__proto__|constructor|prototype)b/i -
对象创建改用安全基底:需要纯键值容器时(如缓存、参数映射),统一用
Object.create(null)替代{},避免继承污染源头 -
合并/拷贝操作降级或加固:优先用
Object.assign({}, input)(浅拷贝);必须深拷贝时,选用structuredClone()(现代环境)或自研函数跳过敏感键 -
依赖版本锁定:lodash 必须 ≥4.17.21;deepmerge 确认启用默认防护;禁用
--disable-proto=delete类 Node.js 启动参数
上线后仍需持续监控
防御不能止于代码修复,真实攻击常绕过静态检查:
- 在日志中对所有
JSON.parse、req.body、fs.readFileSync入口添加字段扫描,命中敏感键立即告警 - 预发环境定期注入 payload(如
{"__proto__":{"isAdmin":true}}),验证是否被静默接受 - ESLint 集成
eslint-plugin-security,标记_.merge、JSON.parse后无清洗的调用位置
相关文章
- OpenAI Compatible 怎么配置?安装、接入和常见问题 06-10
- OpenAI alethea 是什么?源码、功能和适用场景说明 06-10
- 2026中国电竞产业发展现状 - 电竞行业趋势与市场分析 06-10
- 天谕手游雷渊禁地冒险任务攻略 06-10
- Claude Cursor 怎么配置?安装、接入和常见问题 06-10
- OpenAI azure 怎么配置?安装、接入和常见问题 06-10