
Laboratorios web de vulnerabilidades atómicos. Una falla OWASP por aplicación — Flask + Docker minimalista, intencionalmente roto para estudio práctico con Burp Suite.
⚠️ Intencionalmente vulnerable. Ejecutar solo localmente. Nunca exponer a internet ni a una red compartida.
Lee esto en otros idiomas: Português (Brasil)
Hito — v1.0: la serie web ahora cubre las diez categorías del OWASP Top 10 2021 (A01–A10), a través de 38 átomos. Consulta la versión v1.0.
atomicvulns es una colección de aplicaciones web atómicas — cada una es diminuta, aislada y está enfocada en una única vulnerabilidad del OWASP Top 10. Cada átomo incluye la app vulnerable, la versión corregida, un diff comentado entre ambas y un recorrido práctico del exploit.
Esto no es otro DVWA o Juice Shop. Ya existen aplicaciones vulnerables monolíticas. Lo que distingue a atomicvulns es el atomismo radical: una app por fallo, rápida de leer, rápida de explorar. Mapeas la causa en el código → la petición/respuesta → el exploit sin tener que entender primero una aplicación entera.
La serie web (Python/Flask) cubre las diez categorías del OWASP Top 10 2021 — 38 átomos en total:
| Categoría | Átomos |
|---|---|
| A01 — Control de acceso roto | idor-numeric-id, path-traversal-basic, idor-uuid-guessable, bola-rest, csrf-basic, open-redirect, mass-assignment |
| A02 — Fallos criptográficos | jwt-none-alg, jwt-weak-secret, jwt-key-confusion, crypto-weak-hash, crypto-ecb-mode |
| A03 — Inyección | sqli-union-basic, xss-reflected, sqli-blind-boolean, sqli-blind-time, xss-stored, command-injection-basic, ssti-jinja, xss-dom, nosql-injection-mongo, ldap-injection, sqli-second-order |
| A04 — Diseño inseguro | race-condition-basic |
| A05 — Configuración de seguridad incorrecta | xxe-basic, xxe-blind-oob, debug-enabled, cors-wildcard |
| A06 — Componentes vulnerables y desactualizados | cve-demo |
| A07 — Fallos de identificación y autenticación | session-fixation, weak-password-reset |
| A08 — Fallos de integridad de software y datos | deserialization-pickle, prototype-pollution, deserialization-node |
| A09 — Fallos de registro y monitoreo de seguridad | logging-failures-demo |
| A10 — Falsificación de peticiones del lado del servidor (SSRF) | ssrf-basic, ssrf-blind-oob, ssrf-cloud-metadata |
La serie API (TypeScript/Express) apunta al OWASP API Security Top 10 2023. Su primera fase — Autorización: Objeto y Función — está publicada: cinco átomos en dos categorías, cerrando los ejes de autorización a nivel de objeto y a nivel de función. El plan completo y ordenado vive en su ROADMAP.
| Categoría | Átomos |
|---|---|
| API1 — Autorización rota a nivel de objeto | bola-sequential-id, bola-uuid-leaked, bola-nested-resource |
| API5 — Autorización rota a nivel de función | bfla-admin-function, bfla-method-based |
Estudiantes de pentesting y aprendices de AppSec que ya conocen lo básico de HTTP y la terminal, usan (o están aprendiendo a usar) Burp Suite, y quieren un laboratorio enfocado donde cada ejercicio sea lo bastante corto como para terminarlo en una sola sesión. El material está escrito para alguien que aplicará esto en una carrera de pentesting — Burp es la herramienta principal, la UI es solo contexto.
Cada átomo vive en su propia carpeta — atoms/web/A0X-<category>/<atom-id>/ para la serie web, atoms/api/APIX-<category>/<atom-id>/ para la serie API — y se distribuye con un docker-compose.yml. Un script contenedor en la raíz, ./atom, los controla:
./atom list # show all available atoms
./atom up <atom-id> # start the vulnerable + fixed pair
./atom down <atom-id> # stop and remove containers
./atom doctor # sanity-check your local setup
Por ejemplo:
./atom up sqli-union-basic # web series
# vulnerable → http://127.0.0.1:8001
# fixed → http://127.0.0.1:8101
./atom up bola-sequential-id # API series
# vulnerable → http://127.0.0.1:8201
# fixed → http://127.0.0.1:8301
Cada átomo se enlaza únicamente a 127.0.0.1. Nunca cambies eso — estas aplicaciones están intencionalmente rotas.
Publicado bajo la Licencia MIT. Si haces un fork de este repositorio para material educativo, se requiere atribución.