Ya sabes qué es ZAP y de qué piezas se compone. Ahora vamos a tenerlo funcionando y, sobre todo, bien configurado para probar BazarNube. Instalar ZAP es fácil; el trabajo real está en la configuración: interceptar HTTPS con el certificado raíz, definir un contexto y un scope que acoten qué se puede tocar, y montar la autenticación para llegar a las zonas protegidas de BazarNube (panel de vendedor, checkout, API de pedidos). Sin esa preparación, ZAP solo verá la parte pública de la tienda y se perderá justo donde viven los hallazgos más jugosos.

Contenido

  1. Formas de instalar ZAP
  2. Instalación con Docker
  3. Primeros pasos en la GUI
  4. Configurar el navegador y el proxy
  5. Instalar el certificado raíz para HTTPS
  6. Definir el contexto y el scope
  7. Configurar la autenticación de BazarNube
  8. Verificar que todo funciona

Formas de instalar ZAP

ZAP se distribuye de varias maneras. Elige según el uso:

Método Cuándo usarlo Nota
Instalador (Windows/macOS/Linux) Uso interactivo con GUI en tu equipo Incluye un JRE embebido en versiones recientes
Paquete .tar.gz / cross-platform Linux sin instalador, servidores Requiere Java 17+
Docker (zaproxy/zap-stable) CI/CD, entornos reproducibles, headless El método preferido para automatizar
Paquete de la distro (apt, snap) Comodidad en Linux Puede ir por detrás en versión

Instalación en Linux desde el paquete cross-platform:

# Descargar y descomprimir (ajusta la version a la ultima estable)
cd /opt
curl -L -o ZAP.tar.gz \
  https://github.com/zaproxy/zaproxy/releases/download/v2.15.0/ZAP_2.15.0_Linux.tar.gz
tar -xzf ZAP.tar.gz
cd ZAP_2.15.0

# Lanzar la GUI
./zap.sh

# O lanzarlo en modo demonio (sin GUI), escuchando la API en el 8090
./zap.sh -daemon -port 8090 -host 127.0.0.1

Comprueba que tienes Java disponible si usas el paquete cross-platform:

java -version   # Debe ser 17 o superior para ZAP 2.14+

Instalación con Docker

Para BazarNube usaremos Docker con frecuencia, porque el staging ya corre en contenedores y así ZAP vive en el mismo mundo. Imágenes oficiales:

  • zaproxy/zap-stable: última versión estable (la que usaremos).
  • zaproxy/zap-weekly: build semanal, para funcionalidades muy recientes.
# Descargar la imagen estable
docker pull zaproxy/zap-stable

# Arrancar ZAP en modo demonio, exponiendo la API en el 8090
docker run -u zap -p 8090:8090 -i zaproxy/zap-stable \
  zap.sh -daemon -host 0.0.0.0 -port 8090 \
  -config api.addrs.addr.name=.* \
  -config api.addrs.addr.regex=true

# Lanzar la GUI de ZAP accesible por navegador (webswing) en el 8080
docker run -u zap -p 8080:8080 -p 8090:8090 -i zaproxy/zap-stable zap-webswing.sh

-config api.addrs.addr.* autoriza a los clientes de la API. En redes reales, restringe las direcciones en lugar de usar .*. Lo profundizaremos en 06-04, cuando la API sea protagonista.

Para que ZAP en Docker alcance el staging de BazarNube que también corre en Docker, conéctalos a la misma red:

docker network create bazarnube-net
# ... arranca la app de BazarNube en esa red ...
docker run --network bazarnube-net -u zap -i zaproxy/zap-stable \
  zap.sh -daemon -host 0.0.0.0 -port 8090
# Dentro de esa red, la app es accesible por su nombre de servicio, p. ej. http://web:3000

Primeros pasos en la GUI

Al abrir la GUI por primera vez, ZAP pregunta si quieres persistir la sesión. Para trabajo serio en BazarNube elige "Yes, I want to persist this session": así conservas árbol de sitios, alertas e historial.

Zonas principales de la interfaz:

  • Sites (izquierda): el árbol de todo lo descubierto de BazarNube.
  • Request / Response (centro): el detalle de la petición seleccionada.
  • History / Search / Alerts / Output (abajo): pestañas de trabajo. Alerts es donde vivirás.
  • Barra de modo (arriba a la izquierda): el desplegable Safe/Protected/Standard/Attack que vimos en 06-01. Ponlo en Protected.

Configurar el navegador y el proxy

ZAP escucha por defecto como proxy en localhost:8080. Tienes dos caminos:

Opción A — Navegador integrado (recomendado para empezar). ZAP puede lanzar un Firefox/Chrome ya preconfigurado con el proxy y el certificado puestos. En la GUI, botón "Manual Explore" o "Explore your application" y Launch Browser. Es la vía sin fricción.

Opción B — Tu propio navegador. Apunta el proxy del sistema o del navegador a ZAP. Ejemplo de configuración manual del proxy:

Servidor proxy HTTP:  127.0.0.1
Puerto:               8080
Usar el mismo proxy para HTTPS: si

Con Firefox y un perfil dedicado por línea de comandos:

# Firefox usando ZAP como proxy (perfil aislado para no ensuciar el tuyo)
firefox -no-remote -profile /tmp/zap-profile \
  -setDefaultBrowser about:blank &
# Luego configura el proxy manual 127.0.0.1:8080 en ese perfil

Si prefieres una extensión, FoxyProxy permite alternar el proxy de ZAP con un clic.

Instalar el certificado raíz para HTTPS

BazarNube usa HTTPS. Para que ZAP pueda ver y modificar el tráfico cifrado, actúa como un man-in-the-middle legítimo: genera certificados al vuelo firmados por su propia CA raíz (ZAP Root CA). Tu navegador debe confiar en esa CA, o verás errores de certificado en cada petición.

Pasos:

  1. En la GUI: Tools > Options > Network > Server Certificates (en versiones antiguas, Dynamic SSL Certificates).
  2. Pulsa Save para exportar el certificado raíz a un fichero, p. ej. zap_root_ca.cer.
  3. Impórtalo como CA de confianza en el navegador o en el sistema.

Exportar el certificado por línea de comandos (útil para automatizar):

# Con ZAP corriendo como demonio y la API en el 8090
curl -s "http://127.0.0.1:8090/OTHER/network/other/rootCaCert/" \
  -o zap_root_ca.cer

Confiar en la CA en Linux (Debian/Ubuntu):

sudo cp zap_root_ca.cer /usr/local/share/ca-certificates/zap_root_ca.crt
sudo update-ca-certificates

En Firefox: Ajustes > Privacidad y seguridad > Certificados > Ver certificados > Autoridades > Importar y marca "Confiar para identificar sitios web".

Seguridad: la clave privada de esa CA vive en tu ZAP. Cualquiera que la tenga podría interceptar tu tráfico. No compartas tu certificado raíz de ZAP ni lo dejes instalado en navegadores de uso diario. Genera uno nuevo periódicamente desde el mismo panel.

Definir el contexto y el scope

Un contexto en ZAP es una agrupación lógica de URLs que representan una aplicación y sus reglas: qué URLs le pertenecen (scope), cómo se autentica, qué usuarios hay, qué se excluye. Es la unidad clave para trabajar con foco.

Para BazarNube crearemos un contexto BazarNube-Staging:

  1. En el árbol Sites, clic derecho sobre el dominio de staging > Include in Context > New Context.
  2. Define el scope con expresiones regulares de inclusión y exclusión.

Ejemplo de patrones de scope:

Tipo Patrón Motivo
Incluir https://staging\.bazarnube\.local.* Toda la app de staging
Excluir https://staging\.bazarnube\.local/logout.* Evita que el spider cierre tu sesión
Excluir https://staging\.bazarnube\.local/api/payments.* No disparar cobros reales de prueba
Excluir .*pay\.tercero\.com.* Pasarela externa: fuera de scope

El patrón de exclusión de /logout es uno de los trucos más útiles: sin él, el spider entra en el enlace de "Cerrar sesión", pierde la sesión autenticada y deja de ver las zonas privadas.

Configurar la autenticación de BazarNube

Gran parte del riesgo de BazarNube (el IDOR de /api/orders/{id}, el panel de vendedor) está detrás del login. Para que ZAP pruebe esas zonas, hay que enseñarle a autenticarse y a mantener la sesión.

BazarNube usa login por formulario que devuelve un JWT en una cookie de sesión. Configuración en el contexto:

1. Método de autenticación (Context > Authentication). Elige Form-based Authentication y define la petición de login:

Login form target URL:  https://staging.bazarnube.local/api/auth/login
Login request POST data: {"email":"{%username%}","password":"{%password%}"}
Content-Type:            application/json

2. Indicadores de sesión — cómo sabe ZAP si sigue autenticado:

  • Logged-in indicator (regex que aparece SOLO autenticado): \"role\":\"seller\" o el texto "Cerrar sesión".
  • Logged-out indicator (regex que aparece al perder sesión): Iniciar sesión o un 401.

3. Gestión de sesión (Session Management). Para JWT en cabecera, usa HTTP Header Based Session Management o Cookie-based si viaja en cookie.

4. Usuarios (Context > Users). Crea usuarios de prueba de staging (nunca credenciales reales de producción):

Usuario 1:  comprador_test  / Password123!
Usuario 2:  vendedor_test   / Password123!

Tener dos usuarios permite probar control de acceso (¿puede comprador_test leer los pedidos de vendedor_test?), que es la esencia del IDOR del backlog.

Cómo encaja todo el flujo de sesión:

graph TD
    A[ZAP envia POST de login] --> B{Respuesta contiene<br/>logged-in indicator?}
    B -->|Si| C[Sesion valida: guarda token/cookie]
    B -->|No| D[Reintenta autenticacion]
    C --> E[Spider y escaner usan la sesion]
    E --> F{Se detecta<br/>logged-out indicator?}
    F -->|Si| D
    F -->|No| E

Verificación rápida con la API de ZAP (contexto y usuario ya creados):

# Forzar autenticacion de un usuario y comprobar que la sesion es valida
curl "http://127.0.0.1:8090/JSON/users/action/setUserEnabled/" \
  --data-urlencode "contextId=1" \
  --data-urlencode "userId=1" \
  --data-urlencode "enabled=true"

Verificar que todo funciona

Antes de escanear (lección 06-03), confirma esta lista:

  • [ ] ZAP arranca (GUI o demonio) y el proxy escucha en 8080 / API en 8090.
  • [ ] El navegador enruta por ZAP y no salen errores de certificado en HTTPS.
  • [ ] Al navegar BazarNube, aparecen peticiones en History y crece el árbol Sites.
  • [ ] Existe el contexto BazarNube-Staging con scope de inclusión/exclusión correcto.
  • [ ] Al Force User autenticado, ZAP accede al panel de vendedor sin pedir login.

Prueba de humo del proxy con curl:

# Pasar una peticion a traves del proxy de ZAP e ignorar la CA del sistema
curl -x http://127.0.0.1:8080 -k https://staging.bazarnube.local/ -I
# Deberia responder 200 y aparecer la peticion en el History de ZAP

Errores Comunes y Consejos

  • Errores de certificado en cada página: no has importado (o no has confiado en) la ZAP Root CA. Reexpórtala e impórtala como autoridad.
  • El spider cierra tu sesión: falta excluir /logout del scope o no configuraste el logged-out indicator.
  • ZAP no ve el tráfico del frontend React: el fetch/XHR de la SPA puede ignorar el proxy del sistema; usa el navegador integrado de ZAP o configura el proxy en el propio navegador, no solo en el SO.
  • Usar credenciales reales de producción: nunca. Crea usuarios de prueba exclusivos de staging.
  • Puerto 8080 ocupado: otra app (o Tomcat del legacy Java) usa el 8080. Cambia el puerto de ZAP con -port o en Tools > Options > Network > Local Servers/Proxies.
  • Consejo: guarda el contexto exportado (Context > Export Context) como fichero versionado; lo reutilizarás en la automatización de 06-04.

Ejercicios

Ejercicio 1. Estás interceptando BazarNube por HTTPS y el navegador muestra "La conexión no es segura" en todas las páginas. ¿Cuál es la causa más probable y cómo lo resuelves?

Ejercicio 2. Escribe los patrones de inclusión y exclusión del scope para un contexto que cubra https://staging.bazarnube.local, evite que el spider cierre sesión y no toque la pasarela externa pay.tercero.com.

Ejercicio 3. Quieres que ZAP pruebe el panel de vendedor, que exige login. Enumera los cuatro elementos que debes configurar en el contexto para que ZAP mantenga la sesión autenticada.

Soluciones

Solución 1. El navegador no confía en la ZAP Root CA, que firma al vuelo los certificados que ZAP presenta. Solución: exportar el certificado raíz desde Tools > Options > Network > Server Certificates, importarlo como autoridad de confianza en el navegador/sistema y recargar. Alternativa rápida: usar el navegador integrado de ZAP, que ya lo trae configurado.

Solución 2.

  • Incluir: https://staging\.bazarnube\.local.*
  • Excluir: https://staging\.bazarnube\.local/logout.*
  • Excluir: .*pay\.tercero\.com.*

Los patrones son expresiones regulares; recuerda escapar los puntos.

Solución 3. (1) Método de autenticación (form-based con la URL y el POST data de /api/auth/login); (2) indicadores de sesión (logged-in y logged-out) para que ZAP detecte si sigue autenticado; (3) gestión de sesión (cookie o cabecera según viaje el JWT); (4) al menos un usuario de prueba con sus credenciales de staging.

Conclusión

Con ZAP instalado, el certificado raíz confiado, el proxy enrutando el tráfico de BazarNube y un contexto con scope y autenticación bien definidos, tienes la plataforma lista para trabajar en serio. Toda esta preparación no es burocracia: es lo que permite que el escáner llegue a las zonas autenticadas donde de verdad hay riesgo, sin salirse a atacar terceros.

En la siguiente lección, 06-03 Escaneo de Vulnerabilidades, ponemos la maquinaria en marcha: exploraremos BazarNube con el spider y el AJAX Spider, dejaremos trabajar al escáner pasivo, lanzaremos el escáner activo con una política adecuada, y aprenderemos a interpretar las alertas, hacer triage de falsos positivos y generar informes que mapeen los hallazgos al Top Ten y al backlog de BazarNube.

Curso de OWASP: Directrices y Estándares para la Seguridad en Aplicaciones Web

Módulo 1: Introducción a OWASP

Módulo 2: Principales Proyectos de OWASP

Módulo 3: OWASP Top Ten 2021 en Profundidad

Módulo 4: OWASP ASVS (Application Security Verification Standard)

Módulo 5: OWASP SAMM (Software Assurance Maturity Model)

Módulo 6: OWASP ZAP (Zed Attack Proxy)

Módulo 7: Buenas Prácticas y Recomendaciones

Módulo 8: Ejercicios Prácticos y Casos de Estudio

Módulo 9: Evaluación y Certificación

© Copyright 2026. Todos los derechos reservados