highCWE-22A01:2021

Travesia de Ruta

Rutas de archivos construidas con input de usuario sin validar permiten a los atacantes leer o escribir archivos arbitrarios en el servidor usando secuencias ../.

Cómo Funciona

La travesia de ruta ocurre cuando una aplicacion usa input del usuario para construir rutas de archivos sin validacion adecuada. Un atacante puede inyectar secuencias ../ (dot-dot-slash) para navegar fuera del directorio esperado. Por ejemplo, solicitar /files?name=../../../etc/passwd lee el archivo de passwords del sistema. En Windows, ..\..\..\windows\system32\config\sam logra resultados similares. Esta vulnerabilidad permite a los atacantes leer archivos de configuracion, codigo fuente, variables de entorno y cualquier archivo al que el proceso del servidor pueda acceder. Cuando se combina con operaciones de escritura, los atacantes pueden sobrescribir archivos de la aplicacion o inyectar codigo malicioso.

Código Vulnerable
const path = require('path');
app.get('/files/:name', (req, res) => {
  const filePath = path.join(__dirname, 'uploads', req.params.name);
  res.sendFile(filePath);
});
Código Seguro
const path = require('path');
app.get('/files/:name', (req, res) => {
  const uploadsDir = path.resolve(__dirname, 'uploads');
  const filePath = path.resolve(uploadsDir, req.params.name);
  if (!filePath.startsWith(uploadsDir)) {
    return res.status(403).json({ error: 'Access denied' });
  }
  res.sendFile(filePath);
});

Ejemplo Real

En 2021, una vulnerabilidad de travesia de ruta en Apache HTTP Server (CVE-2021-41773) permitio a los atacantes acceder a archivos fuera del document root. Combinada con CGI, habilito ejecucion remota de codigo. La vulnerabilidad fue explotada activamente en pocas horas tras su divulgacion.

Cómo Prevenirlo

  • Resuelve la ruta completa y verifica que comience con el directorio base esperado
  • Usa path.resolve() y compara con startsWith() para prevenir escape de directorio
  • Nunca pases input del usuario directamente a operaciones del sistema de archivos
  • Usa un sistema de nombres basado en UUID en vez de nombres proporcionados por el usuario

Tecnologías Afectadas

Node.jsPythonJavaPHPGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas