User Tools

Site Tools


deserializacija

This is an old revision of the document!


Nesigurna deserijalizacija

Serijalizacija je proces pretvaranja složenijih tipova podataka u jednostavniji oblik, primjerice u niz bajtova. Svrha je zapisati podatke u obliku u kojem se ti podatci mogu zapisati u datoteku, slati mrežom ili pohraniti u bazu podataka. Primjeri formata u koji se pohranjuju podatci su binarni zapis, JSON (JavaScript Object Notation) i XML (Extensible Markup Language).
Deserijalizacija je obrnut proces. On iz sažetog zapisa podataka rekonstruira objekt koji je serijaliziran. Deserijalilziran objekt mora biti jednak originalnom, obuhvatiti sve njegove funkcionalnosti i mora moći imati interakcije s web stranicom kao i originalni objekt.

Nesigurna deserijalizacija (eng. Insecure deserialization) javlja se na web stranicama koje deserijaliziraju podatke koje unose korisnici. U idealnom slučaju, nikad se ne bi trebali izravno koristiti podatci koje unosi korisnik jer svaki korisnik može biti zlonamjeran i unijeti podatke koji mogu izazvati štetu. Usprkos svim provjerama koje stranica može provesti, vrlo je teško pokriti sve slučajeve i potpuno osigurati. Osim toga, vrlo često web stranica mora deserijalizirati podatke prije nego što uopće prepozna da je uneseno nešto maliciozno, a tad već bude prekasno. Dodatan je problem što moderne stranice, kako bi imale što više funkcionalnosti, često implementiraju velik broj bibioteka, koje svaka za sebe imaju mnogo različitih metoda i klasa. Zbog toga već samo na razini jedne stranice postoji velik broj klasa i metoda koje se ponašaju različito i teško je osigurati stranicu tako da se pokriju sve njihove sigurnosne rupe. Teško je i predvidjeti koja će se od tih brojnih metoda pozvati nad malicioznim podatcima, š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, može dovesti do eskalacije privilegija, pristupa nasumičnim datotekama i DOS napadima. (?? doraditi)

Jedna od ranjivosti PHP-a koja se koristi pri deserijalizaciji je činjenica da dopušta operator “==” koji je manje strog od klasičnog operatora jednakosti “===”. Pokaza ćemo razliku na ovom primjeru:

5 === "5"  //False
5 == "5"  //True

Ovakva razlika između dvaju operatora jedakosti postoji u još nekim programskim jezicima, primjerice u JavaScriptu. Međutim, ovdje je ta razlika izraženija. Naime, ove će dvije tvrdnje također rezultirati istinom:

5 == "5 i još nešto"
0 == "nešto"

Prvi je string donekle intuitivan. Operator usporedbe na desnoj strani nakon što prođe prvi znak stringa i usporedi ga s lijevom stranom nailazi na jednakost i vraća istinu. Ostatak stringa se potpuno ignorira. Međutim, drugi slučaj je onaj koji stvara sigurnosne probleme. Naime, PHP će string “nešto” tretirati kao integer 0 jer u njemu nema brojeva. Već sad vidimo da je to logički neispravno. Uzmimo napadača koji je na web stranici koja deserijalizira podatke. Izmijenio je varijablu $password tako da ne sadrži brojeve. Ako korisnikova lozinka ne sadrži brojeve, izjednačavanje korisnikove lozinke s varijablom $password će uvijek vraćati istinu. Na ovaj će se način napadač bez problema ulogirati kao neki drugi korisnik bez da zna njegovu lozinku:

$login = unserialize($_COOKIE)
if ($login['password'] == $password) {
// log in successfully
}

- magične metode - arbitrary object injection in php (primjer)

- objašnjenje hacknite zadatak

PRIMJER: Zadatak s Hacknite platforme - Autentifikacija bez lozinke

Istražujući internet, Ana je otkrila inovativan način kako se prijaviti u sustav kao admin bez potrebnog 
korisničkog imena ili lozinke. Zadovoljna svojim otrkićem, spremila je vrlo zanimljivu informaciju na 
/usr/local/flag.txt, no za pristup toj informaciji potrebno je prijaviti se u sustav kao admin.

Flag je u formatu CTF2021[brojevi]

http://chal.platforma.hacknite.hr:10014

Neki jezici implementiraju zaštitu podataka koji se serijaliziraju. Primjerice, u Javi u klasi koja implementira sučelje Serializable podatci koji se ne bi trebali serijalizirati trebaju se 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.

- mjere zaštite

Izvori

deserializacija.1701358429.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki