Spletni zetoni JSON (JWT) so postali prevladujoci mehanizem sej in overitve v sodobnih spletnih aplikacijah, API-jih in mikrostoritvenih arhitekturah. JWT je kompakten format zetona, varen za URL, ki kodira trditve kot objekt JSON in jih opcijsko podpise ali sifrira. Kljub njihovi vseprisotnosti so JWT-ji pogosto napacno konfigurirani, posledice pa segajo od obvoda overitve do popolnega prevzema racuna. Kot penetracijski tester naletim na ranljivosti JWT na skoraj vsakem angazmaju, ki vkljucuje overitev na osnovi API.
Zmeda algoritmov
Zmeda algoritmov je najkriticnejsi razred ranljivosti JWT. Izkorisca dejstvo, da streznik prebere algoritem podpisovanja iz glave zetona, namesto da bi uveljavil fiksen algoritem. Algoritem "none" omogoca napadalcu ponarejanje katerega koli zetona s preprostim odstranjevanjem podpisa. Preklop RS256 na HS256 omogoca napadalcu podpisovanje zetona z javnim kljucem streznika kot skrivnostjo HMAC, ker je javni kljuc pogosto javno dostopen.
Sibke skrivnosti
Ko so JWT-ji podpisani z algoritmi HMAC (HS256, HS384, HS512), je varnost v celoti odvisna od mocnosti skupne skrivnosti. Sibke ali pogoste skrivnosti je mogoce razbiti brez povezave z orodjem hashcat (nacin 16500) ali John the Ripper z jwt2john.py. Zacnite s pogostimi gesli (rockyou.txt), nato poskusite specificne izraze za aplikacijo in privzete skrivnosti iz ogrodij. Ko je skrivnost obnovljena, lahko napadalec ponaredi zetone za katerega koli uporabnika.
Vbrizgavanje kljucev
Vec parametrov glave JWT omogoca zetonu, da doloci, od kod naj se pridobi verifikacijski kljuc. Glava jku kaze na URL, ki gosti nabor spletnih kljucev JSON. Glava jwk vgradi verifikacijski kljuc neposredno v zeton. Glavi x5u in x5c uporabljata certifikate X.509. Ce streznik ne validira teh glav glede na beli seznam, lahko napadalec gosti svoje kljuce in podpise zetone z njimi. Parameter kid (ID kljuca) je prav tako ranljiv za preckanje imenikov (../../../dev/null), vbrizgavanje SQL 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 casovni zig dalec v prihodnosti ali njegova popolna odstranitev.
- Obcinstvo in izdajatelj - Spreminjanje trditev aud ali iss za uporabo zetonov med razlicnimi storitvami ali okolji.
Zivljenjska doba zetonov in premisleki o JWE
Tudi pravilno podpisani JWT-ji lahko ustvarijo varnostne tezave prek slabega upravljanja zivljenjskega cikla. Dostopni zetoni s pretirano dolgo zivljenjsko dobo razsirijo okno za zlorabo ukradenih zetonov. Osvezitveni zetoni, ki nikoli ne potecejo ali se ne rotirajo ob uporabi, omogocajo trajni dostop po spremembi poverilnic. Vecina implementacij JWT uporablja JWS (podpis), ki zagotavlja celovitost, ne pa zaupnosti. JWE (sifriranje) zagotavlja zaupnost, vendar uvaja lastno napadalno povrsino.
Metodologija testiranja po korakih
- Zajem in dekodiranje - Prestregnite zetone JWT iz odgovorov overitve, piskotkov ali glav Authorization.
- Test algoritma "none" - Spremenite glavo na alg:none in odstranite podpis.
- Test preklopa algoritma - Ce streznik uporablja RS256, pridobite javni kljuc in testirajte preklop na HS256.
- Razbijanje sibkih skrivnosti - Za zetone HMAC zazenite hashcat -m 16500 proti pogostim seznamom besed.
- Test vbrizgavanja kljucev - Spremenite glave jku, jwk, x5u in x5c, da kazejo na kljuce pod nadzorom napadalca.
- Test vbrizgavanja kid - Poskusite preckanje imenikov, vbrizgavanje SQL in vbrizgavanje ukazov v parametru kid.
- Manipulacija trditev - Spremenite trditve sub, role, admin in exp ter ponovno oddajte z veljavnim podpisom.
- Test zivljenjskega cikla zetonov - Preverite, da zetoni postanejo neveljavni po odjavi in spremembi gesla.
Orodja
- jwt_tool - Najobseznejse orodje za testiranje JWT z zmedo algoritmov, vbrizgavanjem kljucev in manipulacijo trditev.
- jwt.io - Spletni dekoder in razhroscjevalnik JWT za hitro pregledovanje in rocno urejanje trditev.
- hashcat - Nacin 16500 za razbijanje skrivnosti HMAC JWT, pospeseno z GPU.
- John the Ripper - Z jwt2john.py za pretvorbo zetonov JWT v format za razbijanje.
- Razsiritve Burp Suite za JWT - JSON Web Tokens in JWT Editor za manipulacijo zetonov v proxyju.
Odprava
Pripnite algoritem podpisovanja na strani streznika -- nikoli ga ne berite iz glave zetona. Uporabite mocne skrivnosti za HMAC z vsaj 256 biti entropije. Za asimetricne algoritme uporabite RSA 2048+ ali ECDSA P-256. Ignorirajte glave jku, jwk, x5u, x5c in kid, razen ce so nujno potrebne. Nastavite kratke zivljenjske dobe dostopnih zetonov (5-15 minut) in implementirajte ustrezno rotacijo osvezitvenih zetonov. Validirajte vse trditve ob vsaki zahtevi. Varno shranjujte podpisne kljuce z uporabo HSM-ov ali storitev za upravljanje kljucev.
Zanima vas vec o tej temi? Preberite mojo strokovno stran o Web Application Security →
Komentarji
Ni se komentarjev. Bodite prvi!
Dodaj komentar