Данное описание подготовлено и публикуется со слов победителя CTF этих заданий – Тальгата Хайруллова. Дальше текст передается as-is, правда иногда будут вставлять цитаты с пояснением зачем то или иное задание.

А ты точно девопс?

Задание отправляет нас изучать docker-compose.yml файл.

Первое, за что цепляется взгляд - секция с секретами. Дальше название самих сервисов website.production и website.staging и их описание не оставляет сомнений: на одном сервере бегут сразу и production и staging версия приложения с одними и теми же секретами. При этом staging версия запущена не в PRODUCTION режиме, как правило это, означает, что приложение будет более “открытым” и потенциально более уязвимым, что в итоге может привести к компрометации production версии.

жс

Задание встречает нас кусом кода на JavaScript и утверждением, что код дырявый. Беглый анализ кода подсказывает, что код написан под NodeJS, используется фреймворк express, в коде реализована некая проверка токена доступа, предполагаю, что в ней и есть основная проблема. Несмотря на то, что писать на express не приходилось, код кажется понятным и на первый взгляд выглядит хорошо.

Первая идея - что-то не так с middleware, возможно middleware с проверкой токена доступа отрабатывает позже чем обработка /api или вовсе не отрабатывает. Потребовалось чтение официальной документации, чтобы опровергнуть эту идею. Однако там же нахожу важную особенность express, оказывается, роутинг express по умолчанию регистроНЕзависимый, таким образом запросы вида /API, /Api, /aPi тоже должны обрабатываться. А вот это уже серьезная проблема для кода из задания, чтобы подтвердить наличие проблемы, остается убедиться, что метод startsWith регистрозависимый, иду в MDN:

String.prototype.startsWith() This method lets you determine whether or not a string begins with another string. This method is case-sensitive.

Итого: запросы вида /API, /Api, /aPi проходят мимо проверки токена доступа.