Server Side уязвимости
В этом конспекте мы рассмотрим с вами основы server side уязвимостей!
Видео-лекция по которой сделан конспект.
🔹 Client-Server Архитектура
Клиент серверная архитектура представляет собой цепочку из клиента (например веб-приложение), который обращается к серверу, а тот в свою очередь обращается к внутренним сервисам, например - базе данных.
Можно немного усложнить эту схему, добавив балансировщики нагрузки.
С архитектурой разобрались - теперь переходим непосредственно к самим уязвимостям!
Server-side уязвимости представляют собой слабости и недостатки, которые злоумышленники могут эксплуатировать на стороне веб-сервера.
Какие риски могут возникнуть при server-side уязвимостях?
-
Доступ к данным (персональные данные пользователей, исходные коды приложения)
-
Отказ в обслуживании (DoS, DDoS)
-
Повышение привилегий
-
Исполнение кода на сервере
-
Полная компрометация
🔹 Path Traversal
А теперь переходим к самим уязвимостям! И первая на очереди это path traversal.
Path Traversal - это тип атаки, при которой злоумышленник пытается получить доступ к файлам и каталогам, к которым он не имеет разрешения, путем манипуляции пути файла.
Как происходит?
- Вставляем ../
- Обходим фильтры, если фильтрует 1 пункт
Или
Еще пример path traversal, когда мы пытаемся получить информацию другого пользователя, даже если стоит ограничение доступа на просмотр чужих файлов.
🔹 Устройство веб-сервера
Nginx - это веб сервер и обратный прокси-сервер с открытым исходным кодом. Что он умеет:
1) Балансировка нагрузки
2) Защита от DDoS атак
3) Обработка статического контента
4) Другие
А что по уязвимостям в Nginx? Некоторые серверы с nginx остаются уязвимы для техники Nginx Alias Traversal, которая была предложена на конференции Blackhat ещё в 2018 году и позволяет получить доступ к файлам и каталогам, размещённым вне корневого каталога, заданного в директиве "alias". Проблема проявляется только в конфигурациях с директивой "alias", размещённой внутри блока "location", параметр которой не завершается на символ "/", в то время как "alias" завершается на "/".
Суть проблемы в том, что файлы для блоков с директивой alias отдаются через прикрепление запрошенного пути, после его сопоставления с маской из директивы location и вырезания заданной в этой маске части пути.
В конфигурациях, в которых значение директивы alias не завершается символом "/" (например, "alias /var/images;"), атакующий не может перейти в родительский каталог, но имеет возможность запросить другой каталог в /var, начало имени которого совпадает с указанным в конфигурации.
Такое сработает. Чтобы не сработало, нужно:
🔹 Path Traversal - URL Encode
URL-кодирование - это процесс замены некоторых символов в URL-адресе их процентными кодами, что позволяет включать специальные символы в URL. Это может помочь обойти фильтры.
🔹 IDOR - Insecure Direct Object References
IDOR - это тип уязвимости в веб-приложениях, при котором злоумышленник может получить доступ к объектам (например, файлам, записям в БД), на которые у него нет соответствующих прав доступа.
По хорошему все должно выглядеть вот так:
Но происходит вот так:
Пример IDOR'а:
Как можно бороться с такой ситуацией? Например - в случае с названиями картинок. Называть файлы в uuid (UUID (Universal Unique Identifier) — это 128-битное значение, использующееся для уникальной идентификации объекта или сущности в интернете). И хранить соответствие uuid и user в базе данных, чтобы можно было проверять доступ.
🔹 Проблемы аутентификации
Хороший механизм аутентификации должен содержать капчу, ограничение по количеству запросов за период времени, двух факторную ступень, капчу на двухфакторной ступени, ограничение на двухфакторной ступени.
Также нужно позаботиться о решении такой проблемы как User Enumeration. То есть по ответу приложения не должно быть понятно существует ли пользователь в системе или нет. Сброс пароля должен происходить безопасно (не должны использоваться угадываемые ключи или ключи, которые легко забрутить).
После утечки, если такое произошло - необходимо сменить пароли всем пользователям. И установить сильную парольную политику - ну это вообще лучше сделать еще до утечки ;)
🔹 SSRF
SSRF - это вид атаки на веб-приложения, при которой злоумышленник может заставить сервер выполнять запросы к внутренним ресурсам или внешним серверам.
Какой можно привести пример SSRF? Допустим, у нас есть сайт, который может ходить на разные ресурсы (url которых мы ему введем) и возвращать какую-то информацию. В качестве GET параметра он принимает url сайта.
Строчка ?url = https://ya.ru
не вызовет у него никаких проблем. Но вот если приложение настроено не верно, то мы можем сходить например на ?url = http://localhost/vajnaya_localnya_informacia
. Что уже недопустимо. Это самый простой пример SSRF)
Как же бороться с SSRF? Добавляйте вайтлисты куда мы ходим ходить. Например - получать ролики только с ютуба. Использовать библиотеки для проверки ip адресов. Фильтровать куда мы ходим и куда прилетит конечный результат. Сделать ограничение доступа.
🔹 CMD injection
CMDinjection - это тип атаки, при которой злоумышленник внедряет и выполняет вредоносные команды в командной строке (CMD) или в консоли на сервере.
Какие же причины cmd инъекций? Самое простое - небезопасное использование функций языка программирования и вызывание команд прямо в ОС, вместо того, чтобы использовать какие-либо библиотеки, чтобы ограничить такие вызовы. Небезопасное использование системных вызовов, в которые мы можем внедрить инъекцию. И неверная обработка файлов и путей.
Простой пример - приложение, которое просто пингует сайт. Он принимает значение url. Что может пойти не так?
ping ya.ru
звучит безобидно и безопасно. Но вот прибавив к нашему входному значению команду ls
мы получим ping ya.ru;ls
, что выведет список файлов и папок в текущем каталоге. Крутяк!
Можно поставить ограничение на ввод пробелов. Но это также можно обойти заменив пробел на строку ${IFS}
, что системой будет восприниматься как вполне легитимный пробел. Или можно одну команду указывать в фигурных скобках и передавать аргументы через пробел - такое тоже сработает!
ping ya.ru;{cat,secret.txt}
Как решать? Воспринимать вводимое значение как единую сущность. Это можно сделать, например в Python, с помощью subprocess.check_output
.
🔹 SSTI
SSTI - уязвимость связанная с внедрением кода в серверные шаблоны. Эта уязвимость происходит, когда злоумышленник вводит в пользовательские данные код, который затем выполняется в контексте шаблонизатора на сервере.
Основной механизм SSTI заключается в том, что веб-приложение неправильно обрабатывает входные данные, предназначенные для использования в шаблонизаторе, и позволяет внедрять код вместо простых данных. Это нарушает синтаксис шаблона.
🔹 LFI (Local File Inclusion)
LFI - это вид уязвимости веб-приложений, при которой злоумышленник может внедрить и выполнить файловые операции, обращаясь к локальным файлам на сервере.
Например вместо аватарки (файла .png
), мы загружаем файл reverse_shell.php
и потом обращаемся к нему, чтобы установить удаленное соединение. Почему приведен пример именно с php? Потому что php
файлы являются исполняемыми для сервера.