Strokovno področje

API varnost in penetracijsko testiranje

Swagger je vaš najhujši sovražnik. API-ji razkrijejo več, kot mislite.

Varnostne preglede API-jev izvaja Vid Grosek, prvi OSCE3 in OSCP+ certificirani penetracijski tester v Sloveniji, prek podjetja Telprom d.o.o. v Ljubljani. 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. Iste napake pri sejah in avtentikaciji obravnavam tudi pri penetracijskem testiranju spletnih aplikacij.

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. Pri obsežnejših angažmajih jih povežem z napadi na Active Directory in Red Team operacijami.

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

  1. Reconnaissance: Zbiranje vse dostopne dokumentacije, swagger specs, postman collections
  2. Mapping: Vse endpointe, parametre, authentication mehanizme
  3. Authentication testing: JWT, OAuth, session management
  4. Authorization testing: BOLA, BFLA na vsakem endpointu
  5. Input validation: Injection, type confusion, boundary testing
  6. Business logic: Workflow bypass, race conditions
  7. Rate limiting: Brute force, enumeration možnosti

Pogosta vprašanja

Zakaj je testiranje varnosti API-jev pomembno?

API-ji neposredno izpostavljajo vašo poslovno logiko. Za razliko od spletnih vmesnikov API-ji pogosto nimajo omejitev hitrosti, pravilnih avtorizacijskih preverjanj in validacije vhodov. Pogoste težave vključujejo BOLA/IDOR, pokvarjeno avtentikacijo, JWT ranljivosti in masovno izpostavljenost podatkov.

Kaj je BOLA/IDOR in zakaj je to #1 API ranljivost?

BOLA (Broken Object Level Authorization) ali IDOR pomeni, da API omogoča dostop do virov drugih uporabnikov s preprosto spremembo ID parametra. To je #1 API ranljivost, ker je izjemno pogosta, enostavna za izkoriščanje in pogosto izpostavi občutljive podatke v velikem obsegu.

Kaj je JWT algorithm confusion napad?

Algorithm confusion je napad, pri katerem napadalec spremeni algoritem podpisa JWT iz RS256 v HS256 in podpiše token z javnim ključem strežnika kot skrivnostjo, kar omogoči ponarejanje veljavnih tokenov. Zaščita je whitelist dovoljenih algoritmov in stroga validacija glave tokena.

Kako onemogočim GraphQL introspection?

GraphQL introspection razkrije celotno shemo API-ja - vse tipe, polja in mutacije - zato jo je treba v produkciji onemogočiti v konfiguraciji GraphQL strežnika, hkrati pa uvesti omejitve globine in kompleksnosti poizvedb ter avtorizacijo na ravni polj.

Kakšna je razlika med BFLA in BOLA?

BOLA (Broken Object Level Authorization) pomeni dostop do objektov drugih uporabnikov z manipulacijo ID-jev, medtem ko BFLA (Broken Function Level Authorization) pomeni dostop do administratorskih funkcij in endpointov, do katerih navaden uporabnik ne bi smel imeti dostopa.

Potrebujete API varnostni pregled?

Odkrijte ranljivosti v vaših REST, GraphQL in WebSocket API-jih preden jih odkrijejo napadalci.