ProcessMaker 3 — это популярная система управления бизнес-процессами, которая используется в крупных компаниях. Возможность несанкционированного доступа к ней может обернуться большими проблемами, тем более что захватить можно не только базу данных, но и сервер, на котором стоит ProcessMaker. Сейчас я расскажу, как это сделать, а заодно это послужит показательным примером поиска уязвимостей в коде на PHP.
 

Пара слов о 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().

Найденные вызовы функции unserialize
Найденные вызовы функции 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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии