Saltar al contenido

Usando OWASP Juice Shop - Enfrentando desafíos intermedios en seguridad web

Índice

Este artículo es el tercero de una serie sobre OWASP Juice Shop. Puedes consultar los posts anteriores sobre instalación en un entorno local y resolución de desafíos básicos.

Introducción a desafíos intermedios

Después de completar los desafíos básicos, es momento de incrementar el nivel y enfrentarnos a vulnerabilidades más complejas. Los desafíos de dificultad media (★★★) en OWASP Juice Shop nos permiten explorar conceptos de seguridad más avanzados que representan amenazas significativas en aplicaciones web reales.

En este post, nos adentraremos en dos vulnerabilidades críticas: - Inyección SQL (★★★) - Falsificación de comentarios (★★★)

Estas vulnerabilidades forman parte de las categorías más frecuentes en el OWASP Top 10, el estándar de referencia para las principales amenazas de seguridad en aplicaciones web.

Preparación para desafíos de nivel intermedio

Herramientas recomendadas

Para enfrentar desafíos de mayor complejidad, utilizaremos principalmente las herramientas que ya vienen incorporadas en nuestro navegador:

  1. Herramientas de desarrollo del navegador:

    • Developer Tools de Chrome (F12).
    • Developer Tools de Firefox (F12).
    • Panel Network/Red para monitorizar peticiones HTTP.
    • Consola JavaScript para ejecutar scripts personalizados.
    • Panel Elements/Inspector para examinar y modificar DOM.
  2. Opcional: Extensiones de navegador:

    • Modify Headers para Chrome/Firefox: Permite modificar encabezados HTTP fácilmente.
    • EditThisCookie: Para manipular cookies del navegador.
  3. Opcional: Herramienta de gestión de peticiones HTTP:

Configuración del entorno de trabajo

Para sacar el máximo provecho de las herramientas nativas del navegador:

  1. Abre las DevTools de tu navegador (F12 o Clic derecho → Inspeccionar).
  2. Configura las siguientes opciones:
    • Activa “Preserve log/Persist logs” en la pestaña Network para mantener el historial entre navegaciones.
    • Habilita “Disable cache” para evitar que el contenido se almacene en caché.
    • En Chrome, puedes activar “JavaScript source maps” para ver código JavaScript más legible.

Desafío 1: Inyección SQL - Login como Administrador (★★★)

Comprendiendo la Inyección SQL

La inyección SQL es una vulnerabilidad que ocurre cuando una aplicación inserta datos proporcionados por el usuario directamente en una consulta SQL sin validarlos adecuadamente. Un atacante puede manipular estas consultas para:

  • Eludir autenticación.
  • Leer datos sensibles.
  • Modificar datos en la base de datos.
  • Eliminar información.
  • Ejecutar comandos de administración.

Identificando el punto vulnerable

Para este desafío, nuestro objetivo es acceder a la cuenta del administrador mediante inyección SQL:

  1. Ve a la página de inicio de sesión (Login) en Juice Shop.
  2. Abre las herramientas de desarrollo del navegador (F12) y selecciona la pestaña “Network/Red”.
  3. Intenta ingresar con credenciales incorrectas, por ejemplo:

  4. Observa la respuesta del servidor en la pestaña Network. Si hay errores detallados, podrían revelar información sobre la estructura de la consulta SQL.

Construyendo el ataque

Ahora intentaremos un ataque de inyección SQL básico:

  1. En el campo de Email, introduce: ' OR 1=1--.
  2. En el campo de Password, puedes poner cualquier cosa.

Inyección SQL en formulario de login

¿Qué hace esta inyección? - El apóstrofe ' cierra la cadena de texto en la consulta SQL - OR 1=1 siempre evaluará como verdadero - -- comenta el resto de la consulta SQL, eliminando condiciones adicionales

La consulta original probablemente era algo como:

SELECT * FROM Users WHERE email = 'INPUT_EMAIL' AND password = 'HASHED_PASSWORD'

Con nuestra inyección, se transforma en:

SELECT * FROM Users WHERE email = '' OR 1=1-- ' AND password = 'HASHED_PASSWORD'

El resultado: la condición siempre es verdadera y el servidor nos autoriza como el primer usuario en la base de datos, que suele ser el administrador.

  1. Presiona “Log in” y verás que has iniciado sesión como administrador.
  2. Verifica en la esquina superior derecha que estás autenticado como “[email protected]”.

Sesión iniciada como administrador

  1. Ahora puedes acceder a las herramientas del administrador.

Análisis y mitigación

Esta vulnerabilidad demuestra por qué la inyección SQL sigue siendo una de las amenazas más críticas para aplicaciones web. Para prevenir este tipo de ataques, los desarrolladores deberían:

  1. Usar consultas parametrizadas/preparadas, es decir, nunca concatenar directamente la entrada del usuario en consultas SQL.
  2. Implementar ORM (Object-Relational Mapping).
  3. Validar entrada del usuario al comprobar tipo, longitud y formato.
  4. Aplicar principio de menor privilegio en la cuenta de la base de datos al asegurarse que tiene permisos mínimos.
  5. Sanear entrada de caracteres especiales escapando caracteres como ‘ “ ; – /.

Desafío 2: Forged Feedback - Publicar comentarios como otro usuario (★★★)

Entendiendo la manipulación de parámetros

El desafío “Forged Feedback” requiere enviar retroalimentación haciéndose pasar por otro usuario. Esta vulnerabilidad representa un fallo en los controles de autorización y validación en el backend.

Investigando la funcionalidad

  1. Primero, exploremos la funcionalidad normal de retroalimentación:

    • Inicia sesión con tu cuenta regular.
    • Navega hasta el formulario de contacto (Customer Feedback).
    • Observa que puedes enviar comentarios que aparecerán con tu nombre de usuario.
  2. Utiliza las herramientas de desarrollo para monitorear el tráfico cuando envías un comentario:

    • Abre las DevTools (F12).
    • Ve a la pestaña “Network”.
    • Completa y envía el formulario de comentarios.
    • Identifica la petición POST a /api/Feedbacks.

Interceptando petición de feedback

  1. Examina el contenido de la petición. Verás algo como:

    {
    "comment": "Este producto es excelente",
    "rating": 5,
    "captchaId": 12,
    "captcha": "45",
    "UserId": 2
    }

    El campo UserId es la clave para este desafío.

    Ejecutando el ataque usando DevTools

    Ahora utilizaremos las herramientas de desarrollo del navegador para realizar el ataque:

    Método 1: Modificando el DOM

    1. Localiza el campo oculto UserId en el DOM usando el inspector, algo como: html <input _ngcontent-c23 hidden id="userId" type="text" class="ng-untouched ng-pristine ng-valid">
  2. Modifica sus propiedades para hacerlo visible:

    • Haz clic derecho → Inspeccionar.
    • En el panel de Elementos, elimina el atributo hidden.
    • Ahora puedes cambiar directamente el valor del campo UserId.
  3. Ingresa el ID de otro usuario (por ejemplo, 1 para el administrador normalmente) y envía el formulario.

Campo UserId revelado

Método 2: Usando la consola JavaScript con fetch API

Si el método anterior no funciona o quieres una aproximación más programática, puedes usar la consola JavaScript:

  1. Abre la consola JavaScript en las DevTools.
  2. Para obtener un captchaId y captcha válidos, primero realiza una petición normal y observa los valores en la pestaña Network usando el siguiente código:
// Primero, obtén un captcha válido
fetch('/rest/captcha/')
  .then(response => response.json())
  .then(data => {
    console.log('Usar estos valores:', data);
    // Ahora puedes usar data.captchaId y data.answer en tu petición falsificada
  });
  1. Ejecuta el siguiente código para crear una petición personalizada:
fetch('/api/Feedbacks', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    // Si tienes un token de autenticación activo, se incluirá automáticamente
  },
  body: JSON.stringify({
    comment: "Este comentario ha sido falsificado",
    rating: 5,
    captchaId: 12,  // Necesitarás obtener un captchaId válido
    captcha: "45",  // Y su respuesta correspondiente
    UserId: 1       // ID del usuario que quieres suplantar (1 suele ser admin)
  })
})
.then(response => response.json())
.then(data => console.log('Éxito:', data))
.catch(error => console.error('Error:', error));

Código en la consola de javascript para fetch captcha

  1. Verifica el éxito navegando a About Us, donde se muestran los comentarios recientes. Deberías ver tu comentario atribuido a otro usuario.

Comentario falsificado

Mitigaciones para este tipo de vulnerabilidad

Esta vulnerabilidad es un ejemplo de controles de acceso rotos. Para prevenirla:

  1. No confiar en datos controlados por el cliente.
  2. El backend debe obtener el ID del usuario de la sesión autenticada.
  3. Implementar autorización exhaustiva.
  4. Toda validación crítica debe ocurrir en el servidor.
  5. Registrar quién realiza cada acción para detectar anomalías.

Las herramientas de desarrollo de los navegadores son poderosas

Para enfrentar desafíos de nivel intermedio, es crucial dominar algunas técnicas de análisis usando las herramientas de desarrollo del navegador:

1. Análisis de tráfico HTTP con DevTools

Aprende a examinar peticiones y respuestas HTTP en detalle:

  • En la pestaña Network, selecciona una petición y revisa la sección Headers.
  • Examina los datos enviados en peticiones POST/PUT.
  • Analiza la respuesta del servidor en formato legible.
  • Evalúa el rendimiento y tiempos de respuesta.

2. Manipulación con la consola JavaScript

La consola de JavaScript es extremadamente poderosa para:

  • Ejecutar peticiones personalizadas con fetch() o XMLHttpRequest.
  • Manipular cookies con document.cookie.
  • Modificar el DOM en tiempo real.
  • Inyectar scripts o evaluar expresiones.

Ejemplo para manipular cookies:

// Leer todas las cookies
console.log(document.cookie);

// Establecer una cookie
document.cookie = "token=valor_manipulado; path=/";

3. Reconocimiento pasivo con Sources

La pestaña Sources/Fuentes te permite: - Examinar todo el código JavaScript de la aplicación. - Buscar comentarios o credenciales codificadas. - Identificar endpoints API no documentados. - Comprender la lógica de validación del cliente.

Conclusiones y lecciones que te pueden servir

Los desafíos de nivel intermedio nos enseñan importantes lecciones de seguridad:

  1. Toda entrada debe ser validada y saneada en el servidor.
  2. Implementar múltiples capas de seguridad.
  3. El OWASP Top 10 sigue siendo relevante porque muchas aplicaciones cometen los mismos errores.

Principios clave para desarrolladores:

  • Aceptar solo lo explícitamente permitido.
  • Usar consultas parametrizadas para SQL.
  • Verificar permisos en cada operación.
  • Detectar actividades sospechosas.
  • Reducir ventana de explotación.

Avanzando hacia herramientas especializadas

Aunque en este artículo hemos utilizado principalmente las herramientas de desarrollo integradas en el navegador, que son sorprendentemente poderosas y accesibles, el próximo paso natural en tu evolución como pentester sería familiarizarte con herramientas especializadas de interceptación de proxy como:

OWASP ZAP (Zed Attack Proxy)

Una herramienta gratuita y de código abierto que actúa como un “hombre en el medio” entre tu navegador y los servidores web, permitiéndote:

  • Interceptar y modificar cualquier petición y respuesta HTTP/HTTPS.
  • Escanear automáticamente vulnerabilidades.
  • Realizar ataques de fuzzing con distintos payloads.
  • Analizar el tráfico web para encontrar puntos débiles.

Burp Suite

La versión Community (gratuita) ofrece capacidades potentes:

  • Proxy de interceptación con editor integrado para manipular peticiones.
  • Repeater para enviar la misma petición múltiples veces con modificaciones.
  • Decoder para codificar/decodificar datos en varios formatos.
  • Sequencer para analizar la aleatoriedad en tokens.

Estas herramientas te permitirán observar y manipular el tráfico HTTP/HTTPS con mayor precisión, automatizar ciertas tareas y descubrir vulnerabilidades más complejas que serían difíciles de identificar usando solo las DevTools del navegador.


Nota importante: Las técnicas mostradas en este artículo deben utilizarse exclusivamente en entornos controlados como OWASP Juice Shop. Realizar estas acciones en aplicaciones reales sin autorización explícita es ilegal y puede tener graves consecuencias legales.