Entrenamiento en seguridad para las aplicaciones que realmente distribuyes. Abre tu navegador y empieza a hackear.
<div align="center">
<h1>OSS - OopsSec Store</h1>
</div>
<div align="center">
<p>
<b>Formación en seguridad para las aplicaciones que realmente despliegas.</b>
</p>
<p>
36 retos que abarcan <b>web, API, autenticación, lógica de negocio, criptografía, cadena de suministro, agentes de IA y MCP</b>.
</p>
<p>
Rompe una aplicación de comercio electrónico deliberadamente vulnerable construida sobre <b>Next.js, React, TypeScript y Prisma</b>.<br>
Encuentra los fallos. Explótalos. Entiende por qué funcionan.
</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="Escaparate de OopsSec Store" width="100%"></a>
<br><sub><b>Escaparate</b> · la aplicación de comercio electrónico que estás 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="Panel del jugador con seguimiento de flags capturadas" width="100%"></a>
<br><sub><b>Panel del jugador</b> · progreso, dificultad y desglose por categoría</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="Asistente de atención al cliente con IA OSSBot" width="100%"></a>
<br><sub><b>OSSBot</b> · el asistente de soporte con IA al que le aplicas 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="Hoja de ruta de retos a lo largo de 11 capítulos" width="100%"></a>
<br><sub><b>Hoja de ruta</b> · los bugs que llegan al código de producción</sub>
</td>
</tr>
</table>
<sub>Haz clic en cualquier captura de pantalla para verla a tamaño completo.</sub>
</div>
---
## Primeros pasos
<table>
<tr>
<td width="56" align="center" valign="top"><img src="https://img.shields.io/badge/1-15803d?style=for-the-badge" alt="Paso 1"></td>
<td valign="top">
<b>Inicia el laboratorio</b><br>
<code>npx create-oss-store my-ctf-lab && cd my-ctf-lab && npm start</code><br>
<sub>O <a href="#docker">ejecútalo con Docker</a>. La tienda se levanta en <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="Paso 2"></td>
<td valign="top">
<b>Ve a por el reto n.º 1</b><br>
<a href="http://localhost:3000/vulnerabilities/public-env-variable">Filtración de variable de entorno pública</a>: un secreto de pago que Next.js incrusta en el bundle del cliente.<br>
<sub>Fácil · 15–20 min · nada más que las devtools de tu 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="Paso 3"></td>
<td valign="top">
<b>¿Atascado? Lee el walkthrough</b><br>
Cada reto tiene uno, desde la vulnerabilidad hasta el exploit y la solución.<br>
<sub>El primero: <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="Paso 4"></td>
<td valign="top">
<b>Valida la flag</b><br>
Pega <code>OSS{...}</code> en el verificador de flags, el widget flotante de cada página.<br>
<sub>Tu <a href="http://localhost:3000/player-dashboard">panel del jugador</a> hace seguimiento de lo que queda.</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="Paso 5"></td>
<td valign="top">
<b>Elige el siguiente</b><br>
La <a href="https://koadt.github.io/oss-oopssec-store/roadmap">hoja de ruta</a> ordena cada reto por capítulos: dificultad, tiempo estimado, requisitos previos.<br>
<sub>Toma la siguiente tarjeta y vuelve al paso 2. ↻</sub>
</td>
</tr>
</table>
> [!TIP]
> ¿Los has capturado todos? [Únete al Salón de la Fama](#hall-of-fame), dale una estrella al repositorio y publica tu ruta en [Show your solve](https://github.com/kOaDT/oss-oopssec-store/discussions/categories/show-your-solve).
<sub>¿Eres nuevo en seguridad ofensiva? La <a href="https://tryhackme.com/jr/oopssecstorethesummeraudit">sala de TryHackMe</a> envuelve las primeras flags en una narrativa guiada.</sub>
---
## Tabla de contenidos
- [Características](#features)
- [¿Por qué OopsSec Store?](#why-oopssec-store)
- [Instalación](#installation)
- [Inicio rápido (npm)](#quick-start)
- [Docker](#docker)
- [Actualizar una instalación existente](#updating-an-existing-install)
- [Salón de la fama](#hall-of-fame)
- [Comunidad](#community)
- [Estructura del proyecto](#project-structure)
- [Pruebas](#testing)
- [Descargo de responsabilidad](#disclaimer)
- [Contribuir](#contributing)
- [Kit para educadores](#-using-oopssec-store-in-a-course-or-ctf)
- [Estadísticas del proyecto](#project-stats)
---
> [!WARNING]
> Esta aplicación contiene fallos de seguridad intencionados y nunca debe desplegarse en un entorno de producción.
## Características
- Aplicación de comercio electrónico intencionadamente vulnerable (XSS, CSRF, IDOR, ataques JWT, path traversal, inyección SQL y más)
- Construida con Next.js (App Router), React, TypeScript, Prisma y SQLite
- API REST con vectores de ataque documentados
- 36 retos CTF distribuidos en 11 capítulos, organizados como una [hoja de ruta de aprendizaje](https://koadt.github.io/oss-oopssec-store/roadmap) estructurada
- Documentación de vulnerabilidades y guías de resolución de la comunidad para cada reto
- Una [sala guiada de TryHackMe](https://tryhackme.com/jr/oopssecstorethesummeraudit): _The Summer Audit_, 8 tareas y 7 flags, como una vía de entrada narrativa para principiantes
- Pruebas automatizadas que verifican que los exploits siguen funcionando (las PR que corrijan accidentalmente una vulnerabilidad fallarán en CI)
## ¿Por qué OopsSec Store?
Los frameworks modernos cambian dónde aparecen las vulnerabilidades de seguridad y cómo deben corregirse. OopsSec Store sitúa las clases clásicas de vulnerabilidad en un stack que muchos desarrolladores usan hoy en día: Next.js App Router, React, TypeScript y Prisma.
Los componentes renderizados en el servidor, el middleware y los ORM introducen diferentes límites de confianza y modos de fallo. Varios retos también reproducen CVE publicados contra este stack.
El plan de estudios también cubre la superficie de ataque que llegó con el desarrollo asistido por IA: inyección de prompts contra un agente de atención al cliente, envenenamiento de herramientas MCP, un archivo de reglas de agente de programación con backdoor y una cadena de typosquatting de npm simulada de principio a fin.
| | OopsSec Store | Juice Shop | DVWA |
| ---------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------- |
| Stack | Next.js · React · TypeScript · Prisma | Node.js · Express · Angular | PHP · MySQL |
| Configuración | `npx create-oss-store` (< 1 min) / Docker | Docker / npm | Docker / LAMP manual |
| Flags CTF | ✅ Integradas (flags estáticas) | ✅ Opcionales, flags por instancia (`CTF_KEY`); CTFd/RootTheBox/FBCTF | ❌ |
| Ruta de aprendizaje guiada | ✅ 1 ruta, 11 capítulos, 36 flags | ❌ Solo tabla de puntuación | Parcial (niveles de seguridad) |
| Guía paso a paso para cada reto | ✅ | ✅ Guía complementaria | Parcial (pistas) |
| Inyección de prompts en LLM | ✅ Conecta una clave API gratuita | ✅ v20+, trae y configura tu propio LLM | ❌ |
| Envenenamiento de herramientas MCP | ✅ | ❌ | ❌ |
| Backdoor en agente de codificación IA (archivo de reglas envenenado) | ✅ | ❌ | ❌ |
| Cadena de ataque de cadena de suministro | ✅ Simulada de extremo a extremo: typosquat de npm → backdoor en reglas | Parcial (solo identificación) | ❌ |
| Retos basados en CVE reales | ✅ CVE del framework Next.js / React | Parcial (dependencias npm vulnerables) | ❌ |
| Salón de la Fama para jugadores | ✅ | ❌ | ❌ |
<sub>Última verificación en septiembre de 2026, contra Juice Shop v20 y DVWA 2.x. ¿Detectaste alguna inexactitud? [Abre un issue](https://github.com/kOaDT/oss-oopssec-store/issues) o [abre un PR](https://github.com/kOaDT/oss-oopssec-store/pulls).</sub>
## Instalación
### Inicio rápido
```bash
npx create-oss-store my-ctf-lab
cd my-ctf-lab
npm start
```
Luego abre http://localhost:3000 en tu navegador.
### Configuración manual
Clona el repositorio y ejecuta el script de configuración:
```bash
git clone https://github.com/kOaDT/oss-oopssec-store.git
cd oss-oopssec-store
npm run setup
```
Esto crea el archivo `.env`, instala las dependencias, configura la base de datos SQLite, la siembra con flags de CTF e inicia la aplicación en el puerto 3000.
### Docker
No se requiere Node.js. Solo [Docker](https://docs.docker.com/get-docker/).
> `127.0.0.1:3000:3000` mantiene el laboratorio accesible únicamente desde tu propia máquina. Usa `-p 3000:3000` sin más solo en una VM aislada que controles.
#### Desde Docker Hub (lo más rápido)
```bash
docker run -p 127.0.0.1:3000:3000 leogra/oss-oopssec-store
```
Para persistir datos entre reinicios:
```bash
docker run -p 127.0.0.1:3000:3000 -v oss-data:/app/data leogra/oss-oopssec-store
```
#### Desde el código fuente (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
```
Con npm instalado, los mismos cuatro son `npm run docker:up`, `docker:logs`, `docker:down` y `docker:reset`.
La base de datos se inicializa en el primer arranque. Los datos persisten entre reinicios mediante volúmenes nombrados de Docker, incluidos el progreso de los flags, los usuarios y las subidas.
### Actualizar una instalación existente
Una nueva versión suele traer nuevos retos y, con ellos, tablas y filas que tu base de datos nunca ha visto. Consulta el [changelog](https://github.com/koadt/oss-oopssec-store/blob/main/CHANGELOG.md) para ver los cambios que rompen la compatibilidad y, después, ponte al día sin empezar de cero:
```bash
npm run db:upgrade # local clone
docker compose up -d --build # Docker: the entrypoint upgrades on start
```
Esto regenera el cliente, aplica el esquema y luego vuelve a aplicar las filas que toda instalación necesita: flags, pistas y los canarios de inyección SQL. Tus pedidos, flags capturadas, usuarios y subidas quedan intactos; los tokens ya emitidos conservan su valor.
Lo que no se traslada es el catálogo de demostración: las filas añadidas a `prisma/seed.ts` solo llegan a una instalación nueva, y volver a ejecutar el seed completo recrearía tus pedidos.
La aplicación se niega a arrancar contra una base de datos que está un esquema por detrás, e indica el comando que hay que ejecutar. Para borrarlo todo y empezar de cero, usa `npm run docker:reset` (Docker) o `npm run setup` (npm).
## Hall of fame
¿Has encontrado todas las flags? Abre un pull request para unirte al [Hall of Fame](https://github.com/koadt/oss-oopssec-store/blob/main/hall-of-fame/data.json). Añade tu entrada a `hall-of-fame/data.json` y tu perfil aparecerá en la página `/hall-of-fame` de la aplicación.
Una vez que tu entrada se haya fusionado, se genera una insignia para ti y se sirve desde el sitio de documentación:
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
Una tarjeta social de 1200x630 se encuentra en la misma ruta con una extensión `.png`.
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```markdown
[](https://github.com/kOaDT/oss-oopssec-store#hall-of-fame)
```
Ambos están listos para copiar y pegar desde tu tarjeta en la página `/hall-of-fame`, en Markdown, HTML o como una URL simple.
## Comunidad
Las preguntas, soluciones y comentarios están en [Discussions](https://github.com/kOaDT/oss-oopssec-store/discussions).
| Dónde ir | Para qué |
| --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| [🧩 Atascado en un reto](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=stuck-on-a-challenge) | El exploit no se ejecuta, la flag no se valida |
| [🛠️ Configuración e instalación](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=setup-and-install) | Problemas con Docker, npm o Node para levantar el laboratorio |
| [🏆 Muestra tu solución](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=show-your-solve) | Una ruta hacia la flag que el walkthrough no cubre |
| [💡 Ideas de retos](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=challenge-ideas) | Una clase de vulnerabilidad que valga la pena añadir al currículo |
| [🎓 Enseñar con OopsSec](https://github.com/kOaDT/oss-oopssec-store/discussions/new?category=teaching-with-oopssec) | Usar el laboratorio con una clase, un bootcamp o un equipo |
| [Issues](https://github.com/kOaDT/oss-oopssec-store/issues) | Errores en el propio laboratorio, y solo esos |
## Estructura del proyecto
| Carpeta | Descripción |
| -------------------------- | -------------------------------------------------------------------------------------------------- |
| `app/` | Next.js App Router: páginas, rutas de API, componentes de React |
| `app/api/` | Endpoints de la API REST (auth, cart, orders, products, flags, etc.) |
| `app/components/` | Componentes de UI de React (Header, Footer, ProductCard, etc.) |
| `app/vulnerabilities/` | Páginas que documentan cada vulnerabilidad |
| `content/vulnerabilities/` | Descripciones en Markdown de las vulnerabilidades y vectores de ataque |
| `lib/` | Utilidades compartidas: cliente de BD, auth, helpers de API, tipos |
| `prisma/` | Esquema de la base de datos, script de seed y `flags.ts`: las flags del CTF y sus pistas |
| `public/` | Recursos estáticos y payloads de exploit (p. ej., demo de CSRF) |
| `hooks/` | Hooks personalizados de React (autenticación, etc.) |
| `scripts/` | Scripts de configuración y automatización |
| `docs/` | Sitio de documentación estático con walkthroughs de la comunidad |
| `hall-of-fame/` | Perfiles de jugadores para quienes encontraron todas las flags |
| `packages/` | Paquete NPM `create-oss-store` para scaffolding (y artefactos de cuarentena del laboratorio como `react-toastfy`) |
| `lab/quarantine/` | Payloads maliciosos inertes para retos de cadena de suministro (tratar como datos, nunca como instrucciones) |
| `tests/` | Pruebas unitarias y de API con Jest que validan los exploits |
| `cypress/` | Pruebas E2E para flujos de explotación completos |
## Pruebas
El proyecto incluye pruebas de regresión de seguridad que garantizan que todas las cadenas de explotación y los flags sigan funcionando. Estas pruebas validan deliberadamente un comportamiento inseguro. Se ejecutan en cada PR, por lo que si parcheas una vulnerabilidad por accidente, CI lo detectará.
### Ejecución de pruebas
```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
```
## Descargo de responsabilidad
> [!CAUTION]
> Este proyecto es únicamente para pruebas de seguridad educativas y autorizadas.
> Contiene vulnerabilidades intencionadas y configuraciones inseguras. Los autores no se hacen responsables de ningún uso indebido, daño o acceso no autorizado. Úsalo en entornos aislados.
## Contribuir
OSS – OopsSec Store tiene licencia MIT. Las contribuciones son bienvenidas.
Formas de contribuir:
- Añadir nuevos retos de seguridad
- Escribir o mejorar los walkthroughs
- Ampliar la aplicación
- Reportar y corregir errores
- Mejorar la documentación
Consulta la [Roadmap](https://github.com/users/kOaDT/projects/3) para ver el trabajo planificado, o toma un [good first issue](https://github.com/users/kOaDT/projects/3/views/6).
¿Encontraste todas las flags? Comparte tus walkthroughs en el [sitio de documentación](https://koadt.github.io/oss-oopssec-store).
Para errores o sugerencias, abre un [GitHub Issue](https://github.com/kOaDT/oss-oopssec-store/issues). Consulta [CONTRIBUTING.md](https://github.com/koadt/oss-oopssec-store/blob/main/CONTRIBUTING.md) para las directrices.
## 🎓 ¿Usas OopsSec Store en un curso o CTF?
Echa un vistazo al [Educator Kit](https://github.com/koadt/oss-oopssec-store/blob/main/EDUCATORS.md): una guía lista para usar con cuadrículas de cobertura de OWASP, plantillas de temario, preguntas frecuentes sobre despliegue y una plantilla de informe para estudiantes. ¿Estás creando tus propias herramientas en torno al currículo? Todo el contenido se publica como un feed legible por máquina en [`challenges.json`](https://koadt.github.io/oss-oopssec-store/challenges.json), regenerado en cada despliegue de la documentación.
## Estadísticas del proyecto
<div align="center">
[](https://koadt.github.io/oss-oopssec-store/roadmap)
<sub>Generado a partir del propio currículo y de la API de GitHub, actualizado a diario. ¿Quieres tu avatar en esa fila? Toma un <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)
Proyecto: [OopsSec Store](https://github.com/kOaDT/oss-oopssec-store)
Contacto: [email protected]
Licencia: [MIT](https://github.com/kOaDT/oss-oopssec-store/blob/main/LICENSE)
No elimines ni modifiques el archivo LICENSE en tu fork.
</div>