User Tools

Site Tools


deserializacija

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
deserializacija [2023/12/01 14:37] zrinkadeserializacija [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 4: Line 4:
 **Deserijalizacija** je obrnut proces. Iz sažetog zapisa podataka rekonstruira se objekt koji je nekad prije bio serijaliziran. Deserijaliziran objekt mora biti jednak originalnom, obuhvatiti sve njegove funkcionalnosti i mora moći obavljati sve interakcije s web stranicom kao i original. **Deserijalizacija** je obrnut proces. Iz sažetog zapisa podataka rekonstruira se objekt koji je nekad prije bio serijaliziran. Deserijaliziran objekt mora biti jednak originalnom, obuhvatiti sve njegove funkcionalnosti i mora moći obavljati sve interakcije s web stranicom kao i original.
  
-**Nesigurna deserijalizacija** (eng. //Insecure deserialization//) javlja se na web stranicama koje deserijaliziraju podatke koje unose korisnici. U idealnom slučaju, nikad se ne bi trebao izravno deserijalizirati korisnički unos jer svaki korisnik može biti zlonamjeran i unijeti podatke koji će izazvati štetu. Usprkos tomu što stranice provode različite provjere nad unesenim podatcima, vrlo je teško pokriti sve moguće slučajeve. Osim toga, često web stranica mora barem početi deserijalizaciju podataka prije nego što prepozna da je uneseno nešto maliciozno, a tad već može biti prekasno. Dodatan je problem što moderne stranice, kako bi imale što više funkcionalnosti, implementiraju velik broj biblioteka. Zbog toga već samo na razini jedne web stranice postoji velik broj klasa i metoda. Ne može se uvijek predvidjeti koja će se od tih brojnih metoda pozvati nad deserijaliziranim podatcima jer oni mogu biti različitih klasa, što znači da ne možemo predvidjeti ponašanje web stranice ako krene deserijalizirati nesigurne podatke. Zato su i posljedice vrlo širokog spektra. Napadač može dobiti mogućnost //remote code executiona//, a u slučaju da stranica ima dobru zaštitu protiv toga, i dalje može doći do eskalacije privilegija, pristupa nasumičnim datotekama i DOS (//Denial-of-Service//) napada. +**Nesigurna deserijalizacija** (eng. //Insecure deserialization//) javlja se na web stranicama koje deserijaliziraju podatke koje unose korisnici. U idealnom slučaju, nikad se ne bi trebao izravno deserijalizirati korisnički unos jer svaki korisnik može biti zlonamjeran i unijeti podatke koji će izazvati štetu. Usprkos tomu što stranice provode različite provjere nad unesenim podatcima, vrlo je teško pokriti sve moguće slučajeve. Osim toga, često web stranica mora barem početi deserijalizaciju podataka prije nego što prepozna da je uneseno nešto maliciozno, a tad već može biti prekasno. Dodatan je problem što moderne stranice, kako bi imale što više funkcionalnosti, implementiraju velik broj biblioteka. Zbog toga već samo na razini jedne web stranice postoji velik broj klasa i metoda. Ne može se uvijek predvidjeti koja će se od tih brojnih metoda pozvati nad deserijaliziranim podatcima jer oni mogu biti različitih klasa, što znači da ne možemo predvidjeti ponašanje web stranice ako krene deserijalizirati nesigurne podatke. Zato su i posljedice vrlo širokog spektra. Napadač može dobiti mogućnost //remote code executiona//, a u slučaju da stranica ima dobru zaštitu protiv toga, i dalje može doći do eskalacije privilegija, pristupa nasumičnim datotekama i DoS (//Denial-of-Service//) napada. 
  
 Jedna od ranjivosti PHP-a koja se koristi pri deserijalizaciji je činjenica da postoji operator "==" koji je manje strog od klasičnog operatora jednakosti "===". Pokazat ćemo razliku na ovom primjeru: Jedna od ranjivosti PHP-a koja se koristi pri deserijalizaciji je činjenica da postoji operator "==" koji je manje strog od klasičnog operatora jednakosti "===". Pokazat ćemo razliku na ovom primjeru:
Line 11: Line 11:
 5 == "5"  //vraća True 5 == "5"  //vraća True
 </code> </code>
-Operator "===" uspoređuje vrijednosti lijeve i desne strane, ali i tipove podataka. Budući da je na lijevoj strani broj (//integer//), a na desnoj niz znakova (//string//), operator vraća //False//, iako su vrijednosti iste. S druge strane, operator "==" uspoređuje samo vrijednosti lijeve i desne strane te zato vraća //True//. Ovakva razlika između dvaju operatora jednakosti postoji u još nekim programskim jezicima, primjerice u JavaScriptu. Međutim, ovdje je ta razlika izraženija. Naime, ove će dvije tvrdnje rezultirati istinom, iako intuitivno ne bi trebale:+Operator "===" uspoređuje vrijednosti lijeve i desne strane, ali i tipove podataka. Budući da je na lijevoj strani broj (//integer//), a na desnoj niz znakova (//string//), operator vraća //False//, iako su im vrijednosti iste. S druge strane, operator "==" uspoređuje samo vrijednosti lijeve i desne strane te zato vraća //True//. Ovakva razlika između dvaju operatora jednakosti postoji u još nekim programskim jezicima, primjerice u JavaScriptu. Međutim, ovdje je ta razlika izraženija. Naime, ove će dvije tvrdnje rezultirati istinom, iako intuitivno ne bi trebale:
 <code php> <code php>
 5 == "5 i još nešto" 5 == "5 i još nešto"
 0 == "nešto" 0 == "nešto"
 </code> </code>
-Prva se tvrdnja donekle se može shvatiti istinom jer je barem početak desne strane jednak lijevoj strani. Međutim, druga je je semantički pogrešna i stvara veće sigurnosne probleme. Naime, PHP će ovdje niz znakova "nešto" tretirati kao broj 0 jer u nizu nema znamenki. Uzmimo web stranicu koja deserijalizira podatke i provjerava podatke ovim kôdom:  +Prva se tvrdnja donekle se može shvatiti istinom jer je barem početak desne strane jednak lijevoj strani. Međutim, druga je je semantički pogrešna i stvara veće sigurnosne probleme. Naime, PHP će ovdje niz znakova //"nešto"// tretirati kao broj 0 jer u nizu nema znamenki. Uzmimo web stranicu koja deserijalizira podatke i provjerava podatke ovim kôdom:  
 <code php> <code php>
 $login = unserialize($_COOKIE) $login = unserialize($_COOKIE)
Line 23: Line 23:
 } }
 </code> </code>
-Unesena lozinka korisnika gleda se tako što se deserijalizira sve što se nalazi u kolačiću iz toga izvuče atribut //password//. Recimo da je napadač unio broj 0. Ako lozinka korisnika kojemu provaljuje u račun (varijabla //$password//) ne sadrži brojeve, izjednačavanje unesene lozinke s njom će vratiti istinu, odnosno sustav će unesenu lozinku tretirati kao ispravnu, iako je zapravo možda potpuno različita od prave. Važno je napomenuti da ovo funkcionira samo iz razloga što deserijalizacija čuva tip podatka. Da se lozinka gledala direktno iz polja za unos, broj 0 pretvorio bi se u niz znakova "0", a tada bi usporedba bila neistinita.+Unesena lozinka korisnika gleda se tako što se deserijalizira sve što se nalazi u kolačiću iz toga izvuče atribut //password//. Recimo da je napadač unio broj 0. Ako lozinka korisnika kojemu provaljuje u račun (varijabla //$password//) ne sadrži brojeve, izjednačavanje unesene lozinke s njom će vratiti istinu, odnosno sustav će unesenu lozinku tretirati kao ispravnu, iako je zapravo možda potpuno različita od prave. Važno je napomenuti da ovo funkcionira samo zbog razloga što deserijalizacija čuva tip podatka. Da se lozinka gledala direktno iz polja za unos, broj 0 pretvorio bi se u niz znakova "0", a tada bi usporedba bila neistinita.
  
 ===Magične metode=== ===Magične metode===
Line 30: Line 30:
 ===Umetanje nasumičnih objekata=== ===Umetanje nasumičnih objekata===
 U objektno orijentiranim jezicima objekt pripada nekoj klasi. Klasa se može shvatiti kao vrsta objekta, a  objekt je instanca klase. Primjerice, drveće bi se moglo modelirati klasom, a svako drvo za sebe jednim objektom. Svako drvo ima grane, listove i deblo te svako može raditi iste stvari (stvarati grane, pupove listova, odbaciti listove, promijeniti boju lista...). Na isti način, svaka klasa u programskom jeziku ima definirane atribute i metode koje se mogu zvati nad objektima koji pripadaju toj klasi. Atributi su osobine objekta, ono što on posjeduje, a metode su akcije koje objekt može obaviti ili koje se mogu obaviti nad njime.\\ U objektno orijentiranim jezicima objekt pripada nekoj klasi. Klasa se može shvatiti kao vrsta objekta, a  objekt je instanca klase. Primjerice, drveće bi se moglo modelirati klasom, a svako drvo za sebe jednim objektom. Svako drvo ima grane, listove i deblo te svako može raditi iste stvari (stvarati grane, pupove listova, odbaciti listove, promijeniti boju lista...). Na isti način, svaka klasa u programskom jeziku ima definirane atribute i metode koje se mogu zvati nad objektima koji pripadaju toj klasi. Atributi su osobine objekta, ono što on posjeduje, a metode su akcije koje objekt može obaviti ili koje se mogu obaviti nad njime.\\
-Napadač može manipulirati koje će klase biti objekt poslan na deserijalizaciju. Uobičajeno programski jezici imaju mehanizme prepoznavanja neočekivanih tipova podataka pa će slanje objekta neke druge klase obično izazvati grešku (//error//) ili iznimku (//exception//). Ipak, to ne mora uvijek biti dovoljna zaštita jer je objekt već ušao u sustav i može raditi štetu.+Napadač može manipulirati koje će klase biti objekt poslan na deserijalizaciju. Kažemo da je umetnut //nasumičan// objekt jer u pravilu u svakoj stranici postoji mnogo klasa objekata koje se koriste pa je teško predvidjeti koju će od njih napadač odabrati da bi izazvao grešku. Uobičajeno programski jezici imaju mehanizme prepoznavanja neočekivanih tipova podataka pa će slanje objekta neke druge klase obično izazvati grešku (//error//) ili iznimku (//exception//). Ipak, to ne mora uvijek biti dovoljna zaštita jer je moguće da je objekt već ušao u sustav.
 \\ \\
 \\ \\
Line 81: Line 81:
  
 Implementacija klase //FileAccess// prepisana je iz datoteke koja je priložena zadatku. \\ Implementacija klase //FileAccess// prepisana je iz datoteke koja je priložena zadatku. \\
-Rezultat ove skripte identičan je onome što vidimo u //message// parametru našeg zahtjeva. Promijenimo sad parametar funkcije //set_filename()// u "/usr/local/flag.txt". Dobili smo:+Rezultat ove skripte identičan je onome što vidimo u //message// parametru našeg zahtjeva, dakle implementirali smo kodiranje na isti način kao i web stranica. Promijenimo sad parametar funkcije //set_filename()//željenu putanju "/usr/local/flag.txt". Dobili smo:
 <code>TzoxMDoiRmlsZUFjY2VzcyI6MTp7czoyMDoiAEZpbGVBY2Nlc3MAZmlsZW5hbWUiO3M6MTk6Ii91c3IvbG9jYWwvZmxhZy50eHQiO30</code> <code>TzoxMDoiRmlsZUFjY2VzcyI6MTp7czoyMDoiAEZpbGVBY2Nlc3MAZmlsZW5hbWUiO3M6MTk6Ii91c3IvbG9jYWwvZmxhZy50eHQiO30</code>
  
Line 91: Line 91:
 ===Mjere zaštite=== ===Mjere zaštite===
 Za sigurniju deserijalizaciju preporučljivo je koristiti se formatima koji imaju dobro definirana pravila deserijaliziranja, primjerice JSON ili XML. Na taj se način smanjuje vjerojatnost da će netko unijeti neku dodatnu logiku prilikom deserijalizacije jer je već mnogo toga jasno definirano.\\ Za sigurniju deserijalizaciju preporučljivo je koristiti se formatima koji imaju dobro definirana pravila deserijaliziranja, primjerice JSON ili XML. Na taj se način smanjuje vjerojatnost da će netko unijeti neku dodatnu logiku prilikom deserijalizacije jer je već mnogo toga jasno definirano.\\
-Poželjno je složiti aplikaciju tako da ona pri serijalizaciji označi svaki podatak nekom vrstom potpisa. Zatim prije deserijalizacije treba provjeriti postoji li taj potpis te, ako ga nema, odbaciti podatak jer je vjerojatno maliciozan. Na taj način može se spriječiti ubacivanje štetnih podataka od strane napadača.\\ +Poželjno je složiti aplikaciju tako da ona pri serijalizaciji označi svaki podatak nekom vrstom potpisa. Zatim prije deserijalizacije treba provjeriti postoji li taj potpis te, ako ga nema, odbaciti podatak jer je vjerojatno maliciozan. Tako se može spriječiti ubacivanje štetnih podataka od strane napadača.\\ 
-Neki jezici implementiraju zaštitu podataka koji se serijaliziraju. Primjerice, u Javi klasa koja implementira sučelje //Serializable// i ima podatke koji se ne bi trebali serijalizirati, njih treba označiti kao //private transient//. //Private// znači da se taj podatak ne bi trebao vidjeti ni u jednoj klasi izvan te u kojoj je definiran. //Transient// je ono što zapravo sprečava serijalizaciju podatka. \\+Neki jezici implementiraju zaštitu podataka koji se serijaliziraju. Primjerice, u Javi postoji sučelje //Serializable// koje mora implementirati svaka klasa objekata ako se oni serijaliziraju. Ako postoje podatci koji se ne smiju serijalizirati, njih treba označiti kao //private transient//. //Private// znači da se taj podatak ne bi trebao vidjeti niti u jednoj klasi izvan one u kojoj je definiran. //Transient// je ono što zapravo sprečava serijalizaciju podatka. \\
 Postoje mnogi alati i biblioteke čija je zadaća osigurati deserijalizaciju, primjerice Javini //SerialKiller// i //NotSoSerial// te //Serial  Whitelist Application Trainer// (SWAT) i mnogi drugi. Postoje mnogi alati i biblioteke čija je zadaća osigurati deserijalizaciju, primjerice Javini //SerialKiller// i //NotSoSerial// te //Serial  Whitelist Application Trainer// (SWAT) i mnogi drugi.
  
deserializacija.1701441430.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki