User Tools

Site Tools


phpmadness

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
phpmadness [2025/10/31 13:36] mbunicphpmadness [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 7: Line 7:
 </file> </file>
  
-Uz zadatak je dan i izvorni kod. \\+Dan je i izvorni kod zadatka. \\
  
 {{ phpmadness:slika1.png?nolink&500 | Slika 1 - Dockerfile}} {{ phpmadness:slika1.png?nolink&500 | Slika 1 - Dockerfile}}
  
-Pregledom **Dockerfilea** zadatka, može se vidjeti da se radi o PHP zadatku, te da se flag kopira u putanju **/flag**, te da flag datoteka dobiva nasumično generiran naziv u formatu+Pregledom **Dockerfilea** zadatka, može se vidjeti da se radi o PHP zadatku, te da se flag kopira u direktorij **/flag**, te da flag datoteka dobiva nasumično generirano ime u formatu:
  
 <code> <code>
Line 17: Line 17:
 </code> </code>
  
-Odlaskom na stranicu zadatka, potrebno je registrirati novi korisnički račun, nakon logina, se prikazuje stranica na kojoj se može pohraniti jedna slika. \\+Odlaskom na stranicu zadatka, potrebno je registrirati novi korisnički račun, nakon logina prikazuje se stranica na kojoj se može pohraniti jedna jedina slika. \\
  
 {{ phpmadness:slika2.png?nolink&500 | Slika 2 - stranica zadatka}} {{ phpmadness:slika2.png?nolink&500 | Slika 2 - stranica zadatka}}
Line 25: Line 25:
 {{ phpmadness:slika3.png?nolink&500 | Slika 3 - poveznica na lokaciju slike}} {{ phpmadness:slika3.png?nolink&500 | Slika 3 - poveznica na lokaciju slike}}
  
-Pregledom koda u datoteci **user.php** može se pronaći kod koji validira da je učitana datoteka zapravo validna slika. \\+Pregledom koda u datoteci **user.php** može se pronaći kod koji validira da je učitana datoteka zapravo slika. \\
  
 {{ phpmadness:slika4.png?nolink&500 | Slika 4 - user.php – validacije učitane slike}} {{ phpmadness:slika4.png?nolink&500 | Slika 4 - user.php – validacije učitane slike}}
  
-Kod se sastoji od tri provjere, prva provjera je samo provjera ekstenzije uploadane datoteke, provjerava se na način da se uzme dio naziva datoteke nakon zadnje točke, npr. **.jpg**, te se provjerava da ta ekstenzija ne počinje znakovima **ph**, što je definirano ovim REGEX pravilom:+Kod se sastoji od tri provjere, prva provjera je samo provjera ekstenzije učitane datoteke, provjerava se tako da se uzme dio naziva datoteke nakon zadnje točke, npr. **.jpg**, te se provjerava da ta ekstenzija ne počinje znakovima **ph**, što je definirano ovim REGEX pravilom:
  
 <code> <code>
Line 35: Line 35:
 </code> </code>
  
-Ovu provjeru je lagano zaobići, tako da se stave dvostruke ekstenzije, npr.+Ovu provjeru lako je zaobići, tako da se stave dvostruke ekstenzije, npr.
  
 <code> <code>
Line 43: Line 43:
 U kojem bi slučaju ova provjera uzela samo **.jpg**, nakon čega sprema datoteku bez provjerene ekstenzije, što bi značilo da bi samo druga ekstenzija, **.php**, ostala. U kojem bi slučaju ova provjera uzela samo **.jpg**, nakon čega sprema datoteku bez provjerene ekstenzije, što bi značilo da bi samo druga ekstenzija, **.php**, ostala.
  
-Druga provjera, provjerava da je mime type poslan u zahtjevu odgovara slici:+Druga provjera, provjerava da MIME tip poslan u zahtjevu odgovara slici:
  
 <code> <code>
Line 64: Line 64:
 Provjerava datoteku na serverskoj strani, čitajući njezin "file signature" ili "magic bytes" i prema njima određuje je li učitana datoteka slika ili nije. Provjerava datoteku na serverskoj strani, čitajući njezin "file signature" ili "magic bytes" i prema njima određuje je li učitana datoteka slika ili nije.
  
-Ova provjera se možisto lagano zaobići, tako da se napravi PHP datoteka s kodom koji se želi izvršiti na serveru, na početku koje se dodaju "magic byteovi" odnosno "file signature" neke slike, npr. .jpg, i u slučaju da bi PHP parser čitao ovu datoteku. On bi samo preskočio ove byteove i nakon toga uspješno pročitao i pokrenuo PHP kod.+I ovu provjeru mogućje jednostavno zaobići, tako da se napravi PHP datoteka s kodom koji se želi izvršiti na serveru, na početku koje se dodaju "magic byteovi" odnosno "file signature" neke slike, npr. .jpg, i u slučaju da bi PHP parser čitao ovu datoteku, on bi ignorirao ove byteove i nakon toga uspješno pročitao i pokrenuo PHP kod.
  
 No postoji problem, čak i da se uploada datoteka s PHP kodom koja zaobilazi sve ove provjere, ona se i dalje ne bi izvršila, zato što će se učitati pod putanjom **/uploads/**, a u **/uploads** direktoriju postoji **.htaccess** file, koji zabranjuje izvršavanje svim PHP datotekama. \\ No postoji problem, čak i da se uploada datoteka s PHP kodom koja zaobilazi sve ove provjere, ona se i dalje ne bi izvršila, zato što će se učitati pod putanjom **/uploads/**, a u **/uploads** direktoriju postoji **.htaccess** file, koji zabranjuje izvršavanje svim PHP datotekama. \\
Line 78: Line 78:
 Što znači da ako je moguće uploadati **.htaccess** file, koji bi također zaobišao provjere da je uploadana datoteka slika, taj učitani **.htaccess** file bi nadjačao (eng. override) roditeljski **.htaccess** file. Time bi bilo moguće definirati vlastita **.htaccess** pravila u direktoriju pojedinog korisnika. Što znači da ako je moguće uploadati **.htaccess** file, koji bi također zaobišao provjere da je uploadana datoteka slika, taj učitani **.htaccess** file bi nadjačao (eng. override) roditeljski **.htaccess** file. Time bi bilo moguće definirati vlastita **.htaccess** pravila u direktoriju pojedinog korisnika.
  
-No problem je da svaki korisnik smije imati samo jednu učitanu datoteku po korisničkoj sesiji, i učitavanjem nove datoteke, stara datoteka se briše i samo nova čuva, što je prikazano na kodu na slici 6. \\+No problem je da svaki korisnik smije imati samo jednu učitanu datoteku po korisničkoj sesiji, i učitavanjem nove datoteke, stara datoteka se briše i samo nova čuva, što je prikazano kodu na slici 6. \\
  
 {{ phpmadness:slika6.png?nolink&500 | Slika 6 - user.php – logika učitavanja datoteke korisnika}} {{ phpmadness:slika6.png?nolink&500 | Slika 6 - user.php – logika učitavanja datoteke korisnika}}
Line 190: Line 190:
 Program se treba kompajlirati i nakon toga se može pokrenuti, prosljeđujući mu username za koji je potrebno naći MD5 hash collision u prvih 6 znakova kao argument. Program se treba kompajlirati i nakon toga se može pokrenuti, prosljeđujući mu username za koji je potrebno naći MD5 hash collision u prvih 6 znakova kao argument.
  
-Primjer para ovakvih korisničkim imena, koji se dobije korištenjem ovog programa je:+Primjer ovakvog para korisničkih imena dobivenog ovim programom je:
  
 <file> <file>
Line 212: Line 212:
 </code> </code>
  
-Sada još ostaje problem kako učitati **.htaccess** datoteku, koja će uspješno proći kroz provjere da je učitana datoteka slika, dok će se i dalje dobro parsirati kao ispravan **.htaccess** file. Pri parsiranju PHP fileova, nepoznati byteovi će se samo preskočiti, te je ovo trivijalan problem kod datoteke s PHP kodom, dok je u slučaju **.htaccess** datoteke, ovo zapravo najteži dio zadatka.+Preostaje problem kako učitati **.htaccess** datoteku, koja će uspješno proći kroz provjere da je učitana datoteka slika, dok će se i dalje dobro parsirati kao ispravan **.htaccess** file. Pri parsiranju PHP fileova, nepoznati byteovi će se samo preskočiti, te je ovo trivijalan problem kod datoteke s PHP kodom, dok je u slučaju **.htaccess** datoteke, ovo zapravo najteži dio zadatka.
  
 .htaccess datoteka koja bi koristila ovaj pristup bi se mogla zvati **.htaccess.jpg**. .htaccess datoteka koja bi koristila ovaj pristup bi se mogla zvati **.htaccess.jpg**.
Line 220: Line 220:
 ==== .wbmp ==== ==== .wbmp ====
  
-Prvo se zasniva na činjenici da se pri parsiranju .htaccess datoteke, null byteovi na početku preskaču bez errora, te se file dalje normalno parsira, dok 4 null byteova na početku datoteke PHP prepoznaje kao file signature .wbmp datoteke, koja je slika, te se tako može napraviti „pseudo-poliglot” datoteka koja PHP-ovu provjeru uvjerava da je .wbmp slika, dok je i dalje .htaccess file koji se može uspješno parsirati. Datoteka može imati sadržaj:+Prvo se zasniva na činjenici da se pri parsiranju .htaccess datoteke, null bajtovi na početku preskaču bez errora, te se file dalje normalno parsira, dok 4 null bajtovi na početku datoteke PHP prepoznaje kao file signature .wbmp datoteke, koja je slika, te se tako može napraviti „pseudo-poliglot” datoteka koja PHP-ovu provjeru uvjerava da je .wbmp slika, dok je i dalje .htaccess file koji se može uspješno parsirati. Datoteka može imati sadržaj:
  
 <file> <file>
-<4 null byteova><new line (\n ili 0a u hex)>+<4 null bajtova><new line (\n ili 0a u hex)>
 <FilesMatch "\.php3$"> <FilesMatch "\.php3$">
 Require all granted Require all granted
Line 239: Line 239:
 </file> </file>
  
-što uvjerava provjeru je li učitana datoteka slika, da je datoteka zapravo **.xbm** datoteka (slika), dok se pri parsiranju datoteke kao .htaccess, ove dvije linije smatraju komentarima i preskaču, pa se parsiranje .htaccess datoteke normalno nastavlja. Primjer sadržaja:+što prolazi provjeru je li učitana datoteka slika, interpretirajući se kao **.xbm** datoteka (slika), dok se pri parsiranju datoteke kao .htaccess, ove dvije linije smatraju komentarima i preskaču, pa se parsiranje .htaccess datoteke normalno nastavlja. Primjer sadržaja:
  
 <file> <file>
Line 280: Line 280:
 </file> </file>
  
-Nakon toga je samo potrebno:+Preostali koraci:
   * s jednim korisnikom učitati prethodno opisanu **.htaccess.jpg** datoteku, \\     * s jednim korisnikom učitati prethodno opisanu **.htaccess.jpg** datoteku, \\  
     {{ phpmadness:slika7.png?nolink&500 | Slika 7 - upload .htaccess.jpg datoteke}}     {{ phpmadness:slika7.png?nolink&500 | Slika 7 - upload .htaccess.jpg datoteke}}
Line 287: Line 287:
     {{ phpmadness:slika8.png?nolink&500 | Slika 8 - upload readFlag.php3.jpg datoteke}}     {{ phpmadness:slika8.png?nolink&500 | Slika 8 - upload readFlag.php3.jpg datoteke}}
  
-  * otići na lokaciju učitane PHP datoteke i posjetiti ju, \\  +  * otići na lokaciju učitane PHP datoteke i posjetiti je, \\  
     {{ phpmadness:slika9.png?nolink&500 | Slika 9 - link na lokaciju}}     {{ phpmadness:slika9.png?nolink&500 | Slika 9 - link na lokaciju}}
  
phpmadness.1761917806.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki