Bug Bounty, Bug Bounty Bootcamp, Bug Hunting

#15 Bug Bounty. Как работает интернет. Часть 3. HTTP-запросы и ответы.

Здравствуйте. дорогие друзья.

После установления соединения браузер и сервер взаимодействуют через протокол передачи гипертекста (HTTP). HTTP — это набор правил, определяющих, как структурировать и интерпретировать интернет-сообщения, а также как веб-клиенты и веб-серверы должны обмениваться информацией.


Когда Ваш браузер хочет взаимодействовать с сервером, он отправляет серверу HTTP-запрос. Существуют разные типы HTTP-запросов, наиболее распространенными являются GET и POST. По соглашению, запросы GET извлекают данные с сервера, а запросы POST передают данные на него. Другие распространенные методы HTTP включают OPTIONS, используемые для запроса разрешенных методов HTTP для данного URL-адреса; PUT — используется для обновления ресурса; и DELETE, используемые для удаления ресурса.
Вот пример запроса GET, который запрашивает у сервера домашнюю страницу www.google.com:


GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: en-US
Accept-Encoding: gzip, deflate
Connection: close


Давайте пройдемся по структуре этого запроса, поскольку в этом цикле статей Вы встретите множество таких запросов. Все HTTP-запросы состоят из строки запроса, заголовков запроса и необязательного тела запроса. Предыдущий пример содержит только строку запроса и заголовки.
Строка запроса — это первая строка HTTP-запроса. Он определяет метод запроса, запрошенный URL-адрес и используемую версию HTTP. Здесь Вы можете видеть, что клиент отправляет запрос HTTP GET на домашнюю страницу www.google.com, используя HTTP версии 1.1.
Остальные строки — это заголовки HTTP-запроса. Они используются для передачи дополнительной информации о запросе на сервер. Это позволяет серверу настраивать результаты, отправляемые клиенту. В предыдущем примере заголовок Host указывает имя хоста запроса. Заголовок User-Agent содержит информацию об операционной системе и версии запрашивающего программного обеспечения, например веб-браузера пользователя. Заголовки Accept, Accept-Language и Accept-Encoding сообщают серверу, в каком формате должны быть ответы. А заголовок Connection сообщает серверу, должно ли сетевое соединение оставаться открытым после ответа сервера.


В запросах Вы можете увидеть несколько других распространенных заголовков. Заголовок Cookie используется для отправки файлов cookie от клиента на сервер. Заголовок Referer указывает адрес предыдущей веб-страницы, которая ссылалась на текущую страницу. А заголовок авторизации содержит учетные данные для аутентификации пользователя на сервере. После того как сервер получит запрос, он попытается его выполнить. Сервер вернет все ресурсы, использованные для создания Вашей веб-страницы, используя ответы HTTP. Ответ HTTP содержит несколько элементов: код состояния HTTP, указывающий, был ли запрос успешным; HTTP-заголовки, которые представляют собой фрагменты информации, которые браузеры и серверы используют для взаимодействия друг с другом по вопросам аутентификации, формата контента и политик безопасности; и тело ответа HTTP или фактический веб-контент, который Вы запросили. Веб-контент может включать HTML-код, таблицы стилей CSS, код JavaScript, изображения и многое другое.
Вот пример HTTP-ответа:

Пример http-ответа

Обратите внимание на сообщение 200 OK в первой строке (1). Это код состояния. Код состояния HTTP в диапазоне 200 указывает на успешный запрос. Код состояния в диапазоне 300 указывает на перенаправление на другую страницу, тогда как диапазон 400 указывает на ошибку со стороны клиента, например запрос на несуществующую страницу. Диапазон 500 означает, что на самом сервере произошла ошибка.


Как охотник за ошибками, Вы всегда должны следить за этими кодами состояния, поскольку они могут многое рассказать Вам о том, как работает сервер. Например, код статуса 403 означает, что ресурс Вам запрещен. Это может означать, что конфиденциальные данные скрыты на странице, к которой Вы можете получить доступ, если сможете обойти контроль доступа.


Следующие несколько строк в ответе, разделенные двоеточием (:), представляют собой заголовки ответа HTTP. Они позволяют серверу передавать дополнительную информацию об ответе клиенту. В этом случае Вы можете видеть, что время ответа было вторник, 31 августа 2021 г., 17:38:14 GMT (2). Заголовок Content-Type указывает тип файла тела ответа. В данном случае Content-Type этой страницы — text/html (3). Версия сервера — Google Web Server (gws) (4), а Content-Length — 190 532 байта (5). Обычно дополнительные заголовки ответа указывают содержание контента: формат, язык и политики безопасности.


В дополнение к этим, Вы можете столкнуться с несколькими другими распространенными заголовками ответов. Заголовок Set-Cookie отправляется сервером клиенту, чтобы установить файл cookie. Заголовок Location указывает URL-адрес, на который следует перенаправить страницу. Заголовок Access-Control-Allow-Origin указывает, какие источники могут получить доступ к содержимому страницы. Content-Security-Policy контролирует происхождение ресурсов, которые браузеру разрешено загружать, а заголовок X-Frame-Options указывает, может ли страница быть загружена внутри iframe. Данные после пустой строки представляют собой тело ответа. Он содержит фактическое содержимое веб-страницы, такое как код HTML и JavaScript. Как только Ваш браузер получит всю информацию, необходимую для создания веб-страницы, он все отобразит за Вас.

На этом все. Всем хорошего дня!

Цикл статей по Bug Bounty.