Skip to main content

Cómo prevenir vulnerabilidades de redireccionamiento abierto en Laravel

Escrito por
Headshot of Kevin Kimani

Kevin Kimani

feature laravel open redirect

27 de diciembre de 2023

0 minutos de lectura

Una vulnerabilidad de redireccionamiento abierto ocurre cuando un sitio web permite que una entrada proporcionada por el usuario influya en el destino de una redirección sin aplicar medidas adecuadas de validación o saneamiento. Para explotar esta vulnerabilidad, un atacante puede enviar a los usuarios un enlace aparentemente confiable que, al hacer clic, los redirige a un sitio web dañino, lo que puede dar lugar a ataques de phishing u otras actividades maliciosas. En Laravel, esto suele ocurrir cuando los desarrolladores no validan ni agregan a una lista de permitidos los destinos de redireccionamiento.

En este artículo, aprenderás más sobre las vulnerabilidades de redireccionamiento abierto y cómo prevenirlas en Laravel. También aprenderás a usar Snyk para detectar esta vulnerabilidad en tu código y tus dependencias.

Qué es una vulnerabilidad de redireccionamiento abierto en Laravel

Las vulnerabilidades de redireccionamiento abierto ocurren cuando las aplicaciones web permiten que usuarios externos definan una URL a la que se les redirigirá. A menudo, esto sucede después de una acción iniciada por el usuario, como hacer clic en un enlace o un botón. Esta URL especificada por el usuario suele incluirse como parámetro de consulta en la URL de la aplicación.

Por ejemplo, considera una URL vulnerable como esta: http://example.com/redirect?url=http://malicious-site.com

Sin las medidas adecuadas de validación y saneamiento, el método de redireccionamiento de Laravel puede enviar inadvertidamente a los usuarios al sitio malicioso especificado.

Crear una aplicación vulnerable

Para entender mejor cómo funciona una vulnerabilidad de redireccionamiento abierto, creemos una aplicación vulnerable sencilla. Más adelante, implementarás métodos para prevenir esta vulnerabilidad.

Para seguir los pasos, necesitas lo siguiente:

  • PHP y Composer instalados en tu equipo local.

  • Las extensiones php-xml y php-curl instaladas en tu equipo local.

  • Node.js y npm instalados en tu equipo local.

  • Un navegador web y un editor de código. En esta guía usamos Visual Studio (VS) Code.

Todo el código de este tutorial está disponible en este repositorio de GitHub.

Cuando tengas todo listo, será hora de empezar a crear la aplicación.

Ve a un directorio adecuado en tu equipo local, abre la carpeta en una terminal y ejecuta los siguientes comandos para instalar globalmente el instalador de Laravel mediante Composer y crear un proyecto nuevo de Laravel:

composer global require laravel/installer

laravel new open-redirect-vulnerability-demo

Si este comando no funciona, usa composer create-project laravel/laravel open-redirect-vulnerability-demo para crear un proyecto nuevo.

En las indicaciones que aparecen en la terminal, selecciona estas opciones:

  • ¿Quieres instalar un kit de inicio?: Ningún kit de inicio

  • ¿Qué framework de pruebas prefieres?: PHPUnit

  • ¿Quieres inicializar un repositorio de Git?: No

  • ¿Qué base de datos usará tu aplicación?: SQLite

Después de crear la aplicación, abre el directorio open-redirect-vulnerability-demo en tu editor de código. Luego, para crear una ruta que tenga una vulnerabilidad de redireccionamiento abierto, abre el archivo routes/web.php y reemplaza la ruta / con el siguiente código:

Route::get('/vulnerable', function (Request $request) {
   // Get the 'redirect' parameter from the query string
   $redirectUrl = $request->input('redirect');

   // Perform the redirect
   return redirect($redirectUrl);
});

Asegúrate de que la siguiente instrucción use esté en la parte superior del archivo web.php:

use Illuminate\Http\Request;

Para mostrar cómo funciona la vulnerabilidad de redireccionamiento abierto, ejecuta el servidor con el comando php artisan serve y abre tu navegador web. En este caso, https://www.google.com/ es la URL maliciosa a la que un atacante quiere redirigir al usuario.

En el navegador, ve a http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com/, que te redirigirá a https://www.google.com/.

La ruta /vulnerable que creaste es vulnerable a un redireccionamiento abierto porque carece de validación y saneamiento de entradas. En concreto, obtiene el parámetro de redireccionamiento de la URL y redirige a la página web especificada sin verificar si la URL es segura o pertenece al dominio de la aplicación. Como el código redirige a los usuarios sin verificar la URL proporcionada en el parámetro de redireccionamiento, esta se puede manipular para engañar a los usuarios y hacer que visiten sitios de phishing, descarguen malware o realicen otras actividades dañinas.

En este caso, el atacante podría haber creado un clon del sitio real (es decir, http://127.0.0.1:8000) y, cuando se cargara la página, el usuario pensaría que está en el sitio correcto, aunque en realidad no lo estaría. Si el usuario iniciara sesión en el sitio malicioso, entregaría sus credenciales al atacante sin saberlo.

Cómo prevenir una vulnerabilidad de redireccionamiento abierto en Laravel

Las vulnerabilidades de redireccionamiento abierto son un vector de ataque común que se puede prevenir. Estas son algunas prácticas recomendadas que pueden ayudarte:

Usar redireccionamientos fijos

Implementar redireccionamientos fijos garantiza que los usuarios solo puedan ser redirigidos a ubicaciones confiables y predeterminadas dentro de la aplicación. Esta práctica mitiga eficazmente el riesgo de vulnerabilidades de redireccionamiento abierto y es un mecanismo de defensa sólido que se debe implementar.

Para implementar redireccionamientos fijos en el código actual, reemplaza la ruta /vulnerable por lo siguiente:

Route::get('/', function () {
   return view('welcome');
})->name('home');

Route::get('/vulnerable', function (Request $request) {
   return redirect()->route('home');
});

Con este código, limitas los redireccionamientos a rutas específicas y confiables (es decir, rutas internas) dentro de tu aplicación Laravel. Este enfoque evita que los atacantes creen URL maliciosas que dirijan a destinos externos. Puedes probar esta corrección intentando acceder a la URL maliciosa que usamos antes: http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com/.

Una lista de permitidos de posibles redireccionamientos

Otra forma de prevenir vulnerabilidades de redireccionamiento abierto es definir una lista de destinos confiables. Esta medida preventiva ayuda a garantizar que los redireccionamientos solo se realicen a URL aprobadas.

Para implementar esta estrategia en este proyecto de Laravel, reemplaza la ruta /vulnerable por el siguiente código:

Route::get('/vulnerable', function (Request $request) {
   // Define trusted redirect destinations
   $whitelistedDestinations = [
   	'https://snyk.io/',
   ];

   // Get the 'redirect' parameter from the params
   $redirectUrl = $request->input('redirect');

   // Check if the input URL is in the whitelist
   if (in_array($redirectUrl, $whitelistedDestinations)) {
   	// Perform the redirect
   	return redirect($redirectUrl);
   }

   // Handle invalid redirects, for example:
   return redirect('/'); // Redirect to a safe default page
});

En este código, supones que https://snyk.io/ es una URL de redireccionamiento confiable. El valor del parámetro de redireccionamiento en la URL se valida con el arreglo $whitelistedDestinations. Si coincide con alguno de los destinos confiables, se realiza el redireccionamiento. De lo contrario, la aplicación redirige a una página predeterminada segura.

Para probar este método, ve en tu navegador a http://127.0.0.1:8000/vulnerable?redirect=https://www.google.com. Se te redirigirá automáticamente a la página de inicio de la aplicación Laravel porque https://www.google.com no está en el arreglo $whitelistedDestinations. Sin embargo, si vas a http://127.0.0.1:8000/vulnerable?redirect=https://snyk.io/, se te redirigirá a https://snyk.io/, ya que está en el arreglo $whitelistedDestinations.

Impedir los redireccionamientos a otro dominio

Impedir que tu aplicación redirija a otro dominio garantiza que los usuarios solo naveguen dentro del dominio de la aplicación o que reciban información adecuada y actúen con cautela ante posibles redireccionamientos fuera del entorno confiable. Este enfoque refuerza la seguridad general y la confianza de los usuarios.

Para implementar esta estrategia en este proyecto de Laravel, reemplaza la ruta /vulnerable por el siguiente código:

Route::get('/vulnerable', function (Request $request) {
   $inputUrl = $request->input('redirect');

   // Prepend the protocol if missing
   if (!parse_url($inputUrl, PHP_URL_SCHEME)) {
   	$inputUrl = 'http://' . $inputUrl;
   }

   $parsedInputUrl = parse_url($inputUrl);

   // Check if the URL is valid and has a host component
   if ($parsedInputUrl && array_key_exists('host', $parsedInputUrl) && $parsedInputUrl['host'] === 'localhost') {
   	return redirect()->to($inputUrl);
   }

   // Disallow redirect with a 403 Forbidden status code
   return response('Forbidden: Cannot redirect to another domain', Response::HTTP_FORBIDDEN);
});

Además, asegúrate de agregar la siguiente instrucción use en la parte superior del archivo web.php:

use Illuminate\Http\Response;

Este código define una ruta que recibe entradas del usuario en forma de URL. Agrega el protocolo http:// si falta y, luego, verifica si el host de la URL es localhost. Si coincide, el código permite el redireccionamiento. De lo contrario, devuelve una respuesta 403 Forbidden, impide el redireccionamiento a otro dominio y muestra un mensaje que indica que no está permitido redirigir a un dominio diferente.

Usar una extensión de Snyk para IDE para detectar vulnerabilidades de redireccionamiento abierto

Si buscas una solución sencilla para detectar vulnerabilidades de redireccionamiento abierto, considera usar una extensión de seguridad de Snyk para IDE, como la extensión de Snyk para Visual Studio Code. Esta herramienta detecta vulnerabilidades de redireccionamiento abierto en tu código, te informa sobre ellas (incluido su nivel de seguridad), enumera las prácticas recomendadas para prevenirlas y te ofrece ejemplos de fragmentos de código que puedes usar para corregirlas.

Empezar a usar la extensión de Snyk para Visual Studio Code es fácil. Primero, instala, configura y autentica la extensión.

Para ver la extensión en acción, usa el mismo código vulnerable de antes. Abre el archivo routes/web.php y reemplaza la ruta /vulnerable por lo siguiente:

Route::get('/vulnerable', function (Request $request) {
   // Get the 'redirect' parameter from the query string
   $redirectUrl = $request->input('redirect');

   // Perform the redirect
   return redirect($redirectUrl);
});

Guarda el archivo y selecciona Snyk en la barra lateral de VS Code. Si el análisis no se está ejecutando, haz clic en el botón Volver a analizar en Seguridad del código:

Visual Studio Code muestra una ruta web.php de Laravel que lee un parámetro de consulta de redirección y devuelve una respuesta de redirección, junto con paneles de análisis de Snyk.

Cuando termine el análisis, se mostrará una lista de vulnerabilidades. En los resultados, expande web.php y selecciona Open Redirect. Verás que la extensión de Snyk muestra más detalles sobre la vulnerabilidad y te indica cómo puedes corregirla:

Snyk Code en Visual Studio Code señala una vulnerabilidad de redireccionamiento abierto en una ruta web.php de Laravel y muestra una solución sugerida.

La extensión de Snyk también resalta el código vulnerable. Puedes pasar el cursor sobre él para obtener más información sobre la vulnerabilidad:

Editor de código que muestra una llamada de redirección de Laravel con una advertencia sobre una vulnerabilidad de redirección abierta, CWE-601, y recomendaciones para prevenirla.

Esta extensión también ofrece Open Source Security, una herramienta que te permite encontrar y corregir vulnerabilidades en las bibliotecas de código abierto de tu aplicación. Si Snyk encuentra vulnerabilidades en tus bibliotecas de código abierto, incluidas las de redireccionamiento abierto, muestra los resultados en la ventana de la extensión de Snyk:

Visual Studio Code muestra una ruta de Laravel que redirige a los usuarios a una URL proporcionada mediante un parámetro de solicitud, con los paneles de seguridad de Snyk visibles.

Conclusión

En este artículo, aprendiste todo sobre las vulnerabilidades de redireccionamiento abierto en aplicaciones Laravel y los riesgos potenciales que representan, incluidos los ataques de phishing y la distribución de malware. También aprendiste a abordar esta vulnerabilidad mediante métodos como implementar redireccionamientos fijos, agregar los destinos permitidos a una lista y bloquear los redireccionamientos a dominios externos. Estas estrategias mejoran significativamente la seguridad de tus aplicaciones Laravel, ya que garantizan que los usuarios solo sean redirigidos a ubicaciones confiables y predefinidas.

Si quieres llevar la seguridad un paso más allá, considera usar las extensiones de Snyk para IDE. Con Snyk, puedes reforzar aún más tus aplicaciones Laravel contra todo tipo de vulnerabilidades, incluidos los redireccionamientos abiertos.

La extensión de Snyk para Visual Studio Code analiza tu base de código, identifica vulnerabilidades y ofrece información práctica para que los desarrolladores puedan detectar posibles amenazas antes de que lleguen a producción. Al aprovechar el completo conjunto de soluciones de seguridad de Snyk, los desarrolladores pueden proteger de forma proactiva sus aplicaciones Laravel, garantizar una protección sólida y reforzar la postura de seguridad general de sus proyectos.

Empieza con los desafíos de Capture the Flag

Aprende a resolver desafíos de captura la bandera con nuestro taller virtual introductorio a pedido.


Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

blog feature ai violet
Blog

VulnBump: ¿Pueden los agentes de IA corregir dependencias vulnerables sin romper la compilación?

VulnBump prueba agentes de IA en 307 actualizaciones reales de dependencias. Una corrección cuenta solo si elimina la vulnerabilidad y mantiene en verde la compilación y las pruebas.

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.