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:
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.
Opcional: Extensiones de navegador:
- Modify Headers para Chrome/Firefox: Permite modificar encabezados HTTP fácilmente.
- EditThisCookie: Para manipular cookies del navegador.
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:
- Abre las DevTools de tu navegador (F12 o Clic derecho → Inspeccionar).
- 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:
- Ve a la página de inicio de sesión (Login) en Juice Shop.
- Abre las herramientas de desarrollo del navegador (F12) y selecciona la pestaña “Network/Red”.
Intenta ingresar con credenciales incorrectas, por ejemplo:
- Email:
[email protected]
- Password:
claveincorrecta
- Email:
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:
- En el campo de Email, introduce:
' OR 1=1--
. - En el campo de Password, puedes poner cualquier cosa.
¿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.
- Presiona “Log in” y verás que has iniciado sesión como administrador.
- Verifica en la esquina superior derecha que estás autenticado como “[email protected]”.
- 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:
- Usar consultas parametrizadas/preparadas, es decir, nunca concatenar directamente la entrada del usuario en consultas SQL.
- Implementar ORM (Object-Relational Mapping).
- Validar entrada del usuario al comprobar tipo, longitud y formato.
- Aplicar principio de menor privilegio en la cuenta de la base de datos al asegurarse que tiene permisos mínimos.
- 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
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.
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.
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
- 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">
- Localiza el campo oculto
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.
Ingresa el ID de otro usuario (por ejemplo, 1 para el administrador normalmente) y envía el formulario.
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:
- Abre la consola JavaScript en las DevTools.
- 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
});
- 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));
- Verifica el éxito navegando a About Us, donde se muestran los comentarios recientes. Deberías ver tu comentario atribuido a otro usuario.
Mitigaciones para este tipo de vulnerabilidad
Esta vulnerabilidad es un ejemplo de controles de acceso rotos. Para prevenirla:
- No confiar en datos controlados por el cliente.
- El backend debe obtener el ID del usuario de la sesión autenticada.
- Implementar autorización exhaustiva.
- Toda validación crítica debe ocurrir en el servidor.
- 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()
oXMLHttpRequest
. - 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:
- Toda entrada debe ser validada y saneada en el servidor.
- Implementar múltiples capas de seguridad.
- 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.