Přeskočit na hlavní obsah

Selhání autentizace

  • Vhodně zabezpečené musí být nejen přihlašovací endpointy, ale i endpointy pro reset / zapomenuté heslo, nastavení 2FA a další.
  • API je zranitelné, pokud
    • umožňuje brute forcovat hesla a uživatelská jména (credential stuffing),
    • umožňuje brute force bez existence mechanismu CAPTCHA nebo zablokování účtu,
    • umožňuje zadání slabých hesel,
    • odesílá citlivé údaje (tokeny, hesla) v URL,
    • umožňuje změnu e-mailu, hesla a další citlivé operace bez nutnosti zadání hesla pro potvrzení operace,
    • nevaliduje nebo neověřuje token,
    • akceptuje nepodepsané nebo slabé JWT tokeny (např. { "alg": "none" }),
    • nevaliduje expiraci tokenu,
    • ukládá hesla v plaintextu nebo za použití slabého hashovacího algoritmu (např. MD5),
    • používá slabé šifrovací klíče.
  • Microservices jsou zranitelné, pokud
    • je možné k microservice přistupovat bez nutnosti autentizace (i v případě komunikace microservice - microservice),
    • používá slabé nebo předvídatelné autentizační tokeny.

Jak zranitelnosti předcházet

🔴 Ověřte, že všechny potřebné endpointy podléhají autentizaci (mobilní, webové, přímé odkazy…).

🔴 Naučte se vše o autentizačním mechanismu, který používáte - musíte rozumět jeho silným a slabým stránkám (OAuth ani API klíč není autentizace).

🔴 Používejte standardní řešení, které je ověřené praxí - nevytvářejte vlastní mechanismy, tokeny atd.

🔴 Implementujte mechanismus rate limitingu, zablokování účtu a brute force ochranu.

🔴 Vyžadujte znovu-přihlášení / potvrzení heslem při vykonávání citlivých operací.

🔴 Implementujte vícefaktorové ověření (MFA / 2FA).

🔴 Nepoužívejte API klíče pro uživatelské přihlašování.

Příklady zneužití zranitelnosti

  1. Aby se mohl uživatel přihlásit, musí odeslat následující API požadavek:

    POST /graphql
    {
    "query": "mutation {
    login (username:\"<username>\",password:\"<password>\") {
    token
    }
    }"
    }
    • Pokud jsou credentials validní, vrátí se token, kterým se bude uživatel autorizovat.
    • API umožňuje pouze 3 pokusy o přihlášení za minutu.
    • Útočník si použije GraphQL batching, aby tuto restrikci obešel:
    POST /graphql
    [
    {"query": "mutation{login(username:\"victim\",password:\"password\"){token}}"},
    {"query": "mutation{login(username:\"victim\",password:\"123456\"){token}}"},
    {"query": "mutation{login(username:\"victim\",password:\"qwerty\"){token}}"},
    ...
    {"query": "mutation{login(username:\"victim\",password:\"123\"){token}}"},
    ]
  2. K editaci uživatelského emailu je vyžadován následující API požadavek:

    PUT /accounts
    Authorization: Bearer <token>

    { "email": "<new_email_address>" }
    • Protože funkce nevyžaduje ověření uživatelské identity (zadání hesla), může útočník použít token jiného uživatele.
    • To se může povést například resetováním uživatelského hesla.

Kam dál

Cheat sheety

Checklisty