Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
React-Router-CVE-2025-61686- | Kitploit
Herramientas/GitHubGitHub/kai-one001/react-router-cve-2025-61686-
Análisis EstáticoAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónSeguridad WebAprendizaje y Educación
GitHubkai-one001/react-router-cve-2025-61686-

React-Router-CVE-2025-61686-

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
hace 7 mesesAún no revisado

Informe de análisis de la vulnerabilidad CVE-2025-61686

Resumen de la vulnerabilidad

CVE ID: CVE-2025-61686
Versiones afectadas: @react-router/node 7.0.0 a 7.9.3
Tipo de vulnerabilidad: Path Traversal / Directory Traversal

Principio de la vulnerabilidad

1. Ubicación de la vulnerabilidad

La vulnerabilidad se encuentra en la función getFile() y en la lógica relacionada con las operaciones de archivo en el archivo packages/react-router-node/sessions/fileStorage.ts.

2. Análisis del problema principal

2.1 Origen del Session ID

En la línea 267 de packages/react-router/lib/server-runtime/sessions.ts:

root@kitploit:~
async getSession(cookieHeader, options) {
  let id = cookieHeader && (await cookie.parse(cookieHeader, options));
  let data = id && (await readData(id));
  return createSession(data || {}, id || "");
}

El Session ID se obtiene de la Cookie mediante el método cookie.parse().

2.2 Lógica de análisis de la Cookie

En la función decodeCookieValue() de packages/react-router/lib/server-runtime/cookies.ts:

root@kitploit:~
async function decodeCookieValue(
  value: string,
  secrets: string[],
): Promise<any> {
  if (secrets.length > 0) {
    // 如果配置了 secrets,会验证签名
    for (let secret of secrets) {
      let unsignedValue = await unsign(value, secret);
      if (unsignedValue !== false) {
        return decodeData(unsignedValue);
      }
    }
    return null;  // 签名验证失败返回 null
  }
  
  // 如果没有配置 secrets(未签名),直接返回解码后的值
  return decodeData(value);
}

Problema clave: cuando la cookie no está firmada (secrets es un array vacío o no está configurado), decodeCookieValue devuelve directamente el valor de la cookie decodificado, y el atacante puede controlar completamente este valor.

2.3 Lógica de construcción de la ruta

En packages/react-router-node/sessions/fileStorage.ts:

root@kitploit:~
export function getFile(dir: string, id: string): string {
  // Divide the session id up into a directory (first 2 bytes) and filename
  // (remaining 6 bytes) to reduce the chance of having very large directories,
  return path.join(dir, id.slice(0, 4), id.slice(4));
}

Esta función divide el session ID en dos partes:

  • Los primeros 4 caracteres como nombre de directorio: id.slice(0, 4)
  • Los caracteres restantes como nombre de archivo: id.slice(4)

Luego se usa path.join() para unir la ruta.

2.4 Forma de explotación de la vulnerabilidad

Escenario de ataque: cuando se usa createFileSessionStorage() y la cookie no está firmada:

  1. El atacante puede construir un session ID malicioso, por ejemplo: ../../etc/passwd
  2. La función getFile() procesa:
    • id.slice(0, 4) = ../.
    • id.slice(4) = /etc/passwd
    • path.join(dir, ../., /etc/passwd)
    • Aunque path.join() normaliza la ruta, si dir ya es una ruta relativa o ha sido procesado, la path traversal aún puede ser posible.

Una forma de explotación más precisa:

  • Session ID: ....//etc/passwd
    • id.slice(0, 4) = ....
    • id.slice(4) = //etc/passwd
    • Si no se maneja correctamente, podría permitir el acceso a /etc/passwd

O bien:

  • Session ID: ../../../etc/passwd (16 caracteres)
    • id.slice(0, 4) = ../.
    • id.slice(4) = ./etc/passwd
    • Combinado con el comportamiento de path.join(), podría permitir path traversal.

3. Operaciones afectadas

Las siguientes operaciones de archivo pueden verse afectadas:

  1. readData(id) - al leer datos de la sesión

    root@kitploit:~
    async readData(id) {
      try {
        let file = getFile(dir, id);
        let content = JSON.parse(await fsp.readFile(file, "utf-8"));
        // ...
      }
    }
    
  2. updateData(id, data, expires) - al actualizar datos de la sesión

    root@kitploit:~
    async updateData(id, data, expires) {
      let content = JSON.stringify({ data, expires });
      let file = getFile(dir, id);
      await fsp.mkdir(path.dirname(file), { recursive: true });
      await fsp.writeFile(file, content, "utf-8");
    }
    
  3. deleteData(id) - al eliminar datos de la sesión

    root@kitploit:~
    async deleteData(id) {
      try {
        await fsp.unlink(getFile(dir, id));
      }
    }
    

4. Impacto del ataque

  1. Lectura de archivos: el atacante puede leer archivos arbitrarios en el servidor (dependiendo de los permisos del proceso del servidor web).
  2. Escritura de archivos: el atacante podría escribir archivos en el servidor, lo que puede resultar en:
    • Filtración de datos
    • Inyección de código
    • Escalada de privilegios
  3. Eliminación de archivos: el atacante podría eliminar archivos del servidor.

5. Condiciones para la explotación

Deben cumplirse todas las siguientes condiciones:

  1. Usar el método createFileSessionStorage()
  2. Cookie sin firmar (en la configuración de cookie no se establece secrets o secrets es un array vacío)
  3. El proceso del servidor web tiene permisos de lectura/escritura sobre los archivos objetivo.

Hallazgos de la auditoría de código

Ruta de código crítica

root@kitploit:~
getSession(cookieHeader) 
  → cookie.parse(cookieHeader) 
    → decodeCookieValue(value, secrets)  // 未签名时直接返回 value
      → readData(id) 
        → getFile(dir, id)  // 路径拼接,存在路径遍历风险
          → fsp.readFile(file) / fsp.writeFile(file) / fsp.unlink(file)

Causa raíz del problema

  1. Falta de validación de entrada: la función getFile() no valida ni normaliza el parámetro id.
  2. Dependencia de la normalización de path.join(): aunque path.join() normaliza la ruta, en determinados casos (por ejemplo, cuando la ruta ya contiene .. antes de unirla) aún puede permitir path traversal.
  3. Cookie sin firmar: permite al atacante controlar completamente el valor del session ID.
Descargar herramienta