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
-
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}}"},
] -
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
- Autentizace
- Vícefaktorové ověření (MFA)
- Předcházení credential stuffing
- Implementace digitální identity
- Ukládání hesel
- Zapomenuté heslo