User Tools

Site Tools


baze_i_datoteke

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
baze_i_datoteke [2025/02/10 12:26] kresimirbaze_i_datoteke [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 5: Line 5:
  
 <file> <file>
-Web programerka Sara je naučila koliko je bitno ograničiti tipove datoteka koje je moguće učitati (eng. upload) u web aplikaciju. Također je naučila koliko je bitno koristiti parametrizirane SQL upite. Moli te da testiraš postoji li ipak neka napredna ranjivost koju bi netko mogao koristiti da kompromitira web aplikaciju.+Web programerka Sara je naučila koliko je bitno ograničiti tipove datoteka koje je moguće učitati (eng. upload)  
 +u web aplikaciju. Također je naučila koliko je bitno koristiti parametrizirane SQL upite. Moli te da provjeriš 
 +postoji li ipak neka napredna ranjivost koju bi netko mogao koristiti da kompromitira web aplikaciju.
 Napomena: Zadatak se periodički resetira (svakih sat vremena). Ako je zadatak nedostupan pričekajte 1-2 minute. Napomena: Zadatak se periodički resetira (svakih sat vremena). Ako je zadatak nedostupan pričekajte 1-2 minute.
 http://chal.platforma.hacknite.hr:13010 http://chal.platforma.hacknite.hr:13010
Line 14: Line 16:
 Pristup na stranicu ponuđene su opcije Login i Register, prikazano na slici 1. Pristup na stranicu ponuđene su opcije Login i Register, prikazano na slici 1.
  
-{{bazeidatoteke:slika1.png}}+{{  bazeidatoteke:slika1.png  }}
  
-Pregledom izvornog koda od register.php, može se vidjeti da je jedini uvjet za registraciju da su korisničko ime i lozinka duži od 10 znakova, prikazano na slici 2 (uvjet unutar drugog IF grananja).+Pregledom izvornog koda u datoteci "register.php", može se vidjeti da je jedini uvjet za registraciju da su korisničko ime i lozinka duži od 10 znakova, prikazano na slici 2(uvjet unutar drugog IF grananja). 
 + 
 + 
 +{{  bazeidatoteke:slika2.png  |  Slika 2.  }}
  
-{{bazeidatoteke:slika2.png}} 
  
 Nakon prijavljivanja na stranicu, dostupna je opcija uploada profilne slike, što je prikazano na slici 3. Nakon prijavljivanja na stranicu, dostupna je opcija uploada profilne slike, što je prikazano na slici 3.
  
-{{bazeidatoteke:slika3.png}}+{{  bazeidatoteke:slika3.png  }}
  
-Pregledom koda koji implementira funkcionalnost uploada slike, prikazano na slici 4, može se uočiti da se uploadana slika uvijek spremi pod nazivom „profile.png“. Također može se uočiti da se direktorij u koji se pohranjuje slika generira iz sha256 hasha korisničkog imena prijavljenog korisnika. Ovaj se direktorij nalazi u direktoriju „uploads“, pa je tako puna putanja uploadane slike  +Pregledom koda koji implementira funkcionalnost uploada slike, prikazano na slici 4., može se uočiti da se uploadana slika uvijek spremi pod nazivom „profile.png“. Također može se uočiti da se direktorij u koji se pohranjuje slika generira iz sha256 hasha korisničkog imena prijavljenog korisnika. Ovaj se direktorij nalazi u direktoriju „uploads“, pa je tako puna putanja uploadane slike  
-¸¸+<code>
 /uploads/<sha 256 username hash>/profile.png /uploads/<sha 256 username hash>/profile.png
-¸¸+</code>
  
  
-{{bazeidatoteke:slika4.png}}+{{  bazeidatoteke:slika4.png  }}
  
-Kako bi se provjerila ova funkcionalnost može se uploadati slika i dohvatiti link slike korištenjem (F12) razvojnih alata internetskog preglednika, ili opcijom kao što je prikazano na slici 5. (desni klik)+Kako bi se provjerila ova funkcionalnost može se uploadati slika i dohvatiti njen link korištenjem razvojnih alata internetskog preglednika (F12), ili opcijom kao što je prikazano na slici 5. (desni klik)
  
-{{bazeidatoteke:slika5.png}}+{{  bazeidatoteke:slika5.png  }}
  
 Adresa slike bi trebala izgledati otprilike ovako: Adresa slike bi trebala izgledati otprilike ovako:
  
-¸¸¸+<code>
 http://chal.platforma.hacknite.hr:13010/uploads/fec11b83d3f57a125...... 78abf4607/profile.png http://chal.platforma.hacknite.hr:13010/uploads/fec11b83d3f57a125...... 78abf4607/profile.png
-¸¸+</code>
  
-Što odgovara prethodno spomenutom formatu+Što odgovara prethodno spomenutom formatu:
  
-¸¸+<code>
 /uploads/<sha 256 username hash>/profile.png /uploads/<sha 256 username hash>/profile.png
-¸¸+</code>
  
 Sada nakon inicijalne analize koda i vidljivih funkcionalnosti u sučelju, potrebno je napraviti detaljniju analizu koda. Sada nakon inicijalne analize koda i vidljivih funkcionalnosti u sučelju, potrebno je napraviti detaljniju analizu koda.
-Nakon analize svih datoteka, može se primijetiti da potencijalno ranjiv kod se nalazi u fileu database.php (slika 6.).+Nakon analize svih datoteka, može se primijetiti da se potencijalno ranjiv kod nalazi u datoteci "database.php(slika 6.).
  
  
-{{bazeidatoteke:slika6.png}}+{{  bazeidatoteke:slika6.png  }}
  
 Dio koda ispod komentara Dio koda ispod komentara
-¸¸+<code>
 // Initialize the database // Initialize the database
-¸¸+</code>
  
 Je ranjiv jer u slučaju da je parametar „db“ definiran, bilo u POST ili GET requestu (koristi se $_REQUEST), vrijednost tog parametra će se koristiti kao naziv nove SQLite datoteke baze podataka. Je ranjiv jer u slučaju da je parametar „db“ definiran, bilo u POST ili GET requestu (koristi se $_REQUEST), vrijednost tog parametra će se koristiti kao naziv nove SQLite datoteke baze podataka.
 Pošto nema ograničenja na naziv datoteke, ne samo da se datoteka može definirati s proizvoljnom ekstenzijom, nego se može mijenjati i path datoteke gdje će biti stvorena, korištenjem slasheva. (npr. ../../../baza…) Pošto nema ograničenja na naziv datoteke, ne samo da se datoteka može definirati s proizvoljnom ekstenzijom, nego se može mijenjati i path datoteke gdje će biti stvorena, korištenjem slasheva. (npr. ../../../baza…)
  
-Sad bi sljedeći logičan korak bio pokušati stvoriti datoteke na različitim putanjama i pokušati dohvatiti te stvorene datoteke, no to neće raditi. Analizom Dockerfilea mogu se pronaći razlozi zašto ovaj postupak ne bi radio.+Sad bi napadačev logični korak bio pokušati stvoriti datoteke na različitim putanjama i pokušati dohvatiti te stvorene datoteke, no to neće uspjeti. Analizom Dockerfilea mogu se pronaći razlozi zašto ovaj postupak ne bi radio.
  
-{{bazeidatoteke:slika7.png}}+{{  bazeidatoteke:slika7.png  }}
  
-Root projekta se nalazi u „/var/www/html“ i samo datoteke iz tog direktorija mogu biti dohvaćene sa servera putem interneta, predviđenim načinom korištenja. Čak i da je taj uvjet zadovoljen, može se primijetiti da korisnik www-data, pod kojim se izvršava server, nema write dopuštenje nad /var/www/html, pa ne bi ni mogao stvoriti ikakvu datoteku na proizvoljnoj putanji. Može se vidjeti da korisnik www-data ima write dozvolu samo nad /var/www/html/uploads lokacijom, koja se izvana mapira na samo /uploads putanju.+Root direktorij projekta se nalazi u „/var/www/html“ i samo datoteke iz i ispod tog direktorija mogu biti dohvaćene sa servera putem interneta, predviđenim načinom korištenja. Čak i da je taj uvjet zadovoljen, može se primijetiti da korisnik www-data, s čijim identitetom kojim se izvodi serverski program, nema dopuštenje pisanja (engl. Write) nad /var/www/html direktorijem, pa ne bi ni mogao stvoriti ikakvu datoteku na proizvoljnoj putanji. Može se vidjeti da korisnik www-data ima write dozvolu samo nad /var/www/html/uploads lokacijom, koja se izvana mapira na samo /uploads putanju.
  
-Uzevši ova ograničenja u obzir sljedeći logičan korak bi bio pokušati stvoriti datoteke na putanji /uploads/.. , ali niti ovo neće raditi. U Dockerfileu linija 11 naznačuje ovo drugo ograničenje. Da bi se njega shvatilo, treba pogledati .htaccess, slika 8.+Uzevši ova ograničenja u obzirsljedeći logičan korak napadača bi bio pokušati stvoriti datoteke na putanji /uploads/.. , ali ni to neće uspjeti. U Dockerfileu linija 11 naznačuje još jedno ograničenje. Da bi se njega shvatilo, treba pogledati .htaccess, slika 8.
  
-{{bazeidatoteke:slika8.png}}+{{  bazeidatoteke:slika8.png  }}
  
-U ove tri linije koda je napisano da pri dohvaćanju svih datoteka koje završavaju ekstenzijom .php i nalaze se u direktoriju /uploads/, se neće poslati nazad, nego će biti zabranjeneRegularni izraz (regex) koji specificira format i lokaciju zabranjenih datoteka, se ne primjenjuje ako je između direktorija „uploads“ i ekstenzije datoteke .php znak „/“. Ovo znači da pravilo neće vrijediti za datoteke koje se nalaze u nekim poddirektorijima direktorija „uploads“, gdje je unutar putanje više od jednog znaka „/“, nego će te datoteke moći biti uspješno dohvaćene. +U ove tri linije koda je napisano da pokušaj dohvaćanja svih datoteka koje završavaju ekstenzijom ".phpi nalaze se u direktoriju /uploads/, njihov sadržaj neće biti poslan, nego će pristup njima biti zabranjenNO, treba uočiti da, regularni izraz (regex) koji specificira format i lokaciju zabranjenih datoteka, se ne primjenjuje ako je između direktorija „uploads“ i ekstenzije datoteke ".phpznak „/“. Ovo znači da pravilo neće vrijediti za datoteke koje se nalaze u nekim poddirektorijima direktorija „uploads“, gdje je unutar putanje više od jednog znaka „/“, nego će te datoteke moći biti uspješno dohvaćene. 
    
-Ovo znači da će na primjer datoteka+Ovo znači da će na primjer pristup datoteci
 ‚‚ ‚‚
 /uploads/baza.php /uploads/baza.php
 ‚‚ ‚‚
-Biti označena ovim pravilom kao zabranjena, dok bi datoteka+ovim pravilom biti zabranjen, dok bi datoteci
 ‚‚ ‚‚
 /uploads/user1/baza.php /uploads/user1/baza.php
 ‚‚ ‚‚
-Bila dozvoljena, pravilo se ne bi primjenjivalo na nju.+bio dozvoljentj. pravilo se ne bi primjenjivalo na nju.
  
  
-Uzevši i ovo ograničenje u obzir, ideja može biti stvoriti datoteku u nekom poddirektoriju direktorija „/uploads/“, ali ovdje se javlja problem da ako direktorij u kojemu se datoteka želi postaviti ne postoji već, on neće biti automatski napravljen, nego će biti bačena greška i datoteka neće biti zapisana.+Uzevši i ovo ograničenje u obzir, sljedeća ideja može biti stvoriti datoteku u nekom poddirektoriju direktorija „/uploads/“, ali ovdje se javlja problem da ako direktorij u kojemu se datoteka želi postaviti već ne postoji, on neće biti automatski napravljen, nego će korisniku (napadaču) biti javljena pogreška i datoteka neće biti zapisana.
  
-Način kako bi se zapisala baza podataka s proizvoljnim imenom na lokaciju u sustavu u kojoj nije originalno predviđena, je da se zapiše u neki već postojeći poddirektorij putanje „/var/www/html/uploads“.+Način kako bi se zapisala baza podataka s proizvoljnim imenom na lokaciju u sustavu u kojoj nije izvorno predviđena, je da se zapiše u neki već postojeći poddirektorij putanje „/var/www/html/uploads“.
  
-Srećom, jedna takva putanja je već poznata od ranije, to je putanja u kojoj se uploada postavljena profilna slika, koja je u formatu: +Srećom za napadača, jedna takva putanja je već poznata od ranije. To je putanja u kojoj se uploada postavljena profilna slika, koja je u formatu: 
-¸¸+<code>
 /uploads/<sha 256 username hash>/profile.png /uploads/<sha 256 username hash>/profile.png
-¸¸+</code>
 Ova putanja zadovoljava sva prethodno navedena ograničenja. Ova putanja zadovoljava sva prethodno navedena ograničenja.
  
-Znači datoteka bi se mogla uspješno zapisati na putanju, s koje bi se mogla i dohvatiti: +Znači da bi se datoteka mogla uspješno zapisati na tu putanju, nje bi se mogla i dohvatiti: 
-¸¸+<code>
 /uploads/<sha 256 username hash>/baza.php /uploads/<sha 256 username hash>/baza.php
-¸¸ +</code> 
-Pošto je poznato da ova putanja postoji, jer je u njoj profile.png slika pohranjena.+jer je poznato da ova putanja postoji, jer je u njoj pohranjena slika "profile.png".
  
-Sada je poznata tehnika kako stvoriti datoteku s proizvoljnim imenom i ekstenzijom, npr .php, unutar putanje na serveru s koje se datoteka može vidjeti i dohvatiti. Preostalo je pitanje kako iskoristiti tu datoteku da bi se nešto postiglo. +Sada je poznata tehnika kako stvoriti datoteku s proizvoljnim imenom i ekstenzijom, npr ".php", unutar putanje na serveru s koje se datoteka može vidjeti i dohvatiti. Preostalo je pitanje kako iskoristiti tu datoteku da bi se nešto postiglo. 
-Ako je ekstenzija datoteke „.php“, PHP kod unutar datoteke će biti procesuiran i obrađen pri postupku dohvaćanja“ zatražene datoteke prije slanja odgovora na zahtjev. Znači da ako se stvori datoteka s „.php“ ekstenzijom i PHP kodom u sebi, koja može biti dohvaćena, pri postupku dohvaćanja prije nego što je vraćena, PHP kod će biti izvršen i rezultati izvršavanja će biti zapisani u datoteci.+Ako je ekstenzija datoteke „.php“, PHP kod unutar datoteke će biti obrađen i izveden pri postupku dohvaćanja zatražene datoteke prije slanja odgovora na zahtjev. Znači daako se stvori datoteka s „.php“ ekstenzijom i PHP kodom u sebi, koja može biti dohvaćena, pri postupku dohvaćanja prije nego što je vraćena, PHP kod će biti izvršen i rezultati izvršavanja će biti zapisani u datoteci.
  
 Ostalo je još samo pitanje kako zapisati PHP kod unutar SQLite datoteke s proizvoljnim imenom, na takav način da se PHP kod uspješno izvrši pri dohvaćanju. Unutar baze podataka s proizvoljnim imenom nad kojim imamo kontrolu se zapisuje korisničko ime i password stvorenog korisnika. Ovaj kod se može vidjeti unutar datoteke register.php (slika 9.) Ostalo je još samo pitanje kako zapisati PHP kod unutar SQLite datoteke s proizvoljnim imenom, na takav način da se PHP kod uspješno izvrši pri dohvaćanju. Unutar baze podataka s proizvoljnim imenom nad kojim imamo kontrolu se zapisuje korisničko ime i password stvorenog korisnika. Ovaj kod se može vidjeti unutar datoteke register.php (slika 9.)
  
-{{bazeidatoteke:slika9.png}}+{{  bazeidatoteke:slika9.png  }}
  
 Na username nema ograničenja osim da mora biti duže od 10 znakova i taj username će biti zapisan unutar baze podataka nad čijim imenom i lokacijom imamo kontrolu. (slika 9., slika 10. označeno crveno) Na username nema ograničenja osim da mora biti duže od 10 znakova i taj username će biti zapisan unutar baze podataka nad čijim imenom i lokacijom imamo kontrolu. (slika 9., slika 10. označeno crveno)
Line 112: Line 116:
  
  
-{{bazeidatoteke:slika10.png}}+{{  bazeidatoteke:slika10.png  }}
  
-Ovo znači da se može stvoriti baza podataka s „.php“ ekstenzijom i s PHP kodom unutar podataka, koji bi bio u plaintext formatu, pošto je username korisnika. Pri dohvaćanju ove baze podataka, što je također moguće odgovarajućim pozicioniranjem baze, PHP kod će se izvršavati, a mi ćemo moći definirati PHP kod koji će se izvršiti. Najjednostavniji kod koji se ovdje može postaviti je +Ovo znači da se može stvoriti baza podataka s „.php“ ekstenzijom i s PHP kodom unutar podataka, koji bi bio u plaintext formatu, pošto se username korisnika zapisuje u plaintextu. Pri dohvaćanju ove baze podataka, što je također moguće odgovarajućim pozicioniranjem baze, PHP kod će se izvršavati, a mi ćemo moći definirati PHP kod koji će se izvršiti. Najjednostavniji kod koji se ovdje može postaviti je
 ‚‚ ‚‚
 <?php system($_GET['cmd']); ?> <?php system($_GET['cmd']); ?>
Line 125: Line 129:
 ./uploads/<sha 256 hash usernamea prvog korisnika>/shell.php ./uploads/<sha 256 hash usernamea prvog korisnika>/shell.php
 ‚‚ ‚‚
-A korisničko ime koje bi se unijelo pri registraciji bi bilo+A korisničko ime koje bi se unijelo pri registraciji bi bilo:
 ‚‚ ‚‚
 <?php system($_GET['cmd']); ?> <?php system($_GET['cmd']); ?>
 ‚‚ ‚‚
  
-Nakon ove prijave, PHP shell bi se mogao koristiti na prethodno definiranoj putanji, a s „cmd“ GET parametrom se mogu definirati shell naredbe. Npr pokretanje „ls“ naredbe.+Nakon ove prijave, PHP shell bi se mogao koristiti na prethodno definiranoj putanji, a s „cmd“ GET parametrom se mogu definirati shell naredbe. Nprpokretanje naredbe „ls“.
 ‚‚ ‚‚
 ./uploads/<sha 256 hash usernamea prvog korisnika>/shell.php?cmd=ls ./uploads/<sha 256 hash usernamea prvog korisnika>/shell.php?cmd=ls
Line 136: Line 140:
  
  
-Preporučen alat za ostvarivanje ovog postupka je burpsuite. Nakon što je prvi korisnik normalno stvoren i zabilježena je putanja njegove profilne slike kako bi se koristila u daljnjem postupku, može se upaliti burpsuite proxy preko kojega će se urediti zahtjev za registraciju. +Preporučen alat za ostvarivanje ovog postupka je burpsuite. Nakon što je prvi korisnik normalno stvoren i zabilježena je putanja njegove profilne slike kako bi se koristila u daljnjem postupku, može se pokrenuti burpsuite proxy preko kojega će se urediti zahtjev za registraciju. 
-Nakon unosa PHP koda u polje korisničkog imena na registraciji i nevažnog passworda, kao što je prikazano na slici 11.+Nakon unosa PHP koda u polje korisničkog imena na registraciji i proizvoljnog/nevažnog passworda, kao što je prikazano na slici 11.
  
-{{bazeidatoteke:slika11.png}}+{{  bazeidatoteke:slika11.png  }}
  
-Zahtjev se šalje pritiskom na gumb register, dok je istovremeno burp proxy upaljen, kako bi POST request presreo uredio tako da mu se doda odgovarajući parametar „db“ kao što je prikazano na slici 12.+Zahtjev se šalje pritiskom na gumb "Register", dok je istovremeno burp proxy upaljen, kako bi on presreto POST request i preuredio ga tako da mu se doda odgovarajući parametar „db“ kao što je prikazano na slici 12.
  
-{{bazeidatoteke:slika12.png}}+{{  bazeidatoteke:slika12.png  }}
  
-Kada je db parametar odgovarajuće definiran kao što je prethodno opisano, zahtjev se može proslijediti. Ako je tehnika uspješno izvršena, trebao bi biti vraćen odgovor s porukom o uspješnoj registraciji kao što je prikazano na slici 13.+Kada je db parametar odgovarajuće definiran, na prethodno opisan način, zahtjev se može proslijediti. Ako je tehnika uspješno izvršena, trebao bi biti vraćen odgovor s porukom o uspješnoj registraciji kao što je prikazano na slici 13.
  
-{{bazeidatoteke:slika13.png}}+{{  bazeidatoteke:slika13.png  }}
  
-Nakon ovoga, web shellu se može jednostavno pristupiti korištenjem putanje koja je bile definirana u „db“ parametru POST requesta registracije.+Nakon ovoga, pristup web shellu je jednostavan, korištenjem putanje koja je bila definirana u „db“ parametru POST requesta registracije.
 U Dockerfileu se vidi lokacija flaga, tako da je za rješenje zadatka samo potrebno dohvatiti taj flag pristupom spomenutoj putanji s odgovarajućom shell naredbom zadanom u GET parametru: U Dockerfileu se vidi lokacija flaga, tako da je za rješenje zadatka samo potrebno dohvatiti taj flag pristupom spomenutoj putanji s odgovarajućom shell naredbom zadanom u GET parametru:
  
Line 167: Line 171:
  
  
-{{bazeidatoteke:slika14.png}}+{{  bazeidatoteke:slika14.png  }}
baze_i_datoteke.1739190364.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki