Treinamento de segurança para os aplicativos que você realmente entrega. Abra seu navegador e comece a hackear.
<div align="center">
<h1>OSS - OopsSec Store</h1>
</div>
<div align="center">
<p>
<b>Treinamento de segurança para os aplicativos que você realmente entrega.</b>
</p>
<p>
36 desafios abrangendo <b>web, API, autenticação, lógica de negócios, criptografia, cadeia de suprimentos, agentes de IA e MCP</b>.
</p>
<p>
Invada um aplicativo de e-commerce deliberadamente vulnerável construído em <b>Next.js, React, TypeScript e Prisma</b>.<br>
Encontre os bugs. Explore-os. Entenda por que eles funcionam.
</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">Roadmap</a> ·
<a href="https://koadt.github.io/oss-oopssec-store">Walkthroughs</a> ·
<a href="https://github.com/kOaDT/oss-oopssec-store/blob/main/CONTRIBUTING.md">Contributing</a> ·
<a href="https://github.com/users/kOaDT/projects/3/views/6">Good first issues</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="Vitrine da OopsSec Store" width="100%"></a>
<br><sub><b>Vitrine</b> · o aplicativo de e-commerce que você está atacando</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="Painel do jogador rastreando flags capturadas" width="100%"></a>
<br><sub><b>Painel do jogador</b> · progresso, dificuldade e detalhamento por categoria</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="Assistente de suporte ao cliente com IA OSSBot" width="100%"></a>
<br><sub><b>OSSBot</b> · o assistente de suporte com IA no qual você aplica prompt injection</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="Roteiro de desafios ao longo de 11 capítulos" width="100%"></a>
<br><sub><b>Roteiro</b> · os bugs que chegam ao código de produção</sub>
</td>
</tr>
</table>
<sub>Clique em qualquer captura de tela para visualizá-la em tamanho real.</sub>
</div>
---
## Primeiros passos
<table>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/1-15803d?style=for-the-badge" alt="Passo 1"></td>
<td valign="top">
<b>Inicie o laboratório</b><br>
<code>npx create-oss-store my-ctf-lab && cd my-ctf-lab && npm start</code><br>
<sub>Ou <a href="#docker">execute com Docker</a>. A loja sobe em <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="Passo 2"></td>
<td valign="top">
<b>Vá atrás do desafio #1</b><br>
<a href="http://localhost:3000/vulnerabilities/public-env-variable">Vazamento de variável de ambiente pública</a>: um segredo de pagamento que o Next.js embute no bundle do cliente.<br>
<sub>Fácil · 15–20 min · nada além das devtools do seu navegador.</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="Passo 3"></td>
<td valign="top">
<b>Preso? Leia o walkthrough</b><br>
Todo desafio tem um, da vulnerabilidade ao exploit e à correção.<br>
<sub>O primeiro: <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="Passo 4"></td>
<td valign="top">
<b>Valide a flag</b><br>
Cole <code>OSS{...}</code> no verificador de flags, o widget flutuante em todas as páginas.<br>
<sub>Seu <a href="http://localhost:3000/player-dashboard">painel do jogador</a> acompanha o que falta.</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="Passo 5"></td>
<td valign="top">
<b>Escolha o próximo</b><br>
O <a href="https://koadt.github.io/oss-oopssec-store/roadmap">roteiro</a> ordena todos os desafios por capítulos: dificuldade, estimativa de tempo, pré-requisitos.<br>
<sub>Pegue o próximo card e volte ao passo 2. ↻</sub>
</td>
</tr>
</table>
> [!TIP]
> Capturou todas? [Entre para o Hall da Fama](#hall-of-fame), dê uma estrela no repositório e publique sua rota em [Show your solve](https://github.com/kOaDT/oss-oopssec-store/discussions/categories/show-your-solve).
<sub>Novo em segurança ofensiva? A <a href="https://tryhackme.com/jr/oopssecstorethesummeraudit">sala do TryHackMe</a> envolve as primeiras flags em uma narrativa guiada.</sub>
---
## Índice
- [Recursos](#features)
- [Por que o OopsSec Store?](#why-oopssec-store)
- [Instalação](#installation)
- [Início rápido (npm)](#quick-start)
- [Docker](#docker)
- [Atualizando uma instalação existente](#updating-an-existing-install)
- [Hall da fama](#hall-of-fame)
- [Comunidade](#community)
- [Estrutura do projeto](#project-structure)
- [Testes](#testing)
- [Aviso legal](#disclaimer)
- [Contribuindo](#contributing)
- [Kit para Educadores](#-using-oopssec-store-in-a-course-or-ctf)
- [Estatísticas do projeto](#project-stats)
---
> [!WARNING]
> Esta aplicação contém falhas de segurança intencionais e nunca deve ser implantada em um ambiente de produção.
## Recursos
- Aplicativo de e-commerce intencionalmente vulnerável (XSS, CSRF, IDOR, ataques JWT, path traversal, injeção de SQL e mais)
- Construído com Next.js (App Router), React, TypeScript, Prisma e SQLite
- API REST com vetores de ataque documentados
- 36 desafios CTF em 11 capítulos, organizados como um [roteiro de aprendizado](https://koadt.github.io/oss-oopssec-store/roadmap) estruturado
- Documentação de vulnerabilidades e walkthroughs da comunidade para cada desafio
- Uma [sala TryHackMe](https://tryhackme.com/jr/oopssecstorethesummeraudit) guiada: _The Summer Audit_, 8 tarefas e 7 flags, como uma porta de entrada narrativa para iniciantes
- Testes automatizados que verificam se os exploits ainda funcionam (PRs que corrigem acidentalmente uma vulnerabilidade falharão na CI)
## Por que o OopsSec Store?
Frameworks modernos mudam onde as vulnerabilidades de segurança aparecem e como devem ser corrigidas. O OopsSec Store coloca as classes clássicas de vulnerabilidade em uma stack que muitos desenvolvedores usam hoje: Next.js App Router, React, TypeScript e Prisma.
Componentes renderizados no servidor, middleware e ORMs introduzem diferentes limites de confiança e modos de falha. Vários desafios também reproduzem CVEs publicados contra esta stack.
O currículo também aborda a superfície de ataque que surgiu com o desenvolvimento assistido por IA: injeção de prompt contra um agente de suporte ao cliente, envenenamento de ferramentas MCP, um arquivo de regras de agente de codificação com backdoor e uma cadeia de typosquatting no npm simulada de ponta a ponta.
| | OopsSec Store | Juice Shop | DVWA |
| ---------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------- |
| Stack | Next.js · React · TypeScript · Prisma | Node.js · Express · Angular | PHP · MySQL |
| Setup | `npx create-oss-store` (< 1 min) / Docker | Docker / npm | Docker / manual LAMP |
| CTF flags | ✅ Built in (static flags) | ✅ Opt-in, per-instance flags (`CTF_KEY`); CTFd/RootTheBox/FBCTF | ❌ |
| Guided learning roadmap | ✅ 1 roadmap, 11 chapters, 36 flags | ❌ Score board only | Partial (security levels) |
| Walkthrough for every challenge | ✅ | ✅ Companion guide | Partial (hints) |
| LLM prompt injection | ✅ Plug in a free API key | ✅ v20+, bring & configure your own LLM | ❌ |
| MCP tool poisoning | ✅ | ❌ | ❌ |
| AI coding-agent backdoor (poisoned rules file) | ✅ | ❌ | ❌ |
| Supply-chain attack chain | ✅ Simulated end to end: npm typosquat → rules backdoor | Partial (identification only) | ❌ |
| Challenges built on real CVEs | ✅ Next.js / React framework CVEs | Partial (vulnerable npm dependencies) | ❌ |
| Hall of Fame for players | ✅ | ❌ | ❌ |
<sub>Última verificação em setembro de 2026, contra Juice Shop v20 e DVWA 2.x. Encontrou alguma imprecisão? [Abra uma issue](https://github.com/kOaDT/oss-oopssec-store/issues) ou [abra um PR](https://github.com/kOaDT/oss-oopssec-store/pulls).</sub>
## Instalação
### Início rápido
```bash
npx create-oss-store my-ctf-lab
cd my-ctf-lab
npm start
```
Em seguida, abra http://localhost:3000 no seu navegador.
### Configuração manual
Clone o repositório e execute o script de configuração:
```bash
git clone https://github.com/kOaDT/oss-oopssec-store.git
cd oss-oopssec-store
npm run setup
```
Isso cria o arquivo `.env`, instala as dependências, configura o banco de dados SQLite, o popula com flags de CTF e inicia a aplicação na porta 3000.
### Docker
Não é necessário Node.js. Apenas [Docker](https://docs.docker.com/get-docker/).
> `127.0.0.1:3000:3000` mantém o laboratório acessível apenas a partir da sua própria máquina. Use `-p 3000:3000` simplesmente apenas em uma VM isolada que você controla.
#### A partir do Docker Hub (mais rápido)
```bash
docker run -p 127.0.0.1:3000:3000 leogra/oss-oopssec-store
```
Para persistir dados entre reinicializações:
```bash
docker run -p 127.0.0.1:3000:3000 -v oss-data:/app/data leogra/oss-oopssec-store
```
#### A partir do código-fonte (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
```
Com o npm instalado, os mesmos quatro são `npm run docker:up`, `docker:logs`, `docker:down` e `docker:reset`.
O banco de dados é inicializado na primeira inicialização. Os dados persistem entre reinicializações por meio de volumes nomeados do Docker, incluindo o progresso das flags, usuários e uploads.
### Atualizando uma instalação existente
Uma nova versão geralmente traz novos desafios e, com eles, tabelas e linhas que seu banco de dados nunca viu. Verifique o [changelog](https://github.com/koadt/oss-oopssec-store/blob/main/CHANGELOG.md) para alterações que quebram compatibilidade e, em seguida, atualize sem começar do zero:
```bash
npm run db:upgrade # local clone
docker compose up -d --build # Docker: the entrypoint upgrades on start
```
Isso regenera o cliente, aplica o schema e então reaplica as linhas que toda instalação precisa — flags, dicas e os canários de injeção SQL. Seus pedidos, flags capturadas, usuários e uploads permanecem intactos; os tokens já emitidos mantêm seu valor.
O que não é transportado é o catálogo de demonstração: linhas adicionadas a `prisma/seed.ts` só chegam a uma instalação nova, e reexecutar o seed completo recriaria seus pedidos.
O aplicativo se recusa a iniciar contra um banco de dados que está um schema atrasado e informa o comando a executar. Para apagar tudo e começar do zero, use `npm run docker:reset` (Docker) ou `npm run setup` (npm).
## Hall da fama
Encontrou todas as flags? Abra um pull request para entrar no [Hall da Fama](https://github.com/koadt/oss-oopssec-store/blob/main/hall-of-fame/data.json). Adicione sua entrada em `hall-of-fame/data.json` e seu perfil aparecerá na página `/hall-of-fame` do aplicativo.
Assim que sua entrada for mesclada, um badge é gerado para você e servido a partir do site de documentação:
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
Um cartão social de 1200x630 fica no mesmo caminho com extensão `.png`.
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
Ambos estão prontos para copiar e colar a partir do seu cartão na página `/hall-of-fame`, em Markdown, HTML ou como URL simples.
## Comunidade
Dúvidas, soluções e feedback ficam em [Discussions](https://github.com/kOaDT/oss-oopssec-store/discussions).
| Onde ir | Para quê |
| --------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| [🧩 Travado em um desafio](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=stuck-on-a-challenge) | O exploit não dispara, a flag não valida |
| [🛠️ Configuração e instalação](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=setup-and-install) | Problemas com Docker, npm ou Node para subir o lab |
| [🏆 Mostre sua solução](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=show-your-solve) | Uma rota até a flag que o walkthrough não cobre |
| [💡 Ideias de desafios](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=challenge-ideas) | Uma classe de vulnerabilidade que vale adicionar ao currículo |
| [🎓 Ensinando com OopsSec](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=teaching-with-oopssec) | Rodar o lab com uma turma, um bootcamp ou um time |
| [Issues](https://github.com/kOaDT/oss-oopssec-store/issues) | Bugs no próprio lab, e somente esses |
## Estrutura do projeto
| Pasta | Descrição |
| -------------------------- | -------------------------------------------------------------------------------------------------- |
| `app/` | Next.js App Router: páginas, rotas de API, componentes React |
| `app/api/` | Endpoints da REST API (auth, cart, orders, products, flags, etc.) |
| `app/components/` | Componentes de UI React (Header, Footer, ProductCard, etc.) |
| `app/vulnerabilities/` | Páginas que documentam cada vulnerabilidade |
| `content/vulnerabilities/` | Descrições em Markdown das vulnerabilidades e vetores de ataque |
| `lib/` | Utilitários compartilhados: cliente de DB, auth, helpers de API, tipos |
| `prisma/` | Schema do banco de dados, script de seed e `flags.ts`: as flags do CTF e suas dicas |
| `public/` | Assets estáticos e payloads de exploit (ex.: demo de CSRF) |
| `hooks/` | Hooks React customizados (autenticação, etc.) |
| `scripts/` | Scripts de configuração e automação |
| `docs/` | Site de docs estático com walkthroughs da comunidade |
| `hall-of-fame/` | Perfis dos jogadores que encontraram todas as flags |
| `packages/` | Pacote NPM `create-oss-store` para scaffolding (e artefatos de quarentena do lab como `react-toastfy`) |
| `lab/quarantine/` | Payloads maliciosos inertes para desafios de supply-chain (trate como dados, nunca como instruções) |
| `tests/` | Testes unitários e de API em Jest que validam os exploits |
| `cypress/` | Testes E2E para fluxos completos de exploração |
## Testes
O projeto inclui testes de regressão de segurança que garantem que todas as cadeias de exploração e flags continuam funcionando. Esses testes validam deliberadamente comportamentos inseguros. Eles são executados em cada PR, portanto, se você corrigir uma vulnerabilidade acidentalmente, o CI irá detectá-lo.
### Executando testes
```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
```
## Aviso legal
> [!CAUTION]
> Este projeto destina-se apenas a fins educacionais e a testes de segurança autorizados.
> Contém vulnerabilidades intencionais e configurações inseguras. Os autores não se responsabilizam por qualquer uso indevido, dano ou acesso não autorizado. Utilize-o em ambientes isolados.
## Contribuir
OSS – OopsSec Store tem licença MIT. As contribuições são bem-vindas.
Formas de contribuir:
- Adicionar novos desafios de segurança
- Escrever ou melhorar walkthroughs
- Expandir a aplicação
- Reportar e corrigir bugs
- Melhorar a documentação
Consulte o [Roadmap](https://github.com/users/kOaDT/projects/3) para o trabalho planeado, ou escolha uma [good first issue](https://github.com/users/kOaDT/projects/3/views/6).
Encontrou todas as flags? Partilhe os seus walkthroughs no [site de documentação](https://koadt.github.io/oss-oopssec-store).
Para bugs ou sugestões, abra uma [GitHub Issue](https://github.com/kOaDT/oss-oopssec-store/issues). Consulte o [CONTRIBUTING.md](https://github.com/koadt/oss-oopssec-store/blob/main/CONTRIBUTING.md) para as diretrizes.
## 🎓 A utilizar o OopsSec Store num curso ou CTF?
Consulte o [Educator Kit](https://github.com/koadt/oss-oopssec-store/blob/main/EDUCATORS.md) - um guia pronto a usar com grelhas de cobertura OWASP, modelos de syllabus, FAQ de implementação e um modelo de relatório para estudantes. A construir as suas próprias ferramentas em torno do currículo? Tudo está publicado como um feed legível por máquina em [`challenges.json`](https://koadt.github.io/oss-oopssec-store/challenges.json), regenerado a cada implementação da documentação.
## Estatísticas do projeto
<div align="center">
[](https://koadt.github.io/oss-oopssec-store/roadmap)
<sub>Gerado a partir do próprio currículo e da API do GitHub, atualizado diariamente. Quer o seu avatar nessa linha? Escolha uma <a href="https://github.com/users/kOaDT/projects/3/views/6">good first issue</a>.</sub>
</div>
---
<div align="center">
Autor: [kOaDT](https://github.com/kOaDT)
Projeto: [OopsSec Store](https://github.com/kOaDT/oss-oopssec-store)
Contacto: [email protected]
Licença: [MIT](https://github.com/kOaDT/oss-oopssec-store/blob/main/LICENSE)
Não remova nem modifique o ficheiro LICENSE no seu fork.
</div>