Explicación detallada de cómo defenderse de saltos inseguros en Node.js
¿Por qué deberías evitar las redirecciones?
Los redireccionamientos que no validan la entrada del usuario pueden brindarle a un atacante la oportunidad de lanzar una estafa de phishing para robar las credenciales del usuario y realizar otras acciones maliciosas.
Nota: Al implementar redirecciones en Node.js o Express, es importante realizar la validación de entrada en el lado del servidor.
Si un atacante descubre que un usuario no está validando la entrada proporcionada por un usuario externo, puede explotar esto publicando un enlace especialmente diseñado en foros, redes sociales y otros lugares de acceso público. vulnerabilidad para permitir a los usuarios hacer clic en el enlace.
Si un atacante descubre que un usuario no está validando la entrada proporcionada por un usuario externo, puede explotar esto publicando un enlace especialmente diseñado en foros, redes sociales y otros lugares de acceso público. vulnerabilidad para permitir a los usuarios hacer clic en el enlace.
A primera vista, estas URL parecen ser legítimas y no representan una amenaza para los usuarios, ya que todas estas URL que se redirigirán contienen el nombre de host del objetivo:
/login?url =/bad/things
Sin embargo, si la lógica de redireccionamiento del lado del servidor no logra validar los datos ingresados en los parámetros de la URL, el usuario puede terminar visitando un sitio web preestablecido por el hacker para llevar a cabo el ataque (examp1e.com) ! Lo anterior es sólo un ejemplo de cómo los atacantes pueden aprovechar la lógica de redireccionamiento insegura.
Ejemplo de redirección insegura y pasarla directamente al método Express res.redirect().
var express = require('express');
var puerto = process.env.listen(puerto, función() {
console.log( ' Servidor escuchando en el puerto ');
});
La validación de entrada ayuda a prevenir redirecciones inseguras
Por lo general, es mejor evitar el uso de redirecciones y reenvíos en tu código. Si debe utilizar la redirección en su código, el enfoque preferido es utilizar entradas predefinidas asignadas a objetivos específicos, el llamado enfoque de lista blanca. A continuación se muestran pasos de ejemplo específicos para implementar este enfoque:
1. baseHostname garantizará que cualquier redireccionamiento mantenga al usuario en el host del investigador.
2. entrada predefinida (por ejemplo, lo que se pasa al parámetro URL), los investigadores modificaron la lógica /login y luego concatenaron la variable baseHostname routePath, evitando así que cualquier entrada proporcionada por el usuario se pase directamente al método Express resdirect();
5. Finalmente, los investigadores utilizaron el método encodeURI() como garantía de seguridad adicional para garantizar que la parte URI de la cadena de conexión esté codificada correctamente, lo que resulta en una redirección limpia.
//Configura tu lista blanca
var baseHostname = ""
var redirigirMapping = {
'cuenta': '/cuenta ',
'profile': '/profile'
}
//Crear una función para validar la lista blanca
función validarRedirect( clave) {
if(clave en redirecciónMapping) {
return redirecciónMapping[clave];
}else{
devolver falso;
}
}
app.get('/login', función (req, res, siguiente) {
if(req.session.isAuthenticated()) {
redirigirPath = validarRedirect(req.query.url);
if(redirectPath) {
res.redirect(encodeURI(baseHostnamedirectPath));
}else{
res.send('¡No es una redirección válida!');
}
}
}
});
Otros escenarios de aplicaciones de redireccionamiento
En algunos casos, aunque algunas medidas de seguridad Las plataformas todavía quieren redirigir a los usuarios y controlarlos dentro de ámbitos específicos de un dominio, por lo que incluir cada combinación en la lista blanca no es práctico. Esto funciona mejor cuando el valor proporcionado externamente sigue un patrón específico, como una cadena alfanumérica de 16 caracteres. Las cadenas alfanuméricas son ideales ya que no contienen ningún carácter especial que pueda introducir otros ataques como el recorrido de directorio/ruta (este ataque se basa en caracteres como? y barras diagonales iniciales y finales).
Por ejemplo, una plataforma de seguridad podría querer redirigir a los usuarios a un producto específico en un sitio web de comercio electrónico después de iniciar sesión. Dado que cada producto en un sitio web de comercio electrónico tiene un valor alfanumérico único, la plataforma de seguridad puede permitir una redirección segura validando siempre las entradas externas con una lista blanca de RegEx. En el ejemplo descrito en este artículo, los investigadores utilizaron la variable productId.
//Configura tu lista blanca
var baseHostname = ""
app.get('/login', function (req, res, next)) {
productId = (req. query.productId || '');
whitelistRegEx = /^[a-zA-Z0-9]{16}$/; p>
p>
if(productId) {
//Valida que el productId sea alfanumérico y tenga exactamente 16 caracteres
if(whitelistRegEx.test(productId)) {
res.redirect(encodeURI(baseHostname '/item/' productId));
}else{
//El productId no cumplió con la lista blanca de RegEx, por lo que devuelve un error
res.send('ID de producto no válido'
}
}else{
// No se proporcionó ningún ID de producto, así que redirija a la página de inicio
res.redirect('/');
}
}
Finalmente , la plataforma de seguridad advierte al usuario que está siendo redirigido automáticamente y vale la pena tomarlo en serio. Si la plataforma de seguridad pretende redirigir a los usuarios fuera del dominio, es posible que deba crear una página intermedia durante el proceso que emitirá la siguiente advertencia y contendrá la URL a la que se redirigirá al usuario.
Nota: Este artículo se basa en ejemplos de Hailstone, una plataforma de seguridad de aplicaciones con capacidades para encontrar vulnerabilidades en el código.
Este artículo está traducido de: https://blog.hailstone.io/how-to-prevent-unsafe-redirects-in-node-js
Resumen