Эксклюзивно для форума 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, но пробовать стоит.
- при экспорте его также должны отдать.
Смотрю проект и вижу, что проверка загрузки файлов происходит по названию, а не по MIME type.
Разработчики наплодили много сущностей, часть функционала вынесена в модули, которые, видимо, должны были быть сторонними плагинами.
Исходя из конфига 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-определения.
Интересные файлы из тестов:
Если подгрузить их через LFI (который выполнит .yml), можно было бы получить админ-аккаунты с известными кредами.
Возможный дефолтный аккаунт - [email protected]:1nitialPassword.
Пожалуй хватит, переходим к проверкам.
Проверки на конфигурации:
Остальное также ничего не возвращает, 403/404:
И тут такой код:
/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 и подобные маршруты на проекте с десятками тысяч пользователей нельзя назвать смешной.
Неправильная конфигурация на примерах: 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
Возможный дефолтный аккаунт - [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
LIMB