Содержание статьи
Пара слов о ProcessMaker
Итак, ProcessMaker — это открытая система управления бизнес-процессами (BPM — Business Process Management) и рабочим потоком. У нее есть две версии: облачная (Cloud Edition) и самостоятельное приложение. Вторая, в свою очередь, делится на Enterprise и open source (Community Edition). Вот они нас как раз и интересуют.
Сама система работает на стеке технологий LAMP/WAMP (Linux/Windows, Apache, MySQL, PHP) и имеет открытый исходный код. Я буду тестировать опенсорсную версию, но поскольку ядро во всех редакциях практически одинаково, то все это должно работать и в версии Enterprise.
WARNING
Материал адpесован специалистам по безопасности и тем, кто собираeтся ими стать. Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.
Стенд
Как обычно, в качестве основания для тестового стенда я буду использовать Docker. Но если не хочешь заморачиваться, а основная операционка у тебя Windows, то можно этим и обойтись. В Windows установка сводится к простому запуску .exe и клацанью по кнопочке Next. Скачать подопытную версию можно здесь.
Если же ты решил идти по моему пути, то готовый докер-файл всегда сможешь скачать из моего репозитория.
Первые баги
Когда я анализирую исходники, то первым делом ищу десериализацию данных. Если нечто подобное имеется, то надо смотреть, куда приходят данные и нет ли среди них юзердаты.
ProcessMaker написан на PHP, значит, нам нужно искать вызовы функций unserialize()
.
Результаты поиска показывают, что разработчики питают теплые чувства к этой функции. При беглом просмотре сразу натыкаемся на такой вот интересный файл:
/workflow/engine/methods/login/sysLoginVerify.php
26: if (array_key_exists("d", $_GET)) {
27: $_POST = unserialize(base64_decode($_GET["d"]));
28: }
Здесь мы можем наблюдать замечательный образец уязвимого кода, точно как из учебника. Атакующий может спокойно манипулировать параметром d
и тем самым контролировать данные, которые пройдут десериализацию. Кроме того, этот файл участвует в процессе аутентификации и доступен любому неавторизованному пользователю.
Для успешной эксплуатации таких уязвимостей нужно найти подходящие гаджеты или их цепочки. Если ты не понимаешь, о чем идет речь, то следующий раздел специально для тебя, а те, кто в курсе, могут его просто пропустить.
Особенности национальной сериализации в PHP
Сериализация — это перевод какой-либо структуры данных в последовательность битов, которую потом можно привести в начальное состояние. Восстановление в исходное состояние называется десериализацией или структуризацией. При этом извлечение любой части сериализованной структуры данных требует, чтобы весь объект был считан от начала до конца и воссоздан.
Такие функции полезны, когда нужно сохранить состояние каких-либо объектов для передачи по сети или записи в файл или БД для последующего использования. Например, это может быть текущее состояние авторизованного пользователя и его настроек.
У каждого языка программирования свой формат хранения таких данных, и PHP не исключение. Документацию и кучу примеров ты без труда найдешь в интернете, а здесь я коснусь только самых основных моментов.
В общем случае формат сериализованных данных следующий:
<тип данных>:[:длина]:<значение>
Длина используется, только когда сериализуются объекты типа string, array и class.
Вот как это выглядит на практике.
serialize-test.php
<?php
class Test {
private $priv = 'priv-prop';
protected $prot = 'prot-prop';
}
echo(serialize(new Test));
Результатом выполнения скрипта будет строка
O:4:"Test":2:{s:10:"Testpriv";s:9:"priv-prop";s:7:"*prot";s:9:"prot-prop";}
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»