Spletni žetoni JSON (JWT) so postali prevladujoči mehanizem sej in overitve v sodobnih spletnih aplikacijah, API-jih in mikrostoritvenih arhitekturah. JWT je kompakten format žetona, varen za URL, ki kodira trditve kot objekt JSON in jih po potrebi podpiše ali šifrira. Kljub njihovi vseprisotnosti so JWT-ji pogosto napačno konfigurirani, posledice pa segajo od obvoda overitve do popolnega prevzema računa. Kot penetracijski tester naletim na ranljivosti JWT na skoraj vsakem angažmaju, ki vključuje overitev na osnovi API.
Preverjanje algoritmov, izdajatelja in predvidenega prejemnika žetona obravnava RFC 8725: JSON Web Token Best Current Practices.
Zmeda algoritmov
Zmeda algoritmov je najkritičnejši razred ranljivosti JWT. Izkorišča dejstvo, da strežnik prebere algoritem podpisovanja iz glave žetona, namesto da bi uveljavil fiksen algoritem. Algoritem "none" omogoča napadalcu ponarejanje katerega koli žetona s preprostim odstranjevanjem podpisa. Preklop RS256 na HS256 omogoča napadalcu podpisovanje žetona z javnim ključem strežnika kot skrivnostjo HMAC, ker je javni ključ pogosto javno dostopen.
Šibke skrivnosti
Ko so JWT-ji podpisani z algoritmi HMAC (HS256, HS384, HS512), je varnost v celoti odvisna od kriptografske moči skupne skrivnosti. Šibke ali pogoste skrivnosti je mogoče razbiti brez povezave z orodjem hashcat (način 16500) ali John the Ripper z jwt2john.py. Začnite s pogostimi gesli (rockyou.txt), nato poskusite specifične izraze za aplikacijo in privzete skrivnosti iz ogrodij. Ko je skrivnost obnovljena, lahko napadalec ponaredi žetone za katerega koli uporabnika.
Vbrizgavanje ključev
Več parametrov glave JWT omogoča žetonu, da določi, od kod naj se pridobi verifikacijski ključ. Glava jku kaže na URL, ki gosti nabor spletnih ključev JSON. Glava jwk vgradi verifikacijski ključ neposredno v žeton. Glavi x5u in x5c uporabljata certifikate X.509. Če strežnik ne validira teh glav glede na beli seznam, lahko napadalec gosti svoje ključe in podpiše žetone z njimi. Parameter kid (ID ključa) je prav tako ranljiv za prečkanje imenikov (../../../dev/null), SQL-vrivanje in vbrizgavanje ukazov.
Manipulacija trditev
- Sprememba subjekta (sub) - Spreminjanje trditve sub na identifikator drugega uporabnika za poosebljanje.
- Eskalacija vlog in privilegijev - Spreminjanje trditev, kot so role, admin, is_admin ali permissions, za eskalacijo iz navadnega uporabnika v skrbnika.
- Manipulacija poteka - Nastavitev exp na časovni žig daleč v prihodnosti ali njegova popolna odstranitev.
- Predvideni prejemnik in izdajatelj - Spreminjanje trditev aud ali iss za uporabo žetonov med različnimi storitvami ali okolji.
Življenjska doba žetonov in premisleki o JWE
Tudi pravilno podpisani JWT-ji lahko ustvarijo varnostne težave prek slabega upravljanja življenjskega cikla. Dostopni žetoni s pretirano dolgo življenjsko dobo razširijo okno za zlorabo ukradenih žetonov. Osvežitveni žetoni, ki nikoli ne potečejo ali se ne rotirajo ob uporabi, omogočajo trajni dostop po spremembi poverilnic. Večina implementacij JWT uporablja JWS (podpis), ki zagotavlja celovitost, ne pa zaupnosti. JWE (šifriranje) zagotavlja zaupnost, vendar uvaja lastno napadalno površino.
Metodologija testiranja po korakih
- Zajem in dekodiranje - Prestregnite žetone JWT iz odgovorov overitve, piškotkov ali glav Authorization.
- Test algoritma "none" - Spremenite glavo na alg:none in odstranite podpis.
- Test preklopa algoritma - Če strežnik uporablja RS256, pridobite javni ključ in testirajte preklop na HS256.
- Razbijanje šibkih skrivnosti - Za žetone HMAC zaženite hashcat -m 16500 proti pogostim seznamom besed.
- Test vbrizgavanja ključev - Spremenite glave jku, jwk, x5u in x5c, da kažejo na ključe pod nadzorom napadalca.
- Test vbrizgavanja kid - Poskusite prečkanje imenikov, SQL-vrivanje in vbrizgavanje ukazov v parametru kid.
- Manipulacija trditev - Spremenite trditve sub, role, admin in exp ter ponovno oddajte z veljavnim podpisom.
- Test življenjskega cikla žetonov - Preverite, da žetoni postanejo neveljavni po odjavi in spremembi gesla.
Orodja
- jwt_tool - Najobsežnejše orodje za testiranje JWT z zmedo algoritmov, vbrizgavanjem ključev in manipulacijo trditev.
- jwt.io - Spletni dekoder in razhroščevalnik JWT za hitro pregledovanje in ročno urejanje trditev.
- hashcat - Način 16500 za razbijanje skrivnosti HMAC JWT, pospešeno z GPU.
- John the Ripper - Z jwt2john.py za pretvorbo žetonov JWT v format za razbijanje.
- Razširitve Burp Suite za JWT - JSON Web Tokens in JWT Editor za manipulacijo žetonov v proxyju.
Odprava
Pripnite algoritem podpisovanja na strani strežnika -- nikoli ga ne berite iz glave žetona. Uporabite močne skrivnosti za HMAC z vsaj 256 biti entropije. Za asimetrične algoritme uporabite RSA 2048+ ali ECDSA P-256. Ignorirajte glave jku, jwk, x5u, x5c in kid, razen če so nujno potrebne. Nastavite kratke življenjske dobe dostopnih žetonov (5-15 minut) in implementirajte ustrezno rotacijo osvežitvenih žetonov. Validirajte vse trditve ob vsaki zahtevi. Varno shranjujte podpisne ključe z uporabo HSM-ov ali storitev za upravljanje ključev.
Sorodno branje: Ranljivosti OAuth: Ko overitev gre narobe in Testiranje varnosti API: Praktični vodic.
Zanima vas več o tej temi? Preberite mojo strokovno stran o Web Application Security →
Komentarji
Ni še komentarjev. Bodite prvi!
Dodaj komentar