Добрый вечер, дорогие друзья. В этой статье я бы хотел поговорить о довольно интересной теме (десериализация и сериализация). Данная вещь есть во многих языках программирования, поэтому хотелось бы с нуля объяснить вам, что это такое и как применять. Приступим.
Введение | Что это?
Для начало давайте разберемся, что это такое:
Сериализация — это преобразование того или иного объекта в битовую последовательность.
Десериализация — восстановление первоначального состояния объекта из битовой последовательности.
Данная система активно используется хакерами. И для наглядной схемы о том, что это такое приведу небольшой пример:
Допустим ваше веб-приложение перемещает сереализованные битовые потоки между браузером и серверами. Такая вещь передается по протоколам HTTP или HTTPS. И такая вещь может делится на стороне клиента. Что должен сделать хакер, чтобы редактировать эти потоки? Все просто, ему требуется узнать структуру передаваемых в битовом потоке объектов и знать уязвимости движков под управлением которых как раз и работает наше веб-приложение, чтобы проникнуть в систему. Давайте перейдем к сценарием атаки.
Практика | Как работает?
И так, прежде чем показать это на практике давайте разберем два вида атаки. Именно какие они бывают:
1. Атаки, которые меняют логику приложения или выполняют произвольный код при наличии доступных приложению классов. Поведение которых меняется при десериализации или после.
2. Атаки с подменной данных. К примеру используя определенную структуру данных можно изменять их содержимое.
Давайте рассмотрим парочку сценариев атак. К примеру:
№1 Сценарий: Это самый распространенный пример. Происходит вызов микрослужб Spring Boot React-приложение. Разработчики обеспечили полный неизменяемый код. Данное решение заключается в том, что в сериализации состояния пользователя и передаче его с каждым запросом. Злоумышленник, заметивший подпись Java-объекта "rO0", может использовать Java Serial Killer для удаленного выполнения кода на сервере приложения.
№2 Сценарий: На PHP форуме для хранения "supercookies" используется сериализация PHP-объектов. Они содержат идентификатор, роль, хеш пароля и другие данные пользователя и это можно заметить ниже:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
Хакер используя данную вещь изменяет сериализованный объект и тем самым выдает себе права администратора. Это все выглядит примерно так:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
На заметку говорю где используется сериализация в приложениях:
1. Удаленного и межпроцессного взаимодействия.
2. Проводных протоколов, веб-служб, брокеров сообщений.
3. Кэширования или сохранения данных.
4. Баз данных, серверов кэширования, файловых систем.
5. Куки-файлов HTTP, параметров HTML-форм, токенов аутентификации API.
И так, это основная информация по сериализации и десериализации. В завершении расскажу как от этого защищаться. Для этого нужно:
1. Проверить целостность сериализованных объектов (цифровая подпись для проверки).
2. Изолировать и запустить код, который осуществляет десериализацию в среде где по минимум привилегий (если это возможно).
3. Исключить ошибки десериализации.
4. Контролировать входящие/исходящие сетевые подключения контейнеров или серверов. Которые проводят десериализацию.
5. Отслеживать десериализацию с предупреждением о фактах продолжительной десериализации.
Итоги | Вывод
Ну что же, сказать, что это легко нельзя, но я попытался объяснить кратко все и понятно. Последняя и самая популярная десериализация была в Java. Расширение Java Serial Killer Burp. Ну а в остальном удачи