HTTP
HTTP (HyperText Transfer Protocol) — это протокол прикладного уровня, который используется для передачи данных между клиентом (например, браузером) и сервером. Он является основой взаимодействия в веб-приложениях и позволяет запрашивать ресурсы (HTML-страницы, изображения, файлы) и отправлять данные на сервер (например, через формы).
HTTP лежит в основе работы современных веб-приложений, и понимание его работы критически важно для анализа угроз и инцидентов, связанных с веб-атаками.
URI и URL
URI (Uniform Resource Identifier) — это общий термин, который обозначает идентификатор ресурса. URI может быть как адресом (URL), так и именем (URN).
URL (Uniform Resource Locator) — это подмножество URI, которое указывает не только на ресурс, но и на его местоположение в сети (адрес). URL используется для доступа к ресурсам через протоколы, такие как HTTP, HTTPS, FTP и др.
URL — это частный случай URI, который всегда указывает на местоположение ресурса. Его структура повторяет структуру URI, но с акцентом на адресацию:
Пример URL:
Схема:
https
илиhttp
для веб-ресурсовХост:
example.com
Порт:
8080
Путь:
/page
Указывает на конкретный ресурс на сервере. Например:/page
,/images/photo.jpg
.Запрос:
?param1=value1¶m2=value2
Содержит параметры, передаваемые на сервер. Начинается с символа?
и состоит из пар ключ-значение, разделенных&
.Фрагмент:
#section1
Указывает на конкретную часть ресурса (например, на раздел страницы). Начинается с символа#
.
Понимание структуры URI/URL помогает анализировать веб-запросы, выявлять подозрительные параметры или пути. Например, атаки типа Path Traversal используют манипуляции с путем (/../../etc/passwd
), а SQL-инъекции — с параметрами запроса (?id=1' OR '1'='1
).
Архитекута веб-приложения
Клиент-серверная архитектура — это модель взаимодействия между двумя основными участниками: клиентом и сервером.
Фронтенд (Frontend):
Это клиентская часть приложения, которая отвечает за взаимодействие с пользователем. Клиент инициирует запросы к серверу. В контексте веб-приложений клиентом обычно выступает браузер (например, Chrome, Firefox) или мобильное приложение.
Роль клиента:
Отправляет HTTP-запросы на сервер.
Получает и отображает данные (например, HTML-страницы).
Выполняет клиентскую логику (например, JavaScript).
Бэкенд (Backend)
это серверная часть приложения, которая обрабатывает запросы, выполняет бизнес-логику и взаимодействует с базой данных. Сервер обрабатывает запросы и возвращает ответы. Сервер отвечает за хранение данных, выполнение бизнес-логики и управление ресурсами.
Роль сервера:
Обрабатывает запросы (например, извлекает данные из базы данных).
Возвращает ответы (например, HTML, JSON).
Управляет аутентификацией, авторизацией и другими серверными процессами.
Технологии:
Языки программирования: Python, Java, PHP, Node.js.
Фреймворки: Django, Spring, Laravel, Express.
Базы данных: MySQL, PostgreSQL, MongoDB. Вообще отдельный компонент, с которым бэкенд взаимодействует.
Дополнительные компоненты
Прокси-серверы: Обрабатывают запросы между клиентом и сервером (например, для кэширования или балансировки нагрузки).
CDN (Content Delivery Network): Распределяет статические ресурсы (например, изображения, CSS) по всему миру для ускорения загрузки.
Микросервисы: Архитектура, при которой приложение разбито на небольшие независимые сервисы.
Пример взаимодействия:
Пользователь вводит URL в браузере (клиент).
Браузер отправляет HTTP-запрос на сервер.
Сервер обрабатывает запрос и возвращает HTML-страницу.
Браузер отображает страницу пользователю.
Атаки на клиентской и серверной стороне различаются по своим целям, методам и последствиям. Понимание этих различий помогает аналитикам SOC эффективно выявлять и предотвращать угрозы.
Атаки на клиентской стороне нацелены на уязвимости в клиентской части приложения (например, в браузере пользователя). Клиентские атаки затрагивают данные пользователя (например, cookies, сессии). Они могут использоваться для распространения вредоносного кода или фишинга.
Примеры атак:
XSS (Cross-Site Scripting): Внедрение вредоносного JavaScript в страницу.
Clickjacking: Обман пользователя для выполнения действий без его ведома.
CSRF (Cross-Site Request Forgery): Подделка запросов от имени пользователя.
Атаки на серверной стороне нацелены на уязвимости в серверной части приложения (например, в базе данных или API). Серверные атаки могут привести к утечке данных, повреждению системы или полному захвату сервера через исполнение произвольного кода. Они часто имеют более серьезные последствия, чем клиентские атаки.
Примеры атак:
SQL-инъекции: Внедрение вредоносного SQL-кода для доступа к базе данных.
Path Traversal: Доступ к файлам на сервере за пределами разрешенных директорий.
RCE (Remote Code Execution): Выполнение произвольного кода на сервере.
HTTP-запросы и ответы — это основа взаимодействия между клиентом (например, браузером) и сервером. Каждый запрос и ответ состоит из нескольких частей, которые передают информацию о том, что запрашивается, как обрабатывается и что возвращается.
HTTP-запрос
основная часть работы аналитика сводится к анализу именно запросов, так как именно с помощью них атакующие пытаются манипулировать данными на сервере.
HTTP-запрос состоит из трех основных частей: стартовая строка, заголовки и тело.
Стартовая строка (Request Line).
Стартовая строка содержит три элемента:
Метод HTTP: Указывает действие, которое нужно выполнить (например, GET, POST).
Путь (Path): Указывает ресурс, к которому обращается клиент (например,
/index.html
).Версия протокола: Версия HTTP (например,
HTTP/1.1
).
Основные HTTP-методы
Эта таблица поможет быстро ориентироваться в основных HTTP-методах, их назначении и потенциальных рисках.
GET
Запрос данных с сервера.
GET /index.html HTTP/1.1
Данные передаются в URL. Не имеет тела запроса.
Уязвимости, связанные с передачей данных в URL (SQL-инъекции, XSS). Подозрительные параметры.
POST
Отправка данных на сервер (например, формы).
POST /login HTTP/1.1
Данные передаются в теле запроса. Используется для создания/изменения ресурсов.
Передача вредоносных данных (SQL-инъекции, XSS). Подозрительные payloads.
PUT
Загрузка или обновление ресурса на сервере.
PUT /files/example.txt HTTP/1.1
Передает данные в теле запроса. Может использоваться для загрузки файлов.
Загрузка вредоносных файлов (шеллов). Перезапись критических файлов.
DELETE
Удаление ресурса на сервере.
DELETE /files/example.txt HTTP/1.1
Удаляет указанный ресурс.
Удаление критических файлов или данных.
HEAD
Запрос заголовков ответа без тела.
HEAD /index.html HTTP/1.1
Используется для проверки доступности ресурса.
Разведка (например, проверка существования файлов).
OPTIONS
Запрос поддерживаемых методов для ресурса.
OPTIONS /index.html HTTP/1.1
Возвращает список методов, которые можно использовать для ресурса.
Разведка (определение уязвимых методов).
PATCH
Частичное обновление ресурса.
PATCH /users/123 HTTP/1.1
Обновляет только указанные поля ресурса.
Изменение критических данных (например, прав доступа).
Некоторые HTTP-методы могут быть подозрительными, особенно если они используются не по назначению или в неожиданных контекстах. Разрешайте только те методы, которые необходимы для работы приложения (например, GET, POST).
Атакующие могут пытаться отправлять даже несуществующие методы, чтобы проверить, как отреагирует приложение. Либо для обхода защиты.
Заголовки (Headers).
Заголовки содержат метаданные о запросе. Они передают дополнительную информацию, такую как тип данных, кодировка, cookies и другие параметры. Заголовки состоят из пар ключ-значение.
Основные заголовки
Заголовки HTTP-запроса
Host
Указывает доменное имя и порт сервера. Единственный обязательный запрос.
Host: example.com
User-Agent
Содержит информацию о клиенте (браузере, ОС).
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept
Указывает типы данных, которые клиент может принять.
Accept: text/html, application/json
Accept-Language
Указывает предпочитаемые языки.
Accept-Language: en-US, en;q=0.9
Cookie
Передает cookies, связанные с доменом.
Cookie: session_id=12345
Content-Type
Указывает тип данных в теле запроса.
Content-Type: application/json
Content-Length
Указывает размер тела запроса в байтах.
Content-Length: 1234
Cache-Control
Управляет кэшированием запроса.
Cache-Control: no-cache
Referer
Указывает URL, с которого был сделан запрос.
Referer: https://example.com/previous-page
Authorization
Используется для передачи данных аутентификации (например, токенов).
Authorization: Bearer <token>
X-Forwarded-For
Указывает IP-адрес клиента, если запрос проходит через прокси.
X-Forwarded-For: 192.168.1.1
Origin
Указывает источник запроса (используется в CORS).
Origin: https://example.com
Accept-Encoding
Указывает поддерживаемые методы сжатия данных.
Accept-Encoding: gzip, deflate
Connection
Управляет состоянием соединения (например, keep-alive).
Connection: keep-alive
Эта таблица поможет быстро ориентироваться в основных HTTP-заголовках и их назначении.
User-Agent (UA)
Из стандартных заголовков интересс представляет User-Agent, он помогает распознать ботов и инструменты для сканрования или фазинга сайта. User-Agent можно всегда можно подменить, но не все это делают.
Пример обычных браузеров - по ним можно понять какую ОС и браузео использует пользователь
Известыне боты. Они бывают хорошие, например, от Yandex или Google, которые индексируют ваш сайт
Некоторые инструменты явно в UA себя идентифицируют
А некоторые могут маскироваться, например, под хороших ботов или браузеры.
(Отсутствие Mozilla/5.0
или неверный IP-адрес. Google публикует список своих IP - хотя это и довольно сложно учитывать в правилах обнаружения)
А еще могут быть неизветсные User-Agent от самописных инструментов
Уязвимости, связанные с заголовками
Если сервер не понимает заголовок, он, скорее всего, проигнорирует его или залогирует. Однако неправильная обработка заголовков может привести к уязвимостям, таким как CRLF Injection или Log4j. Аналитикам SOC важно отслеживать подозрительные заголовки и настраивать системы безопасности для их блокировки.
Shellshock (CVE-2014-6271)
Уязвимость в Bash, которая позволяла выполнить произвольный код через переменные окружения, передаваемые в HTTP-заголовках.
Как эксплуатировалась: Злоумышленник отправлял запрос с вредоносным заголовком, например:
Copy
Сервер, использующий Bash для обработки запросов, выполнял команду.
Последствия:
Выполнение произвольного кода на сервере.
CRLF Injection
Уязвимость, возникающая при неправильной обработке символов перевода строки (CRLF) в заголовках.
Как эксплуатировалась: Злоумышленник вставлял CRLF в заголовок, чтобы добавить новые заголовки или изменить тело ответа. Пример:
Copy
Последствия:
Подмена ответа сервера.
XSS (если CRLF используется для добавления JavaScript).
Log4Shell (CVE-2021-44228)
Это уязвимость, которая не связана напрямую с HTTP-заголовками, но может быть эксплуатирована через них. Уязвимость возникает из-за возможности выполнения произвольного кода через механизм JNDI (Java Naming and Directory Interface). Если злоумышленник может передать вредоносную строку в лог (например, через HTTP-заголовок, параметр запроса или тело запроса), приложение, использующее уязвимую версию Log4j, выполнит этот код.
Злоумышленник отправляет запрос с вредоносной строкой в одном из заголовков.
Приложение логирует этот заголовок.
Log4j обрабатывает строку и выполняет JNDI-запрос к удаленному серверу злоумышленника.
Злоумышленник получает возможность выполнить произвольный код на сервере.
Хотя уязвимость Log4j не связана напрямую с заголовками, злоумышленники могут использовать HTTP-заголовки для передачи вредоносной строки. Например:
User-Agent: Злоумышленник может отправить запрос с вредоносным User-Agent:
Referer: Вредоносная строка может быть передана через заголовок Referer:
X-Forwarded-For: Если приложение логирует IP-адреса, злоумышленник может использовать этот заголовок:
Тело запроса (Body).
Тело запроса используется для передачи данных на сервер. Оно присутствует не во всех запросах (например, в GET-запросах тело обычно отсутствует). Тело может содержать данные в различных форматах, таких как JSON, XML, файлы и другие.
Пример тела запроса (JSON):
Как и в параметрах, тут соит обращать внимание на паттерны SQL-инъекций, XSS, команд ОС и других. Также атакующие могут загружать целые вредоносные файлы (например, шеллы, трояны).
Обращайте внимание на подозрительные расширения файлов (.php
, .jsp
, .exe
) или двойные расширения (например, image.jpg.php
) в запросах.
HTTP-ответ
HTTP-ответ также состоит из трех основных частей: строка состояния, заголовки и тело ответа.
Строка состояния (Status Line)
Строка состояния содержит три элемента:
Версия протокола: Версия HTTP (например,
HTTP/1.1
).Код состояния (Status Code): Числовой код, указывающий результат обработки запроса (например,
200 OK
).Сообщение состояния (Status Message): Текстовое описание кода состояния (например,
OK
).
HTTP-статусы делятся на пять групп, каждая из которых обозначает определенный тип ответа сервера. Вот краткая таблица с объяснением каждой группы:
1xx
100–199
Информационные
Сервер получил запрос и продолжает его обработку. Клиент должен ждать.
2xx
200–299
Успешные
Запрос успешно обработан.
3xx
300–399
Перенаправления
Запрос требует дополнительных действий (например, перенаправление).
4xx
400–499
Ошибки клиента
Запрос содержит ошибку или не может быть выполнен из-за клиента.
5xx
500–599
Ошибки сервера
Сервер не смог обработать запрос из-за внутренней ошибки.
Коды 4xx могут указывать на попытки атак (например, сканирование, brute force). Частые 404 могут быть признаком сканирования директорий.
Заголовки (Headers)
Заголовки ответа содержат метаданные о ответе. Они передают информацию о сервере, типе данных, cookie и других параметрах.
Обычно заловки ответа формируются на стороне сервера. Поэтому чаще относятся к неправильным или небезопасным настройкам сервера, а не мониторингу в релаьном времени. Например, не настроенная политика CORS или отсуствие флага HttpOnly
для Cookie.
Либо раскрывать версии сервера и ОС или версии приложения.
Тело ответа (Body)
Тело ответа содержит данные, которые сервер возвращает клиенту. Это может быть HTML-страница, JSON-данные, изображение или другой ресурс.
Аналитикам SOC важно уметь выявлять подозрительные паттерны в теле ответа, которые могут указывать на ошибки, утечки данных или успешные атаки:
Ошибки: Часто означают, что уязвимость дкйствительно есть. Атакующему удалось провзаимодействовать с базой данных, файловой системой... Осталось только раскрутить и получить результат.
Утечки данных:
В выводе стоит обращать внимание на фрагменты баз данных или извествестных файлов (например phpinfo.php
или /etc/passwd
).
Они не всегда будут присутствовать при успешной атаке, но их наличие - хороший индикатор.
Успешное выполнение кода:
Обычно, получив возможность исполнять код в системе, первое что делают хакеры, это проверяют свои права и начинают разведку системы. Поэтому в выводе могут присутсвовать характерные выводы whoami
, dir
и других команд.
Last updated