Обучение безопасности для реально выпускаемых приложений. Откройте браузер и начинайте взламывать.
<div align="center">
<h1>OSS - OopsSec Store</h1>
</div>
<div align="center">
<p>
<b>Обучение безопасности для приложений, которые вы действительно выпускаете.</b>
</p>
<p>
36 испытаний по <b>веб-приложениям, API, аутентификации, бизнес-логике, криптографии, цепочке поставок, AI-агентам и MCP</b>.
</p>
<p>
Взломайте намеренно уязвимое приложение для электронной коммерции, построенное на <b>Next.js, React, TypeScript и Prisma</b>.<br>
Найдите ошибки. Проэксплуатируйте их. Поймите, почему они работают.
</p>
<p>
<a href="https://hub.docker.com/r/leogra/oss-oopssec-store">Docker Hub</a> ·
<a href="https://www.npmjs.com/package/create-oss-store">npm</a> ·
<a href="https://koadt.github.io/oss-oopssec-store/roadmap">Дорожная карта</a> ·
<a href="https://koadt.github.io/oss-oopssec-store">Прохождения</a> ·
<a href="https://github.com/kOaDT/oss-oopssec-store/blob/main/CONTRIBUTING.md">Участие в разработке</a> ·
<a href="https://github.com/users/kOaDT/projects/3/views/6">Хорошие первые задачи</a>
</p>
[](https://vwad.owasp.org/app/oopssec-store/)
[](https://tryhackme.com/jr/oopssecstorethesummeraudit)

<br>
[](https://github.com/kOaDT/oss-oopssec-store/blob/main/LICENSE)
[](https://github.com/kOaDT/oss-oopssec-store/pulls)
[](https://github.com/users/kOaDT/projects/3/views/6)
<br>
[](https://github.com/kOaDT/oss-oopssec-store/stargazers)
[](https://github.com/kOaDT/oss-oopssec-store/network)
</div>
```bash
____ ____ ____ ____ ____ ____ _
/ __ \/ __// __/ / __ \ ___ ___ ___ / __/ ___ ____ / __/ / /_ ___ ____ ___
/ /_/ /\ \ _\ \ / /_/ // _ \ / _ \(_-<_\ \ / -_)/ __/_\ \ / __// _ \ / __// -_)
\____/___//___/ \____/ \___// .__/___/___/ \__/ \__//___/ \__/ \___//_/ \__/
/_/
# Start with Node.js
npx create-oss-store my-ctf-lab && cd my-ctf-lab && npm start
# Start with Docker
docker run -p 127.0.0.1:3000:3000 leogra/oss-oopssec-store
# Then open http://localhost:3000 and start hacking
```
<div align="center">
<table>
<tr>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-0.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/2656002fea49e81bc7876fc998d1bf1ddf664257bb023c03705e322e6dada5fb/9a5c520942d272122aeba14fd7a799dfecf60a99e0990904bff05e59ba634d37-display-v1.webp" alt="Витрина OopsSec Store" width="100%"></a>
<br><sub><b>Витрина</b> · приложение электронной коммерции, которое вы атакуете</sub>
</td>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-1.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/a3edf2b1a9311abfe35c5cb956302c0e6568a5c8ba891f0d2c4056defa19b078/24355e727585878af96376d809ee68dce57dd5823691ccd00b8fb8ae424750f6-display-v1.webp" alt="Панель игрока с отслеживанием захваченных флагов" width="100%"></a>
<br><sub><b>Панель игрока</b> · прогресс, сложность и разбивка по категориям</sub>
</td>
</tr>
<tr>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-2.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/05a9601b40eb202f0ef72eae225d69bfceb5a6600361408be681131a51d29da7/41e77928d6eb00585c020ca88a60f8fcef577c5741c8fba826ed8ac1982c362e-display-v1.webp" alt="ИИ-ассистент поддержки клиентов OSSBot" width="100%"></a>
<br><sub><b>OSSBot</b> · ИИ-ассистент поддержки, в который вы внедряете промпты</sub>
</td>
<td width="50%" align="center">
<a href="https://github.com/koadt/oss-oopssec-store/blob/main/public/oopssec-store-storefront-3.png"><img src="https://assets.kitploit.com/production/public/readmes/12463/91565414292b83d7dca7b97206404d899358e7b94ae9acad9c2a30d1886b8751/beac914224c61942f48311d8d3405292def762be276cffd16400ec6b6e2ec473-display-v1.webp" alt="Карта испытаний по 11 главам" width="100%"></a>
<br><sub><b>Карта</b> · уязвимости, которые попадают в production-код</sub>
</td>
</tr>
</table>
<sub>Нажмите на любой скриншот, чтобы открыть его в полном размере.</sub>
</div>
---
## Начало работы
<table>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/1-15803d?style=for-the-badge" alt="Шаг 1"></td>
<td valign="top">
<b>Запустите лабораторию</b><br>
<code>npx create-oss-store my-ctf-lab && cd my-ctf-lab && npm start</code><br>
<sub>Или <a href="#docker">запустите её с помощью Docker</a>. Магазин поднимается на <a href="http://localhost:3000">localhost:3000</a>.</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/2-15803d?style=for-the-badge" alt="Шаг 2"></td>
<td valign="top">
<b>Возьмитесь за испытание №1</b><br>
<a href="http://localhost:3000/vulnerabilities/public-env-variable">Утечка публичной переменной окружения</a>: платёжный секрет, который Next.js встраивает в клиентский бандл.<br>
<sub>Легко · 15–20 мин · нужны только devtools вашего браузера.</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/3-15803d?style=for-the-badge" alt="Шаг 3"></td>
<td valign="top">
<b>Застряли? Прочитайте разбор</b><br>
Он есть для каждого испытания: от уязвимости до эксплойта и исправления.<br>
<sub>Первый: <a href="https://koadt.github.io/oss-oopssec-store/posts/next-public-env-variable-leak/">Reading Secrets From the Browser: The NEXT_PUBLIC_ Trap in Next.js</a>.</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/4-15803d?style=for-the-badge" alt="Шаг 4"></td>
<td valign="top">
<b>Проверьте флаг</b><br>
Вставьте <code>OSS{...}</code> в проверку флагов — плавающий виджет на каждой странице.<br>
<sub>Ваша <a href="http://localhost:3000/player-dashboard">панель игрока</a> отслеживает, что осталось.</sub>
</td>
</tr>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/5-15803d?style=for-the-badge" alt="Шаг 5"></td>
<td valign="top">
<b>Выберите следующее</b><br>
<a href="https://koadt.github.io/oss-oopssec-store/roadmap">Карта</a> упорядочивает все испытания по главам: сложность, оценка времени, предварительные требования.<br>
<sub>Возьмите следующую карточку, затем вернитесь к шагу 2. ↻</sub>
</td>
</tr>
</table>
> [!TIP]
> Все захвачены? [Присоединяйтесь к Залу славы](#hall-of-fame), поставьте звезду репозиторию и опубликуйте свой маршрут в [Show your solve](https://github.com/kOaDT/oss-oopssec-store/discussions/categories/show-your-solve).
<sub>Новичок в наступательной безопасности? <a href="https://tryhackme.com/jr/oopssecstorethesummeraudit">Комната TryHackMe</a> оборачивает первые флаги в пошаговое повествование.</sub>
---
## Содержание
- [Возможности](#features)
- [Почему OopsSec Store?](#why-oopssec-store)
- [Установка](#installation)
- [Быстрый старт (npm)](#quick-start)
- [Docker](#docker)
- [Обновление существующей установки](#updating-an-existing-install)
- [Зал славы](#hall-of-fame)
- [Сообщество](#community)
- [Структура проекта](#project-structure)
- [Тестирование](#testing)
- [Отказ от ответственности](#disclaimer)
- [Участие в разработке](#contributing)
- [Educator Kit](#-using-oopssec-store-in-a-course-or-ctf)
- [Статистика проекта](#project-stats)
---
> [!WARNING]
> Это приложение содержит намеренные уязвимости безопасности и никогда не должно развёртываться в производственной среде.
## Возможности
- Намеренно уязвимое приложение электронной коммерции (XSS, CSRF, IDOR, атаки на JWT, обход путей, SQL-инъекции и многое другое)
- Создано на Next.js (App Router), React, TypeScript, Prisma и SQLite
- REST API с документированными векторами атак
- 36 CTF-задач в 11 главах, организованных в виде структурированного [учебного плана](https://koadt.github.io/oss-oopssec-store/roadmap)
- Документация по уязвимостям и разборы от сообщества для каждой задачи
- Пошаговая [комната TryHackMe](https://tryhackme.com/jr/oopssecstorethesummeraudit): _The Summer Audit_, 8 заданий и 7 флагов, как сюжетное введение для новичков
- Автоматические тесты, проверяющие, что эксплойты по-прежнему работают (PR, случайно исправляющие уязвимость, не пройдут CI)
## Почему OopsSec Store?
Современные фреймворки меняют то, где появляются уязвимости безопасности и как их следует исправлять. OopsSec Store помещает классические классы уязвимостей в стек, который многие разработчики используют сегодня: Next.js App Router, React, TypeScript и Prisma.
Компоненты с серверным рендерингом, middleware и ORM вводят иные границы доверия и режимы отказа. Несколько задач также воспроизводят опубликованные CVE для этого стека.
Учебная программа также охватывает поверхность атак, появившуюся с разработкой при помощи ИИ: prompt injection против агента поддержки клиентов, отравление инструментов MCP, файл правил агента программирования с бэкдором и цепочку тайпсквоттинга npm, смоделированную от начала до конца.
| | OopsSec Store | Juice Shop | DVWA |
| ---------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------- |
| Стек | Next.js · React · TypeScript · Prisma | Node.js · Express · Angular | PHP · MySQL |
| Установка | `npx create-oss-store` (< 1 мин) / Docker | Docker / npm | Docker / ручной LAMP |
| CTF-флаги | ✅ Встроены (статические флаги) | ✅ Опционально, флаги для каждого экземпляра (`CTF_KEY`); CTFd/RootTheBox/FBCTF | ❌ |
| Пошаговый учебный план | ✅ 1 план, 11 глав, 36 флагов | ❌ Только таблица результатов | Частично (уровни безопасности) |
| Прохождение для каждого испытания | ✅ | ✅ Сопроводительное руководство | Частично (подсказки) |
| Prompt injection для LLM | ✅ Подключите бесплатный API-ключ | ✅ v20+, подключите и настройте свою LLM | ❌ |
| Отравление инструментов MCP | ✅ | ❌ | ❌ |
| Бэкдор в AI-агенте для кодинга (отравленный файл правил) | ✅ | ❌ | ❌ |
| Цепочка атаки на цепочку поставок | ✅ Сквозная симуляция: тайпсквоттинг npm → бэкдор в правилах | Частично (только идентификация) | ❌ |
| Испытания на основе реальных CVE | ✅ CVE фреймворков Next.js / React | Частично (уязвимые зависимости npm) | ❌ |
| Зал славы для игроков | ✅ | ❌ | ❌ |
<sub>Последняя проверка — сентябрь 2026 г., на Juice Shop v20 и DVWA 2.x. Заметили неточность? [Откройте issue](https://github.com/kOaDT/oss-oopssec-store/issues) или [откройте PR](https://github.com/kOaDT/oss-oopssec-store/pulls).</sub>
## Установка
### Быстрый старт
```bash
npx create-oss-store my-ctf-lab
cd my-ctf-lab
npm start
```
Затем откройте http://localhost:3000 в браузере.
### Ручная установка
Клонируйте репозиторий и запустите скрипт установки:
```bash
git clone https://github.com/kOaDT/oss-oopssec-store.git
cd oss-oopssec-store
npm run setup
```
Это создаёт файл `.env`, устанавливает зависимости, настраивает базу данных SQLite, заполняет её CTF-флагами и запускает приложение на порту 3000.
### Docker
Node.js не требуется. Достаточно [Docker](https://docs.docker.com/get-docker/).
> `127.0.0.1:3000:3000` делает лабораторию доступной только с вашей собственной машины. Используйте обычный `-p 3000:3000` только на изолированной виртуальной машине, которую вы контролируете.
#### Из Docker Hub (самый быстрый способ)
```bash
docker run -p 127.0.0.1:3000:3000 leogra/oss-oopssec-store
```
Для сохранения данных между перезапусками:
```bash
docker run -p 127.0.0.1:3000:3000 -v oss-data:/app/data leogra/oss-oopssec-store
```
#### Из исходного кода (Docker Compose)
```bash
git clone https://github.com/kOaDT/oss-oopssec-store.git
cd oss-oopssec-store
docker compose up -d # Start in background (builds the image on first run)
docker compose logs -f # Follow container logs
docker compose down # Stop the container
docker compose down -v # Stop and wipe data for a fresh start
```
Если npm установлен, те же четыре команды: `npm run docker:up`, `docker:logs`, `docker:down` и `docker:reset`.
База данных инициализируется при первом запуске. Данные сохраняются между перезапусками благодаря именованным томам Docker, включая прогресс по флагам, пользователей и загрузки.
### Обновление существующей установки
Новая версия обычно приносит новые испытания, а вместе с ними — таблицы и строки, которых ваша база данных ещё не видела. Проверьте [changelog](https://github.com/koadt/oss-oopssec-store/blob/main/CHANGELOG.md) на предмет несовместимых изменений, затем обновитесь без необходимости начинать заново:
```bash
npm run db:upgrade # local clone
docker compose up -d --build # Docker: the entrypoint upgrades on start
```
Это пересоздаёт клиент, применяет схему, а затем повторно применяет строки, необходимые при каждой установке — флаги, подсказки и SQL-инъекционные канарейки. Ваши заказы, захваченные флаги, пользователи и загрузки остаются нетронутыми; уже выпущенные токены сохраняют свою силу.
Что не переносится — это демонстрационный каталог: строки, добавленные в `prisma/seed.ts`, попадают только в свежую установку, а повторный запуск полного сида воссоздал бы ваши заказы.
Приложение отказывается запускаться с базой данных, отстающей от схемы на одну версию, и называет команду, которую нужно выполнить. Чтобы вместо этого всё стереть и начать с чистого листа, используйте `npm run docker:reset` (Docker) или `npm run setup` (npm).
## Зал славы
Нашли все флаги? Откройте pull request, чтобы попасть в [Зал славы](https://github.com/koadt/oss-oopssec-store/blob/main/hall-of-fame/data.json). Добавьте свою запись в `hall-of-fame/data.json`, и ваш профиль появится на странице `/hall-of-fame` в приложении.
Как только ваша запись будет объединена, для вас сгенерируется значок, который будет размещён на сайте документации:
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
Социальная карточка размером 1200x630 находится по тому же пути с расширением `.png`.
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
Оба варианта готовы к копированию с вашей карточки на странице `/hall-of-fame` — в Markdown, HTML или в виде простого URL.
## Сообщество
Вопросы, решения и отзывы — в [Discussions](https://github.com/kOaDT/oss-oopssec-store/discussions).
| Куда обратиться | По какому поводу |
| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| [🧩 Застряли на задании](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=stuck-on-a-challenge) | Эксплойт не срабатывает, флаг не проходит проверку |
| [🛠️ Установка и настройка](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=setup-and-install) | Проблемы с Docker, npm или Node при запуске лаборатории |
| [🏆 Покажите своё решение](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=show-your-solve) | Способ получить флаг, не описанный в прохождении |
| [💡 Идеи для заданий](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=challenge-ideas) | Класс уязвимости, который стоит добавить в курс |
| [🎓 Преподавание с OopsSec](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=teaching-with-oopssec) | Запуск лаборатории с классом, на буткемпе или в команде |
| [Issues](https://github.com/kOaDT/oss-oopssec-store/issues) | Ошибки в самой лаборатории, и только они |
## Структура проекта
| Папка | Описание |
| -------------------------- | -------------------------------------------------------------------------------------------------- |
| `app/` | Next.js App Router: страницы, API-маршруты, React-компоненты |
| `app/api/` | REST API-эндпоинты (аутентификация, корзина, заказы, товары, флаги и т. д.) |
| `app/components/` | React UI-компоненты (Header, Footer, ProductCard и т. д.) |
| `app/vulnerabilities/` | Страницы с описанием каждой уязвимости |
| `content/vulnerabilities/` | Markdown-описания уязвимостей и векторов атак |
| `lib/` | Общие утилиты: клиент БД, аутентификация, API-хелперы, типы |
| `prisma/` | Схема базы данных, скрипт заполнения и `flags.ts`: CTF-флаги и подсказки к ним |
| `public/` | Статические ресурсы и полезные нагрузки эксплойтов (например, демонстрация CSRF) |
| `hooks/` | Пользовательские React-хуки (аутентификация и т. д.) |
| `scripts/` | Скрипты установки и автоматизации |
| `docs/` | Статический сайт документации с прохождениями от сообщества |
| `hall-of-fame/` | Профили игроков, нашедших все флаги |
| `packages/` | NPM-пакет `create-oss-store` для скаффолдинга (и артефакты карантина лаборатории, например `react-toastfy`) |
| `lab/quarantine/` | Инертные вредоносные полезные нагрузки для заданий по цепочке поставок (считать данными, а не инструкциями) |
| `tests/` | Модульные и API-тесты Jest, проверяющие эксплойты |
| `cypress/` | E2E-тесты для полных сценариев эксплуатации |
## Тестирование
Проект включает тесты регрессии безопасности, которые проверяют, что все цепочки эксплойтов и флаги по-прежнему работают. Эти тесты намеренно проверяют небезопасное поведение. Они запускаются при каждом PR, поэтому если вы случайно исправите уязвимость, CI это обнаружит.
### Запуск тестов
```bash
# Unit tests (utility functions: MD5 hashing, JWT, input filters)
npm run test:unit
# API exploitation tests (requires a running server)
npm run test:api
# E2E exploitation tests (requires a running server)
npm run test:e2e
# Open Cypress interactive mode
npm run test:e2e:open
# All tests
npm run test:ci
```
## Отказ от ответственности
> [!CAUTION]
> Этот проект предназначен исключительно для образовательных целей и авторизованного тестирования безопасности.
> Он содержит намеренные уязвимости и небезопасные конфигурации. Авторы не несут ответственности за любое неправомерное использование, ущерб или несанкционированный доступ. Используйте его в изолированных средах.
## Участие в проекте
OSS – OopsSec Store распространяется под лицензией MIT. Мы приветствуем вклад в проект.
Способы внести свой вклад:
- Добавлять новые задачи по безопасности
- Писать или улучшать пошаговые руководства
- Расширять приложение
- Сообщать об ошибках и исправлять их
- Улучшать документацию
Ознакомьтесь с [дорожной картой](https://github.com/users/kOaDT/projects/3), чтобы узнать о запланированной работе, или выберите [задачу для новичков](https://github.com/users/kOaDT/projects/3/views/6).
Нашли все флаги? Поделитесь своими руководствами на [сайте документации](https://koadt.github.io/oss-oopssec-store).
По вопросам ошибок или предложений открывайте [GitHub Issue](https://github.com/kOaDT/oss-oopssec-store/issues). См. [CONTRIBUTING.md](https://github.com/koadt/oss-oopssec-store/blob/main/CONTRIBUTING.md) для получения рекомендаций.
## 🎓 Используете OopsSec Store в курсе или CTF?
Ознакомьтесь с [Educator Kit](https://github.com/koadt/oss-oopssec-store/blob/main/EDUCATORS.md) — готовым к использованию руководством с таблицами покрытия OWASP, шаблонами учебных программ, FAQ по развёртыванию и шаблоном отчёта студента. Создаёте собственные инструменты вокруг учебной программы? Всё это опубликовано в виде машиночитаемого фида по адресу [`challenges.json`](https://koadt.github.io/oss-oopssec-store/challenges.json), который перегенерируется при каждом развёртывании документации.
## Статистика проекта
<div align="center">
[](https://koadt.github.io/oss-oopssec-store/roadmap)
<sub>Формируется на основе самой учебной программы и GitHub API, обновляется ежедневно. Хотите увидеть свой аватар в этом ряду? Возьмите <a href="https://github.com/users/kOaDT/projects/3/views/6">задачу для новичков</a>.</sub>
</div>
---
<div align="center">
Автор: [kOaDT](https://github.com/kOaDT)
Проект: [OopsSec Store](https://github.com/kOaDT/oss-oopssec-store)
Контакт: [email protected]
Лицензия: [MIT](https://github.com/kOaDT/oss-oopssec-store/blob/main/LICENSE)
Не удаляйте и не изменяйте файл LICENSE в вашем форке.
</div>