HTTP

HTTP (Hypertext transfer protocol) služi za prijenos resursa različitih formata (tzv. hypermedia). Web preglednici (engl. browsers) koriste ga za komunikaciju s web sjedištima (engl. websites). Protokol prati tradicionalni model klijent-poslužitelj. Klijent otvara konekciju da bi se povezao s poslužiteljem, zatim čeka potvrdu poslužitelja da je primio zahtjev i tek tada kreće njihova komunikacija. Klijent i poslužitelj komuniciraju preko zahtjeva. HTTP zahtjev (eng. request) je poruka koju web preglednik (klijent) šalje nekom poslužitelju kako bi dohvatio sadržaj potreban za učitavanje i prikaz određene stranice. Poruke HTTP protokola imaju dobro definiranu i standardiziranu formu. HTTP je protokol bez očuvanja stanja (eng. stateless protocol), što znači da poslužitelj ne čuva stanje i ne pamti podatke između dviju konverzacija s istim klijentom.

Važniji dijelovi HTTP zahtjeva su: HTTP verzija, HTTP metoda, zaglavlje (eng. header), tijelo zahtjeva i URL resursa (slike, teksta, web forme i slično) kojemu se želi pristupiti.

HTTP metode

Unutar svakog HTTP zahtjeva koristi se neka HTTP metoda kojom je definirano koju akciju treba izvesti nad određenim resursom. Najvažnije i najčešće korištene metode su GET, POST, PUT, DELETE i HEAD.

GET metodom dohvaća se sadržaj željenog resursa (npr. GET /index.html). U pravilu se GET metodom isključivo dohvaćaju podatci, a za slanje se koriste druge metode. Svi traženi podatci nalaze se u tijelu odgovora poslužitelja.

POST metoda služi za izmjenu i slanje podataka poslužitelju. U pravilu tip podataka koji se šalju mora biti unaprijed definiran u zaglavlju da bi ih preglednik znao ispravno interpretirati. Važno je da informacije u tijelu semantički odgovaraju resursu koji treba stvoriti ili promijeniti. Primjerice, ako u bazu želimo pohraniti ime, prezime i ID, tijelo zahtjeva može izgledati ovako: ime=ivica&prezime=ivić&ID=27. Ukratko, važno je da su u zahtjevu sadržane sve potrebne informacije da bi se podatak uspješno poslao poslužitelju. U svakodnevnom korištenju to nije problem za korisnika jer se podatci većinom šalju preko obrasca koji automatski generira zahtjev u formatu koji poslužitelj razumije i ne dopušta slanje podataka prije nego što sva potrebna polja budu ispravno popunjena.

PUT metodom se zahtijeva izmjena ili stvaranje određenog resursa. Za razliku od POST metode, PUT je idempotentan. To znači da je svejedno jesmo li neki PUT zahtjev poslali jednom ili više puta zaredom. U slučaju slanja podataka, samo će prvi PUT zahtjev poslati podatak, a ostali će se ignorirati. S druge strane, POST će svakim ponovljenim zahtjevom iznova slati isti podatak.

DELETE metodom zahtijeva se brisanje određenog resursa na poslužitelju.

HEAD metoda dohvaća samo zaglavlja (eng. headers) odgovora u kojima su sadržani metapodatci o resursu, npr. veličina resursa i dostupnost resursa na poslužitelju. Ova metoda koristi se kada želimo dohvatiti i provjeriti određene podatke bez da pritom dohvaćamo cijeli resurs. Zaglavlja odgovora su ista kao što bi bila u slučaju da se koristi GET metoda, ali HTTP odgovor ne sadrži tijelo.

PRIMJER - Demonstracija HTTP metoda alatom curl
Na terminalu na Linuxu ili iz Command prompta na Windowsu pokrećemo redom:

curl --head https://platforma.hacknite.hr/

Ova naredba dohvaća samo zaglavlja HTTP odgovora s navedene stranice.

Rezultat izvršavanja metode HEAD s pomoću curla

curl https://platforma.hacknite.hr 

Ova naredba dohvaća cijelu navedenu stranicu. Za izvršavanje GET metode nisu potrebne nikakve opcije jer curl standardno koristi GET metodu. U rezultatu primjećujemo da se dohvatio HTML tražene web stranice (prikazan je samo dio rezultata).

Rezultat izvršavanja metode GET s pomoću curla

PRIMJER - Zadatak s Hacknite platforme - e-Trgovina “Union”

Lokalna trgovina je odlučila napraviti svoju web stranicu na kojoj kupci mogu pratiti svoju povijest
kupovine. Korisnici se mogu sami registrirati na tu stranicu, i pri svakoj fizičkoj kupnji u trgovini 
mogu dati svoje korisničko ime kako bi se njihova povijest kupovine unijela u bazu podatka. Stranica bi
mogla biti korisna svim sadašnjim i budućim kupcima trgovine!

Flag je u formatu CTF2021[brojevi]

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

Na poveznici se nalazi početna stranica. Odaberimo stranicu za registraciju. Registrirati se možemo uobičajeno preko obrasca, ali i s pomoću curla. Dohvatimo prvo sadržaj stranice da bismo otkrili imena parametara koji se šalju poslužitelju. Upišimo u terminal naredbu za dohvat stranice za registraciju:

curl http://chal.platforma.hacknite.hr:10010/registration.php

Pronađimo dio koda koji definira obrazac:

Vidimo da se traženi parametri zovu username i password. Također, vidimo da je metoda kojom se šalju podatci POST, što je i uobičajeno. Sad možemo poslati podatke koristeći curl. Potrebno je dodati -X opciju da bi se podrazumijevana metoda GET promijenila u POST. Zastavicom -d se unose vrijednosti koje se šalju na server u POST zahtjevu. Za razdvajanje parametara koristi se znak &.

curl -X POST -d "username=MarkoMarkic&password=JakaLozinka123!!" http://chal.platforma.hacknite.hr:10010/registration.php

Izvršavanjem ove naredbe od stranice se dobiva HTML odgovor na kojem se vidi potvrda da je registracija uspješno obavljena.

Uspjeh!

Sada se podatci korišteni u curl naredbi mogu iskoristiti za prijavu na stranici.

Primijetimo da ako upišemo podatak koji nije validan (prekratka lozinka), odgovor će dojaviti grešku:

HTTP zaglavlja

HTTP zaglavlja (eng. headers) sadržavaju dodatne informacije i metapodatke HTTP zahtjeva i odgovora. Jedno HTTP zaglavlje sastoji se od imena zaglavlja, dvotočke i vrijednosti zaglavlja, npr. Connection: keep-alive. Postoje standardizirana zaglavlja koja su prisutna u gotovo svim HTTP zahtjevima i odgovorima. Mogu se koristiti i proizvoljna zaglavlja specifična za neku web aplikaciju.
Zaglavljima zahtjeva mogu se poslati dodatne informacije uz zahtjev kako bi server prikladno odgovorio, kao što su željeni format odgovora (npr. JSON) ili dodatne informacije o klijentu koji stvara zahtjev (User-agent zaglavlje). U zaglavljima zahtjeva mogu se nalaziti i autentifikacijski kolačići ili tokeni s pomoću kojih poslužitelj provjerava ima li klijent pravo pristupa resursu.
Zaglavlja odgovora sadržavaju dodatne informacije o odgovoru, primjerice je li odgovor dohvaćen iz predmemorije (engl. cache) ili koji software koristi poslužitelj s kojeg je poslan odgovor.

Neki tipovi zaglavlja:

HTTP kolačići

HTTP kolačići (eng. cookies) uglavnom su mali zapisi informacija koje web poslužitelj šalje klijentu. Kolačić se stvara na web poslužitelju, interakcija slanja i prihvaćanja kolačića se odvija s pomoću web preglednika, a pohranjuju se na klijentskom računalu.

Jedna od glavnih primjena HTTP kolačića je autentifikacija. Nakon što se korisnik autentificira na web sjedište, poslužitelj pošalje autentifikacijski kolačić pregledniku. Taj autentifikacijski kolačić se u pravilu šalje u svakom narednom HTTP zahtjevu dok se korisnik ne odjavi, što omogućava poslužitelju da provjeri koji korisnik je napravio zahtjev bez da korisnik mora uvijek iznova napraviti zahtjev.

PRIMJER Zadatak s Hacknite platforme - Admin naručivanje

Eko trgovina je uključila mogućnost naručivanja proizvoda preko svoje stranice. Svi posjetitelji mogu 
bez ikakvog problema naručiti bilo koji proizvod kojeg trgovina nudi. Naravno, vjerni korisnici imaju 
mogućnost i naprednog naručivanja. No potrebno je prijaviti se. Na prvi pogled, stranica nema forme za prijavu.

Flag je u formatu CTF2022[brojevi]
http://chal.platforma.hacknite.hr:7001 

Odlaskom na stranicu zadatka i odabirom stranice za naručivanje u izborniku vidi se sljedeća poruka:

Otvaranjem zadatka u Firefox browseru koji koristi Burp suiteov proxy i uključivanjem presretanja zahtjeva možemo presresti HTTPS komunikaciju sa stranice zadatka. Odlaskom na stranicu označenom „Naručivanje” u izborniku, u Burp suiteu se vidi presretnuti zahtjev:

Može se vidjeti kolačić s nazivom „napredno” i vrijednošću „0”. Promjenom vrijednosti tog kolačića na 1 i prosljeđivanjem zahtjeva dobiva se rješenje zadatka.

Izvori

[1]https://developer.mozilla.org/en-US/docs/Web/HTTP
[2]https://www.geeksforgeeks.org/http-full-form/
[3]https://medium.com/platform-engineer/evolution-of-http-69cfe6531ba0
[4]https://www.cloudflare.com/learning/performance/what-is-http3/