API-ji so postali primarna napadalna površina večine aplikacij. In večina razvijalcev objavi popolno dokumentacijo o tem, kako jih napasti. Swagger/OpenAPI specifikacije, debug endpointi, starejše verzije API-ja - vse to je zemljevid za napadalce.
OWASP API Security Top 10
Razumevanje najpogostejših API ranljivosti:
API1: Broken Object Level Authorization (BOLA)
Najpogostejša kritična API ranljivost. API ne preverja, ali ima uporabnik pravico dostopa do zahtevanega objekta.
- Primer: GET /api/users/123/orders - sprememba 123 v 124 razkrije naročila drugega uporabnika
- Variacije: GUID-i namesto ID-jev niso rešitev - pogosto so predvidljivi ali izpuščeni drugje
- Testiranje: Sistematično spreminjanje vseh identifikatorjev v zahtevah
API2: Broken Authentication
Napačna implementacija avtentikacijskih mehanizmov.
- JWT brez validacije podpisa - Strežnik sprejme katerikoli token
- Algorithm confusion - Sprememba RS256 v HS256, podpis s public key
- Weak secrets - JWT podpisan s šibkim ključem, razbijemo offline
- Token leakage - Tokeni v URL-jih, logih, error sporočilih
API3: Broken Object Property Level Authorization
API razkrije več lastnosti objekta kot bi moral, ali dovoli spreminjanje zaščitenih lastnosti.
- Excessive data exposure: API vrne vse atribute, vključno s sensitive (password hash, internal IDs)
- Mass assignment: Dodajanje dodatnih polj v zahtevo (role: "admin", balance: 99999)
API4: Unrestricted Resource Consumption
Pomanjkanje omejitev porabe resursov.
- No rate limiting: Omogoča brute force, credential stuffing, DoS
- Unbounded queries: SELECT * brez LIMIT, GraphQL brez depth limitov
- Large file uploads: Izčrpanje diska ali pomnilnika
API5: Broken Function Level Authorization
Administratorske funkcije dostopne navadnim uporabnikom.
- Skriti admin endpointi: /api/admin/users, /api/internal/config
- HTTP method tampering: GET deluje, POST/DELETE tudi - brez avtorizacije
- Parameter manipulation: Dodajanje admin=true v zahtevo
JWT (JSON Web Token) napadi
JWT je standard za avtentikacijo, a je pogosto napačno implementiran.
Struktura JWT
Header.Payload.Signature - Base64 encoded, ne šifriran!
Napadi
- Algorithm None: Sprememba algorithm v "none", odstranitev signature
- Algorithm Confusion: RS256 → HS256, podpis s public key kot secret
- Key ID Injection: kid parameter za path traversal ali SQL injection
- JWK Injection: Vključitev napadalčevega ključa v jku/jwk header
- Weak Secret Brute Force: hashcat/john za razbijanje HS256 secretov
- Token Expiry: Sprejemanje pretečenih tokenov, predolgi exp
Zaščita
- Whitelist algoritmov - ne sprejemaj "none" ali nepričakovanih
- Močni secrets za HS256 (32+ bajtov naključnih)
- Kratki exp časi, refresh tokeni
- Validacija vseh claims (iss, aud, exp, nbf)
OAuth 2.0 ranljivosti
OAuth je kompleksen protokol z veliko možnostmi za napake.
Authorization Code Flow napadi
- Open Redirect: Manipulacija redirect_uri za krajo authorization code
- CSRF: Pomanjkanje state parametra omogoča account linking napade
- Code Reuse: Authorization code uporaben večkrat
- Scope Upgrade: Zahteva za višje scope kot dovoljeno
Implicit Flow problemi
- Token v URL: Izpostavljenost v Referer headerju, browser history
- Token Leakage: XSS na redirect URI strani ukrade token
- Mix-up Attack: Napadalec podmeni authorization server
Client Credentials napake
- Hardcoded secrets: client_secret v frontend kodi, mobile apps
- Insufficient client validation: Sprejemanje requestov brez client auth
GraphQL specifične ranljivosti
GraphQL prinaša nove napadalne vektorje, ki jih REST nima.
Introspection
Avtomatična dokumentacija celotne sheme - imenski prostor vseh tipov, polj, mutacij.
- Napad: Query __schema za popoln popis API-ja
- Obramba: Onemogočite introspection v produkciji
Query Complexity napadi
- Deep nesting: Rekurzivne poizvedbe (user { friends { friends { friends... }}})
- Batching: Veliko operacij v eni zahtevi
- Aliases: Ista poizvedba večkrat z različnimi aliasi
- Fragments: Fragmenti za povečanje kompleksnosti
Injection
- SQL Injection: V argumentih, ki gredo v bazo
- NoSQL Injection: Posebno pri MongoDB backend-ih
Zaščita GraphQL
- Onemogočite introspection v produkciji
- Implementirajte query depth in complexity limite
- Rate limiting na operacijo, ne samo na endpoint
- Field-level avtorizacija
Odkrivanje skritih API-jev
Ne testiram samo dokumentiranih endpointov.
Tehnike odkrivanja
- Path fuzzing: /api/v1/users, /api/v2/users, /api/internal/users
- Version discovery: Starejše verzije API-ja brez varnostnih popravkov
- Debug endpoints: /debug, /test, /swagger, /api-docs, /graphiql
- JavaScript analiza: API endpointi v frontend kodi
- Mobile app reversing: API klici v mobilni aplikaciji
- Wayback Machine: Stare verzije dokumentacije, razveljavljeni endpointi
Wordlists
- SecLists API wordlists
- Custom wordlists iz dokumentacije, frontend kode
- Inteligentno fuzzing na podlagi najdenih endpointov
Rate Limiting obhod
Rate limiting je pogosto implementiran nepravilno.
Tehnike obhoda
- IP rotation: Različni IP naslovi (proxy, VPN, cloud functions)
- Header manipulation: X-Forwarded-For, X-Real-IP spoofing
- Endpoint variation: /api/login, /api/Login, /api/login/, /api//login
- Parameter pollution: email=a@b.com&email=c@d.com
- Unicode normalization: admin vs ɑdmin
- Case variation: admin@domain.com vs Admin@domain.com
Moj pristop k API testiranju
- Reconnaissance: Zbiranje vse dostopne dokumentacije, swagger specs, postman collections
- Mapping: Vse endpointe, parametre, authentication mehanizme
- Authentication testing: JWT, OAuth, session management
- Authorization testing: BOLA, BFLA na vsakem endpointu
- Input validation: Injection, type confusion, boundary testing
- Business logic: Workflow bypass, race conditions
- Rate limiting: Brute force, enumeration možnosti