HTTP, czyli co tam w przeglądarce piszczy

Wg badań międzynarodowego instytutu do spraw Internetu w Tallinie, protokół http (Hypertext Transfer Protocol) jest jednym z najczęściej używanych protokołów w Internecie. O ile część związaną z instytutem zmyśliłem, to ta o protokole to najszczersza prawda. Nie inaczej jest w pracy pentestera. W codziennej pracy będziecie spotykać się z tym protokołem. Będziecie go przechwytywać, analizować, modyfikować i puszczać dalej wolno jak ptaszki z wyleczonymi skrzydłami złamanymi przez drapieżne koty. Do rzeczy…
HTTP jest jednym z protokołów TCP/IP, domyślny port, po którym się komunikuje to 80. Dokładną specyfikację tego protokołu znajdziecie w pliku RFC 2616. Komunikacja polega na wysyłaniu Zapytań (Request) i odbieraniu Odpowiedzi (Response). Jest to tzw. Protokół bezstanowy, co oznacza, że w kolejnych Requestach nie ma informacji o poprzednich transakcjach.
Request (show me what you got)
GET /lol.htm?uname=admin&pw=password123456789 HTTP/1.1
Host: 10.0.2.5:9999
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.0.2.14/
Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20
Connection: close
Zacznijmy od początku tzn. od samej gory:
GET /lol.htm?uname=admin&pw=password123456789 HTTP/1.1
GET to metoda (opis poszczególnych metod poniżej), jest ich trochę i warto wiedzieć czym się różnią. Dalej mamy URL, sklejając wartość z nagłówka (header) Host, otrzymujemy to, co widzimy w polu adresu w przeglądarce. Ostatnią rzeczą w tej lini jest HTTP/1.1, czyli określenie z jaką wersją protokołu mamy do czynienia.
Host: 10.0.2.5:9999
Informacja o hoście, czyli adresie serwera, który chcemy odwiedzić w przeglądarce. Może tu się pojawić adres IP (wraz z portem, patrz wyżej) jak również nazwa domenowa (np. www.example.com).
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Tutaj przesyłamy informację jakiego klienta używamy do komunikacji HTTP. Prościej, z jakiej przeglądarki korzystamy, ale nie tylko. Musimy pamiętać, że komunikację HTTP mogą wykorzystywać inne aplikacje niż przeglądarki, np. aplikacje uruchamiane z linii komend.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Accept, Accept, Accept dużo tych Acceptów. Są to informacje przesyłane do serwera, które mówią jakiego rodzaju dane aplikacja preferuje, są tu też informacje o preferowanym języku i sposobie kodowanie znaków.
Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20
Nagłówek przechowujący ciasteczka. Ciasteczka ustawiane są w Responsie serwera nagłówkiem Set-Cookie: Więcej o ciasteczkach dowiecie się w kolejnym artykule.
Referer: http://10.0.2.14/
Referer to ważny nagłówek mówiący o tym skąd nastąpiło to połączenie. Z jakiego adresu wysłano nas na stronę aplikacji.
Connection: close
Tutaj HTTP przesyła informację, że połączenie zostanie zakończone zaraz po tym jak serwer przyśle odpowiedź (Response).
Response (take that)
HTTP/1.1 200 OK
Date: Fri, 22 Feb 2019 20:28:49 GMT
Server: Apache/2.4.18 (Ubuntu)
Set-Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20; path=/
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length: 70811
Connection: close
Content-Type: text/html; charset=utf-8
HTTP/1.1 200 OK
W pierwszej lini mamy kod odpowiedzi HTTP. W tym przykładzie mamy kod 200, co oznacza, że strona poprawnie się załadowała. Zobacz koniec artykułu.
Date: Fri, 22 Feb 2019 20:28:49 GMT
Data i czas odpowiedzi serwera.
Server: Apache/2.4.18 (Ubuntu)
Nagłówek ten przechowuje informację o serwerze WWW, z którego korzysta aplikacja. Z punktu widzenia osoby testującej cenna informacja. Wiemy już jaki jest cel, teraz tylko trzeba dobrać narzędzia. Dodatkowo, można też odczytać/domyślić się jaki jest serwer pod spodem, w przypadku IIS będziemy pewni, że to Windows, w przypadku Apache już niekoniecznie, ale tak czy inaczej informacje o serwerze są cenne.
Set-Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20; path=/
Set-Cookie wprowadza ciasteczka do komunikacji. Jako że HTTP jest protokołem bezstanowym, ciasteczka umożliwiają utrzymanie informacji o działającej sesji. Tutaj też ustawiane są flagi ciasteczek i „zakres działania” (path). Temat ciasteczek i flag będzie poruszany w kolejnym artykule.
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Nagłówek ten mówi przeglądarce, czy strona powinna być zapisywana w cache’u na dysku komputera. Z punktu widzenia security ważne jest, żeby informacje wrażliwe, poufne, takie jak nr kart kredytowych, dane personalne itp. nie były przechowywane lokalnie na dysku użytkownika.
Content-Length: 70811
Informacja o tym, jaki rozmiar ma nasza odpowiedź (Response)
Connection: close
Tutaj response przesyła informację, że już można zakończyć połączenie.
Content-Type: text/html; charset=utf-8
Content-Type określa jakiego typu dane są dostarczane do przeglądarki. W tym przypadku dostajemy text oraz HTML. Zapisana jest tam również informacja o kodowaniu znaków. (charset=utf-8)
Metody
Metody definiują co i w jaki sposób aplikacja będzie przesyłać dane. Mamy cały arsenał do dyspozycji, więc nie przedłużając zapraszam do czytania:
GET – metoda przesyłająca parametry w URL’u
POST – różni się od GET tym, że parametry przesyłane są w body Requestu. Linijkę poniżej nagłówków.
PUT – służy do przesyłania np. plików na serwer.
HEAD – wysyłając request z taką metodą w odpowiedzi otrzymamy tylko nagłówki. Przy okazji tej metody warto sprawdzić jak serwer WWW reaguje na tego typu Request np. Serwer WWW Microsoft’u, IIS odpowie dając informację o wersji, która jest zainstalowana.
DELETE – służy usuwaniu plików z serwera.
TRACE – metoda, która w starszych przeglądarkach może służyć do wykonania ataku Cross-Site-Tracing.
OPTIONS – zwraca jakie metody są dostępne w komunikacji miedzy clientem a serwerem.
HTTP – Rozmowa rekrutacyjna
Często podczas rozmów rekrutacyjnych pada pytanie: Co się dzieje, gdy w przeglądarce wpisujemy adres strony i naciskamy ENTER? Oczywiście można zacząć od poziomu sieci i mówić o tzw. „three way handshake”, ale z punktu widzenia pracy ważne jest to, że wysyłamy Request do serwera i czekamy na Response. Rozwinięciem tego tematu jest pytanie, czym różni się GET od POST. Istnieje parę różnic, które należy wymienić:
- GET przesyła parametry w URL’u, POST w BODY Requestu.
- Parametry z GET’a są widoczne w logach serwera, natomiast te z POST nie są.
- GET nie powinien być wykorzystywany do przesyłania wrażliwych danych. POST jak najbardziej.
Często też podczas rozmów rekrutacyjnych pojawiają się pytania o komunikaty odpowiedzi. Ciekawą odpowiedź na to pytanie zawarła autorka blogu jakosctobedzie.pl LINK
w skrócie: 2xx jest ok, 3xx przekierowania, 4xx coś poszło nie tak, 5xx błędy serwera
Najpopularniejsze odpowiedzi to:
- 200 – poprawne załadowanie strony
- 302 – przekierowanie do innej strony
- 403 – dostęp zabroniony
- 404 – brak strony
- 500 – błąd wewnętrzny serwera
- 503 – usługa niedostępna
Connection: Close
Mam nadzieję, że wyciągniesz z tego artykułu przydatną wiedzę i pozwoli Ci on lepiej zrozumieć to, z czym na co dzień styka się Pentester w swojej pracy. W kolejnych artykułach będę poruszał takie tematy jak HTTPS oraz Ciasteczka oraz narzędzia pomocne przy analizowaniu tych właśnie rzeczy.
-
25 lutego, 2019 o 8:24 am
Maciek, dobry wstęp do HTTP + dobry tip dla początkujących, nawet dla zaawansowanych przydatny 🙂
Oby tak dalej. -
25 lutego, 2019 o 8:26 pm
Dzięki, starałem się żeby nie przytłaczał technikaliami ale żeby wprowadzał rzeczy na któ®e warto spojrzeć od strony security.
-
26 lutego, 2019 o 1:56 pm
Ciekawy artykuł. Przydatny pod kątem odświeżenia podstaw w zakresie HTML.
Idę zaparzyć herbatę i czekam na ciasteczka 🙂 -
27 lutego, 2019 o 4:44 pm
cześć, dzięki za komentarz. O HTML też co nieco będzie 🙂 a artykuł o Ciasteczkach się tworzy. poinformuje na pewno! Pozdrawiam
-
27 lutego, 2019 o 10:58 am
Super! Czekam na kolejne artykuły. Właśnie zaczynam przygodę z testowaniem i myślę, żeby pójść w kierunku pentestów. Można powiedzieć, że z nieba mi spadłeś 😀 A jako czepliwe babsko muszę zwrócić uwagę na masę błędów w tekście, które aż proszą się o korektę – głównie literówki. Zakładki też mogłyby być widoczne po wejściu w każdą z nich, tak żeby nie trzeba było cofać się. Ale to tylko kosmetyka 🙂 Kiedy kursy/szkolenia?? I gdzie?
-
27 lutego, 2019 o 4:48 pm
Cześć, dzięki za komentarz. Widać że jesteś idealną kandydatką do pentestowania/testowania, wyłapywanie błędów masz na najwyższym poziomie. Przepraszam za nie, za bardzo przesadziłem chyba z „Done is better than perfect” Poprawie. Co do Layout’u to tez pewnie bede zmieniał ale najpierw treści. Kurs (online z mentoringiem) będzie w przyszłości, poinformuje mailem o tym, dzięki za zainteresowanie. Pozdrawiam

Dodaj komentarz