User Tools

Site Tools


zapamtime

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zapamtime [2025/10/31 15:33] mbuniczapamtime [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 15: Line 15:
 Osim Dockerfilea, jedini drugi izvorni kod je **server.js**, u kojem se nalazi sav kod koji pokreće stranicu. Osim Dockerfilea, jedini drugi izvorni kod je **server.js**, u kojem se nalazi sav kod koji pokreće stranicu.
  
-Pri analizi source koda vidi se da je adminov username “administrator0”:+Pri analizi source koda vidi se da je korisničko ime administratora: “administrator0”:
  
 <file> <file>
Line 21: Line 21:
 </file> </file>
  
-Također se vidi da stranica koristi **secret** varijablu koja je sastavljena od 22 nasumična bajta, generirana pomoću **crypto.randomBytes** modula, što znači da bi trebala biti sigurna.+Također se vidi da stranica koristi varijablu **secret** sastavljenu od 22 nasumična bajta, generirana pomoću **crypto.randomBytes** modula, što znači da bi trebala biti sigurna.
  
 Također se vidi da je **FLAG** definiran kao varijabla. \\ Također se vidi da je **FLAG** definiran kao varijabla. \\
  
-{{ :slika1.png?nolink&500 | Slika 1 – administrator username i secret varijabla}}+{{ zapamtime:slika1.png?nolink&500 | Slika 1 – administrator username i secret varijabla}}
  
 Nakon toga slijedi inicijalizacija baze podataka. \\ Nakon toga slijedi inicijalizacija baze podataka. \\
  
-{{ :slika2.png?nolink&500 | Slika 2 – inicijalizacija baze podataka}}+{{ zapamtime:slika2.png?nolink&500 | Slika 2 – inicijalizacija baze podataka}}
  
-U inicijalizaciji baze podataka vidi se da svaki korisnik ima **ID**, **username**, **password**, **token**, **isAdmin** varijablu (koja je po defaultu 0) te vrijeme kada je korisnik stvoren.+U inicijalizaciji baze podataka vidi se da svaki korisnik ima **ID**, **username**, **password**, **token**, **isAdmin** varijablu (koja je po defaultu 0) te vrijeme kada je korisnički račun stvoren.
  
 Također se vidi da se administratorski korisnik postavlja s vrijednošću 1 za **isAdmin**. Također se vidi da se administratorski korisnik postavlja s vrijednošću 1 za **isAdmin**.
Line 37: Line 37:
 Ključan dio koda je način na koji se generira token. \\ Ključan dio koda je način na koji se generira token. \\
  
-{{ :slika3.png?nolink&500 | Slika 3 – generiranje admin tokena}}+{{ zapamtime:slika3.png?nolink&500 | Slika 3 – generiranje admin tokena}}
  
 Token se generira kao string koji se sastoji od **secret** varijable, **usernamea** i **ID-a** korisnika, a zatim se ubacuje u **bcrypt.hash** funkciju, koristeći i **BCRYPT_SALT**. Token se generira kao string koji se sastoji od **secret** varijable, **usernamea** i **ID-a** korisnika, a zatim se ubacuje u **bcrypt.hash** funkciju, koristeći i **BCRYPT_SALT**.
  
-{{ :slika4.png?nolink&500 | Slika 4 – BCRYPT_SALT varijabla}}+{{ zapamtime:slika4.png?nolink&500 | Slika 4 – BCRYPT_SALT varijabla}}
  
 **BCRYPT_SALT** varijabla se generira u **initializeAuth** funkciji koja se poziva samo jednom pri pokretanju servera. To znači da će ta varijabla biti ista tijekom cijelog životnog vijeka aplikacije. **BCRYPT_SALT** varijabla se generira u **initializeAuth** funkciji koja se poziva samo jednom pri pokretanju servera. To znači da će ta varijabla biti ista tijekom cijelog životnog vijeka aplikacije.
Line 57: Line 57:
 Funkcija **uuidv5** je deterministička — za isti par **username** i **namespace** svaki put će generirati isti UUID. Funkcija **uuidv5** je deterministička — za isti par **username** i **namespace** svaki put će generirati isti UUID.
  
-To znači da u generaciji administratorskog tokena (slika 3) od tri varijable — **secret**, **ADMIN_NAME** i **adminId** — poznajemo **ADMIN_NAME** (“administrator0”), možemo lokalno rekreirati isti **adminId** kao onaj koji koristi aplikacija, dok za **secret** ne možemo znati vrijednost.  +To znači da u generaciji administratorskog tokena (slika 3) od tri varijable — **secret**, **ADMIN_NAME** i **adminId** — poznajemo **ADMIN_NAME** (“administrator0”), možemo lokalno reproducirati isti **adminId** kao onaj koji koristi aplikacija, dok za **secret** ne možemo znati vrijednost.  
  
-Budući da su i **secret** i **BCRYPT_SALT** varijable konstante dok aplikacija radi, token administratora uvijek se računa na isti način.+Budući da su i **secret** i **BCRYPT_SALT** varijable konstante dok aplikacija radi, ove dvije varijable će imati istu vrijednost kada će se koristiti za generaciju tokena korisnika.
  
 Ključna činjenica zadatka temelji se na ponašanju funkcije: Ključna činjenica zadatka temelji se na ponašanju funkcije:
Line 70: Line 70:
 Zato dva unosa s istih prvih 72 znaka daju isti hash, bez obzira na razlike iza 72. znaka. Zato dva unosa s istih prvih 72 znaka daju isti hash, bez obzira na razlike iza 72. znaka.
  
-Pregledom **tokenString** varijable, koja se ubacuje u **bcrypt.hash** i generira administratorski token, vidi se njezina duljina.+Pregledom **tokenString** varijable, koja se ubacuje u **bcrypt.hash** i generira administratorski token, može se izračunati njezina duljina.
  
 Varijabla se sastoji od tri stringa: **secret**, **ADMIN_NAME** i **adminId**. Varijabla se sastoji od tri stringa: **secret**, **ADMIN_NAME** i **adminId**.
  
 <file> <file>
-- **secret** = 22 znaka   +secret = 22 znaka   
-- **ADMIN_NAME** = 14 znakova (“administrator0”)   +ADMIN_NAME = 14 znakova (“administrator0”)   
-- **adminId** = 36 znakova (UUID)+adminId = 36 znakova (UUID)
 </file> </file>
  
-Zbrajanjem 22 + 14 + 36 dobiva se 72, što je točno broj znakova koje **bcrypt.hash** uzima u obzir.+Zbrajanjem 22 + 14 + 36 dobiva se 72, što je točno broj znakova koje funkcija **bcrypt.hash** uzima u obzir.
  
 --- ---
Line 86: Line 86:
 Sada pogledajmo kako se generira token pri stvaranju novog korisnika, što se događa u “/register” endpointu. \\ Sada pogledajmo kako se generira token pri stvaranju novog korisnika, što se događa u “/register” endpointu. \\
  
-{{ :slika5.png?nolink&500 | Slika 5 – registracija novog korisnika}}+{{ zapamtime:slika5.png?nolink&500 | Slika 5 – registracija novog korisnika}}
  
 Može se vidjeti da se token za novog korisnika generira na isti način kao i administratorski token. \\ Može se vidjeti da se token za novog korisnika generira na isti način kao i administratorski token. \\
  
-{{ :slika6.png?nolink&500 | Slika 6 – token novog korisnika}}+{{ zapamtime:slika6.png?nolink&500 | Slika 6 – token novog korisnika}}
  
 Koristi se ista **secret** varijabla i ista **BCRYPT_SALT** vrijednost kao i kod generiranja administratorskog tokena. Koristi se ista **secret** varijabla i ista **BCRYPT_SALT** vrijednost kao i kod generiranja administratorskog tokena.
Line 96: Line 96:
 Jedine dvije različite vrijednosti su **username** i **userId**. Jedine dvije različite vrijednosti su **username** i **userId**.
  
-Na **userId** nemamo utjecaj, ali **username** možemo kontrolirati.+Na vrijednost **userId-a** nemamo utjecaj, ali **username** možemo kontrolirati
 + 
 +Budući da je **secret** duljine 22, a **bcrypt.hash** uzima samo prvih 72 znaka, ako unesemo **username** duljine **50**, on će “izgurati” **userId** iz dijela koji **bcrypt.hash** koristi (prvih 72 znaka)
  
-Budući da je **secret** duljine 22, a **bcrypt.hash** uzima samo prvih 72 znaka, ako unesemo **username** duljine **50**, on će “istisnuti” **userId** iz dijela koji **bcrypt.hash** koristi.   
 To znači da **userId** uopće neće ući u generiranje korisničkog tokena. To znači da **userId** uopće neće ući u generiranje korisničkog tokena.
  
 Na taj način imamo potpunu kontrolu nad 50 znakova (nakon **secret**), koji će sudjelovati u generiranju tokena. Na taj način imamo potpunu kontrolu nad 50 znakova (nakon **secret**), koji će sudjelovati u generiranju tokena.
  
-Pošto su **secret** i **BCRYPT_SALT** isti pri generiranju oba tokena (admin i user), ako uspijemo manipulirati tih 50 znakova da budu isti kao kod administratora, dobit ćemo identičan token.+Budući da su **secret** i **BCRYPT_SALT** isti pri generiranju oba tokena (admin i user), ako uspijemo manipulirati tih 50 znakova da budu isti kao kod administratora, dobit ćemo identičan token.
  
 Da bi to bilo moguće, mora vrijediti: Da bi to bilo moguće, mora vrijediti:
Line 119: Line 120:
 Možemo dodati liniju koda koja će ispisati **adminId**: \\ Možemo dodati liniju koda koja će ispisati **adminId**: \\
  
-{{ :slika7.png?nolink&500 | Slika 7 – ispis adminId-a}}+{{ zapamtime:slika7.png?nolink&500 | Slika 7 – ispis adminId-a}}
  
 Pokretanjem programa naredbom: Pokretanjem programa naredbom:
Line 129: Line 130:
 vidjet ćemo **adminId**, koji će biti isti kao i na produkcijskom serveru. \\ vidjet ćemo **adminId**, koji će biti isti kao i na produkcijskom serveru. \\
  
-{{ :slika8.png?nolink&500 | Slika 8 – adminId}}+{{ zapamtime:slika8.png?nolink&500 | Slika 8 – adminId}}
  
 <file> <file>
Line 139: Line 140:
 Analizom token middleware funkcije vidi se kako se koristi token: \\ Analizom token middleware funkcije vidi se kako se koristi token: \\
  
-{{ :slika9.png?nolink&500 | Slika 9 – token middleware}}+{{ zapamtime:slika9.png?nolink&500 | Slika 9 – token middleware}}
  
 Middleware dohvaća token iz kolačića, traži prvog korisnika u bazi s tim tokenom i postavlja sesiju kao tog korisnika. Middleware dohvaća token iz kolačića, traži prvog korisnika u bazi s tim tokenom i postavlja sesiju kao tog korisnika.
  
-Pošto se uzima **prvi user** u bazi, a administrator je uvijek prvi kreirani korisnik, bilo koji kasniji korisnik s istim tokenom automatski postaje administrator.+Budući da se uzima **prvi user** u bazi, a administrator je uvijek prvi kreirani korisnik, bilo koji kasniji korisnik s istim tokenom automatski postaje administrator.
  
 --- ---
Line 167: Line 168:
 Pri pokušaju logina vidi se da postoji ograničenje maksimalnog broja znakova u korisničkom imenu (14 znakova), što bi onemogućilo ovu tehniku. \\ Pri pokušaju logina vidi se da postoji ograničenje maksimalnog broja znakova u korisničkom imenu (14 znakova), što bi onemogućilo ovu tehniku. \\
  
-{{ :slika10.png?nolink&500 | Slika 10 – ograničenje broja znakova u usernameu}}+{{ zapamtime:slika10.png?nolink&500 | Slika 10 – ograničenje broja znakova u usernameu}}
  
-No to ograničenje nije implementirano na serverskoj strani, nego samo u HTML kodu (klijentskoj strani), pa se lako može zaobići — brisanjem dijela HTML-a prikazanog na slici 11. ili korištenjem **BurpSuite** alata. \\+Međutim, to ograničenje nije implementirano na serverskoj strani, nego samo u HTML kodu (klijentskoj strani), pa se lako može zaobići — brisanjem dijela HTML-a prikazanog na slici 11. ili korištenjem **BurpSuite** alata. \\
  
-{{ :slika11.png?nolink&500 | Slika 11 – brisanje ograničenja za dužinu usernamea na korisničkoj strani}}+{{ zapamtime:slika11.png?nolink&500 | Slika 11 – brisanje ograničenja za dužinu usernamea na korisničkoj strani}}
  
 Sada se može stvoriti korisnički račun koji će imati isti token kao administrator, što je prikazano na slici 12. \\ Sada se može stvoriti korisnički račun koji će imati isti token kao administrator, što je prikazano na slici 12. \\
  
-{{ :slika12.png?nolink&500 | Slika 12 – stvaranje korisnika s istim tokenom kao administrator}}+{{ zapamtime:slika12.png?nolink&500 | Slika 12 – stvaranje korisnika s istim tokenom kao administrator}}
  
-{{ :slika13.png?nolink&500 | Slika 13 – riješen zadatak}}+{{ zapamtime:slika13.png?nolink&500 | Slika 13 – riješen zadatak}}
  
zapamtime.1761924794.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki