LIMB
Вход Регистрация

тема

Ломаем сайт через миссконфигурацию 0 дня

ocean · · 0 ответов · 356 просмотров

 Эксклюзивно для форума LIMB.cc

Неправильная конфигурация на примерах: https://github.com/projectdiscovery/nuclei-templates/tree/main/http/misconfiguration.

Попробуем найти что-то новое.

Silverstripe - относительно популярная CMS на десятки тысяч сайтов. Ранее я о ней не слышал и выбрал случайно.

Как позже выяснилось, система достаточно багованная: https://www.cve.org/CVERecord/SearchResults?query=silverstripe. Однако то, о чём пойдёт речь, вроде как никогда не всплывало в репортах.

Исследуем исходный код.

В репозитории установщика мне сразу приглянулся файл .env: https://github.com/silverstripe/silverstripe-installer/blob/6/.env.example.
О нём есть подробная документация: https://docs.silverstripe.org/en/5/getting_started/environment_management/#core-environment-variables.

Судя по этому фрагменту, можно сделать вывод, что файл, помимо .env, может находиться в /app/.env.

Не удалось прогрузить медиа


Также конфигурация может быть в неназванном .yaml файле, а также в docker-compose.yml.

Файл должен называться ровно .env.

Не удалось прогрузить медиа


В .gitignore указан .env, но в проекте есть .env.example, и они связаны. YAML файлы, docker-compose.yml, /app/.env и composer.json в .gitignore не указаны. 
Это лишь установщик, дальше есть ещё один .gitignore, но пробовать стоит.

Не удалось прогрузить медиа

silverstripe-installer/.gitattributes at 6 · silverstripe/silverstripe-installer

The installer for Silverstripe CMS and Framework. Check out this repository to start working with Silverstripe! - silverstripe/silverstripe-installer
Не удалось прогрузить медиа
github.com
 - при экспорте его также должны отдать.

Не удалось прогрузить медиа


Смотрю проект и вижу, что проверка загрузки файлов происходит по названию, а не по MIME type. 
Не удалось прогрузить медиа

Allowed file types

Developer documentation for Silverstripe CMS and framework
Не удалось прогрузить медиа
docs.silverstripe.org
Разработчики наплодили много сущностей, часть функционала вынесена в модули, которые, видимо, должны были быть сторонними плагинами. 

Исходя из конфига https://github.com/silverstripe/silverstripe-installer/blob/6/public/assets/.htaccess, строим предположение о наличии error.html с логами.
Нахожу ещё /var/www/silverstripe.log и /errors.log, их тоже проверим.

Таинственные .yaml файлы обретают имена - возможно, это app/_config/config.yml и app/_config/logging.yml. Их тоже проверим (app может быть переменной типа домена, может быть частью пути, а может и нет).

Нахожу два маршрута (они то и будут работать): 
/dev/build** - пересборка всей базы данных и манифеста.
/dev/config/audit** - аудит конфигурационных свойств и отображение тех, что имеют отсутствующие PHP-определения.

Интересные файлы из тестов:
Не удалось прогрузить медиа

silverstripe-framework/tests/php/Security/PermissionTest.yml at 5 · silverstripe/silverstripe-framework

Silverstripe Framework, the MVC framework that powers Silverstripe CMS - silverstripe/silverstripe-framework
Не удалось прогрузить медиа
github.com
Не удалось прогрузить медиа

silverstripe-framework/tests/php/Security/MemberTest.yml at 5 · silverstripe/silverstripe-framework

Silverstripe Framework, the MVC framework that powers Silverstripe CMS - silverstripe/silverstripe-framework
Не удалось прогрузить медиа
github.com
Если подгрузить их через LFI (который выполнит .yml), можно было бы получить админ-аккаунты с известными кредами.

Возможный дефолтный аккаунт - [email protected]:1nitialPassword.


Пожалуй хватит, переходим к проверкам. 

Проверки на конфигурации:

Code:
/env - 404
/.env - не отдает
/app/.env - 404
.env.example - 404
/composer.json - 404


Остальное также ничего не возвращает, 403/404:

Code:
app/_config/config.yml
app/_config/logging.yml
_config/.env
/errors.log
/silverstripe.log

И тут такой код:
Не удалось прогрузить медиа

/dev/build/?flush=1 - маршрут срабатывает, сервер пересобрал базу, ничего не сломалось. Видно версию MySQL, таблицы и количество записей, но нет кредов и доступа к базе. 
Почему маршрут сработал без валидации - непонятно. Возможно, это дебаг-мод, включённый по умолчанию в Silverstripe.

Дальше - /dev/config, креды от БД:
Не удалось прогрузить медиа


Минимум - дефолтные креды. На сайт по ним зайти нельзя (нужен email). 
В коде:
Не удалось прогрузить медиа

default_members - несколько аккаунтов, уникальных для каждого сайта, паттерн простой.

Продолжаем находить маршруты. Вместо лога ошибок есть возможность показать все SQL-запросы:
/?showqueries=1
/?showqueries=backtrace

Через /admin/graphql тоже можно экспериментировать.

Идем в админку:
Не удалось прогрузить медиа


И мы админы. Вот она, миссконфигурация.

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


Судя по всему, используются простые дефолтные креды.
Не удалось прогрузить медиа


Осталось залить шелл. Всё мягко - плагинов нет, возможности менять код тоже.

Пробуем через файлы. Удалось сделать следующее:
Не удалось прогрузить медиа


Склеил GIF с PHP, но файлы считываются по первому расширению, пейлод не прошёл, защита по белому списку. Пробовал архивы - не превратились в код, возвращались как файлы.

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

Не удалось прогрузить медиа


Не удалось прогрузить медиа


Итог: попадаем на /dev/config, берём default_members, используем sudomod для надёжности, проливаем шелл через поля для SEO-скриптов. Миссконфигурация 0 дня.

С одной стороны, это трудно назвать серьезной уязвимостью, с другой - невозможность закрыть /dev/build/?flush=1 и подобные маршруты на проекте с десятками тысяч пользователей нельзя назвать смешной.
👍20 ❤️4 🤔2

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.