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
CVE-2025-68116 — Una documentación de CVE-2025-68116 | Kitploit
Herramientas/GitHubGitHub/x0root/cve-2025-68116
Análisis de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHubx0root/cve-2025-68116

CVE-2025-68116

Una documentación de CVE-2025-68116

Ver Repositorio
hace 8 mesesAún no revisado

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

CVE-2025-68116

Autor: @x0root
Vulnerabilidad: Cross-Site Scripting (XSS) Almacenado mediante subidas renderizables por el navegador (SVG / HTML)
Software afectado: FileRise (< 2.7.1)
Versión parcheada: 2.7.1
CVE oficial (solicitado vía GHSA): CVE-2025-68116 (seguimiento/aviso: GHSA-35pp-ggh6-c59c)
Aviso relacionado previo (mitigación original que fue eludida): GHSA-qrcv-vjvf-fr29

Evaluación CVSS:

  • CNA (GitHub): CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:L — 8.9 (Alta)
  • Informante (análisis del autor): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L — 9.6 (Crítica)

Justificación de la Puntuación CVSS (Informante)

La evaluación del informante valora los Privilegios Requeridos (PR) en el punto de explotación, no en el punto de introducción de la vulnerabilidad.

La explotación ocurre cuando una víctima accede a un enlace de compartición pública generado, lo que no requiere autenticación ni privilegios (PR:N).

La evaluación del CNA valora PR basándose en la capacidad de subir un archivo malicioso. Sin embargo, CVSS v3.1 define los Privilegios Requeridos (PR) como los privilegios que un atacante debe poseer en el momento en que la vulnerabilidad es explotada, no los privilegios necesarios para colocar o preparar la condición vulnerable.

Como tal, PR:N refleja con mayor precisión las condiciones reales de explotación, lo que resulta en una clasificación de severidad Crítica (9.6).

Nota: GHSA-qrcv-vjvf-fr29 introdujo una mitigación que impedía que los SVG se renderizaran dentro de la interfaz web de FileRise (panel de vista previa). Este informe documenta una elusión de esa mitigación —específicamente los endpoints backend de compartición/descarga—, que se rastrea como GHSA-35pp-ggh6-c59c / CVE-2025-68116.


Resumen

Este documento es un registro técnico completo de CVE-2025-68116: un XSS almacenado en FileRise que persistió después de una mitigación anterior y finalmente se corrigió en v2.7.1. Incluye el descubrimiento, pruebas de concepto de explotación, múltiples correcciones fallidas, un análisis preciso del flujo de control de causa raíz (con evidencia), la verificación final del parche y un análisis de las características de explotabilidad relevantes para la evaluación CVSS. Todo el contenido a continuación se basa en pruebas reproducidas, inspección del controlador y el hilo del aviso público.


1. Antecedentes: Aviso Previo y Corrección Incompleta

Un aviso previo, GHSA-qrcv-vjvf-fr29, abordó el XSS almacenado mediante subidas de SVG bloqueando la renderización en línea en la interfaz web de FileRise. Esa mitigación no abordó cómo los archivos SVG eran servidos por endpoints backend como:

  • /api/file/download.php
  • /api/file/share.php

CVE-2025-68116 (rastreado como GHSA-35pp-ggh6-c59c) documenta una elusión de la mitigación de GHSA-qrcv-vjvf-fr29: un atacante puede almacenar un SVG manipulado y entregarlo a las víctimas mediante enlaces de compartición pública o ciertos comportamientos de descarga, lo que lleva a la ejecución de scripts en el origen de FileRise.


2. Descubrimiento: Subida de Prueba de Concepto y Elusión

Para validar si el backend todavía exponía los SVG de forma que pudieran renderizarse, subí un SVG PoC simple:

El acceso al archivo mediante:

  • /api/file/download.php?…
    y, más importante, mediante:
  • /api/file/share.php?token=…

resultó en la ejecución de alert(). La mitigación original de GHSA-qrcv-vjvf-fr29 (bloqueo de vista previa en la interfaz) fue eludida mediante acceso directo a estos endpoints.


3. Demostrando el Impacto en el Mundo Real

Un alert() es una prueba de concepto; probé el impacto real haciendo que el payload interactuara con las APIs internas.

Payload de prueba utilizado:

root@kitploit:~
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <script type="text/javascript">
    fetch('/api/upload/upload.php')
      .then(response => response.text())
      .then(data => alert('API Response: ' + data));
  </script>
</svg>

Cuando un administrador con sesión iniciada abría un enlace de compartición que contenía este SVG, el script se ejecutaba y realizaba solicitudes API autenticadas. Los efectos observados incluyeron:

  • Respuestas de la API devueltas al script (la información sensible podría quedar expuesta)
  • La respuesta de la API indicaba el estado del token CSRF (p. ej., {"csrf_expired":true,"csrf_token":"..."})
  • La interacción invalidaba el token CSRF existente del administrador, impidiendo más acciones que cambiaran el estado hasta la recuperación (denegación de servicio práctica contra las funciones de administración)

Clasificación de impacto demostrada durante las pruebas:

  • Confidencialidad: Alta (C:H)
  • Integridad: Alta (I:H)
  • Disponibilidad: Baja (A:L)

4. Cronología de la Divulgación y Múltiples Intentos de Corrección

Informé del problema de forma privada. El mantenedor publicó varias correcciones incrementales:

  • v2.6.0 — Se aplicó la mitigación al endpoint de descarga; el endpoint de compartición seguía siendo vulnerable.
  • v2.6.2 — Intentos adicionales; el endpoint de compartición seguía siendo vulnerable en mis pruebas.
  • v2.7.0 — Endurecimiento reclamado para el endpoint de compartición; aún explotable en mi entorno.
  • v2.7.1 — Corrección final que verifiqué y que resuelve el problema (ver la sección de Verificación).

Desde v2.6.0 → v2.7.0, el endpoint de enlaces de compartición continuó sirviendo el SVG de una manera que permitía la renderización en línea y la ejecución de scripts. El análisis de causa raíz a continuación explica por qué las correcciones anteriores no lograron cerrar por completo el vector.


5. Análisis de Causa Raíz — Flujo de Control y Fallo de Cabeceras (Evidencia)

La causa subyacente no era una única cabecera faltante, sino el flujo de control y el orden de la salida dentro de shareFile() (controlador), que impedía que las cabeceras de seguridad se aplicaran en muchas rutas de ejecución. Había dos clases de problemas:

  • Múltiples puntos de exit; tempranos que cortocircuitaban la función antes de que se establecieran las cabeceras de seguridad.
  • Avisos/notificaciones de PHP que emitían salida antes de las llamadas a cabeceras, causando errores de "headers already sent" (cabeceras ya enviadas).

5.1 Enumeración de salidas tempranas

Utilicé un escaneo con awk para listar las apariciones de header() y exit; dentro de shareFile() hasta la llamada a readfile():

Comando: awk '/function shareFile(/ {flag=1} /readfile(/ {flag=0} flag && /(header|exit;)/ {printf "%4d | %s\n", NR, $0}' src/controllers/FileController.php

Salida observada (abreviada de mi ejecución):

1649 | header('Content-Type: application/json; charset=utf-8'); 1651 | exit; 1657 | header('Content-Type: application/json; charset=utf-8'); 1659 | exit; 1664 | header('Content-Type: application/json; charset=utf-8'); 1666 | exit; 1670 | header("Content-Type: text/html; charset=utf-8"); 1693 | exit; 1699 | header('Content-Type: application/json; charset=utf-8'); 1701 | exit; 1719 | header('Content-Type: application/json; charset=utf-8'); 1721 | exit; 1725 | header('Content-Type: application/json; charset=utf-8'); 1727 | exit;

Las cabeceras de seguridad (la lógica de endurecimiento) comienzan en la línea ~1743:

1743 | header('X-Content-Type-Options: nosniff'); ... 1770 | header("Content-Disposition: attachment; ...");

Debido a que la función emite cabeceras + exit; antes en muchas rutas, esas solicitudes nunca llegaban al código de endurecimiento que establece Content-Disposition, nosniff o el tipo restrictivo.

5.2 Ruta de solicitud de contraseña

En el flujo de compartición protegida por contraseña, la función emitía temprano el HTML de solicitud de contraseña:

if (!empty($record['password']) && empty($providedPass)) { header("Content-Type: text/html; charset=utf-8"); ... exit; }

Esta ruta envía Content-Type: text/html y sale antes de la lógica de endurecimiento SVG, causando la renderización en línea en los navegadores para comparticiones protegidas por contraseña cuando no se proporcionaba la contraseña.

5.3 Comparticiones no protegidas por contraseña (demostrado)

La vulnerabilidad no se limitaba a los flujos protegidos por contraseña. Una solicitud de compartición sin contraseña también devolvía text/html en mis pruebas:

Comando: curl -svI "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" 2>&1 | grep -iE "content-type"

Observado: < Content-Type: text/html; charset=UTF-8

Esto confirma que incluso en el caso general (sin contraseña) la respuesta era text/html, y el SVG se renderizaba en línea.

5.4 "Headers already sent" debido a avisos de PHP

Capturé una solicitud cruda al endpoint de compartición que incluía advertencias de PHP emitidas antes del endurecimiento de cabeceras. Instantánea (abreviada):

Comando: curl -s "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" | head -n 30

Salida cruda observada (abreviada):

Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1644


Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1645

Warning: Cannot modify header information - headers already sent by (output started at /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php:1644) in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1743

...luego el payload SVG crudo se transmitía y se renderizaba en línea...

Estos avisos muestran que se producía salida (notificaciones de deprecación) antes del endurecimiento de cabeceras, haciendo imposible que las llamadas posteriores a header() surtieran efecto en esas ejecuciones.

5.5 Resumen de la causa raíz

  • El código de endurecimiento para forzar descargas y establecer nosniff existía, pero no se alcanzaba en muchas rutas de código debido a salidas tempranas y salida.
  • Los avisos/advertencias de PHP además impedían la modificación de cabeceras.
  • El resultado práctico: los enlaces de compartición (tanto en rutas con contraseña como sin contraseña en algunos casos) devolvían HTML o permitían de otro modo que el navegador renderizara el SVG en línea, ejecutando scripts incrustados.

6. Corrección Final (v2.7.1) y Verificación

Tras los informes de causa raíz, el mantenedor aplicó cambios que abordaron el flujo de control y el orden de la salida. En v2.7.1:

  • Los enlaces de compartición de SVG/SVGZ se fuerzan a descargar (Content-Disposition: attachment).
  • Los archivos se sirven con un MIME seguro (application/octet-stream) para los SVG.
  • Se aplica X-Content-Type-Options: nosniff.
  • La lógica de cabeceras de seguridad se ejecuta antes de cualquier salida, y los puntos de exit; tempranos que eludían el endurecimiento se corrigieron/manejaron.

Verificación final (mi prueba en v2.7.1):

Comando: curl -svI "http://127.0.0.1:8080/api/file/share.php?token=fc911e48b0a30e9417a9020ef959784d" 2>&1 | grep -iE "content-type|content-disposition"

Observado: < Content-Type: application/octet-stream < Content-Disposition: attachment; filename="xss-image.svg"; filename*=UTF-8''xss-image.svg

Resultado: el navegador forzó una descarga; el SVG no se renderizó en línea y el payload XSS no se ejecutó. Considero que v2.7.1 resolvió el problema en mi entorno.


7. Contexto de Explotabilidad CVSS

Evaluación de explotabilidad (análisis del informante)

  • CVSS evalúa los privilegios requeridos en el momento de la explotación, no en el de la plantación.
  • La entrega de la explotación aquí no está autenticada: cualquier destinatario de un enlace de compartición pública (incluidos administradores) puede activar el payload sin autenticación.
  • Esto crea un arma de disparar y olvidar: el atacante planta un archivo malicioso, cierra sesión, y el enlace de compartición pública sigue siendo explotable.
  • Por lo tanto, el vector CVSS correcto para el escenario realista más severo es:

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L — Puntuación: 9.6 (Crítica)

Documenté esta justificación en el hilo del aviso y solicité que se usara PR:N.

Evaluación del mantenedor (según lo publicado)

  • El mantenedor puntuó los Privilegios Requeridos como Bajos (PR:L) en el aviso oficial, argumentando que subir/plantar el archivo malicioso requiere una cuenta o un token habilitado para subidas (una capacidad preexistente).
  • Consideraron que ese requisito formaba parte de los privilegios previos a la explotación y, por lo tanto, usaron PR:L; el texto del aviso aún señala que las URL de compartición resultantes pueden ser abiertas por destinatarios no autenticados.

Resultado administrativo

  • El mantenedor procedió a solicitar el CVE vía GitHub y publicó el aviso GHSA con PR:L (Alta 8.9).
  • El CVE fue solicitado vía GitHub como parte del proceso GHSA y publicado con PR:L. Este documento preserva el análisis técnico del informante sobre las características de explotabilidad para mayor completitud y referencia futura

El vector CVSS del CNA refleja un modelo de amenaza restringido.

Las pruebas empíricas demuestran una ruta de explotación más severa y reproducible, que se alinea con una puntuación base CVSS 3.1 más alta según las reglas de puntuación estándar.

Se anima a los evaluadores independientes a evaluar la severidad utilizando las condiciones de explotación observadas descritas en este documento, asegurando que la severidad pública refleje el impacto real en lugar de una línea base de alcance estrecho.


8. Conclusión

  • El problema era un XSS almacenado real en el que los SVG podían servirse de manera que permitieran la renderización en línea y la ejecución de scripts.
  • El aviso previo (GHSA-qrcv-vjvf-fr29) mitigó la renderización en la vista previa, pero no abordó los endpoints backend de compartición/descarga; GHSA-35pp-ggh6-c59c (CVE-2025-68116) documenta esta elusión.
  • La causa raíz técnica central fue el orden del flujo de control y la salida antes de las cabeceras, lo que impidió que las cabeceras de seguridad se aplicaran en múltiples rutas de ejecución.
  • La corrección final en v2.7.1 corrige el flujo de control, fuerza las descargas para SVG y aplica las cabeceras adecuadas; verifiqué la corrección.
  • Las diferentes interpretaciones de los Privilegios Requeridos CVSS (PR:N vs PR:L) se documentan para mayor transparencia

Apéndice A — Evidencia (fragmentos seleccionados capturados durante la investigación)

A.1 Escaneo de cabeceras con salidas tempranas (salida de awk, abreviada)

1649 | header('Content-Type: application/json; charset=utf-8'); 1651 | exit; 1657 | header('Content-Type: application/json; charset=utf-8'); 1659 | exit; 1664 | header('Content-Type: application/json; charset=utf-8'); 1666 | exit; 1670 | header("Content-Type: text/html; charset=utf-8"); 1693 | exit; 1699 | header('Content-Type: application/json; charset=utf-8'); 1701 | exit; 1719 | header('Content-Type: application/json; charset=utf-8'); 1721 | exit; 1725 | header('Content-Type: application/json; charset=utf-8'); 1727 | exit;

Las cabeceras de seguridad comienzan en ~1743: 1743 | header('X-Content-Type-Options: nosniff'); ... 1770 | header("Content-Disposition: attachment; ...");

A.2 Cabecera curl de compartición sin contraseña (comportamiento vulnerable)

~/FileRise $ curl -svI "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" 2>&1 | grep -iE "content-type" < Content-Type: text/html; charset=UTF-8

A.3 "Headers already sent" y avisos de deprecación (muestra de salida sin procesar)

Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1644


Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1645

Warning: Cannot modify header information - headers already sent by (output started at /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php:1644) in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1743

...seguido del payload SVG que se imprimía y se renderizaba en línea.

A.4 Verificación final (v2.7.1)

~/FileRise $ curl -svI "http://127.0.0.1:8080/api/file/share.php?token=fc911e48b0a30e9417a9020ef959784d" 2>&1 | grep -iE "content-type|content-disposition" < Content-Type: application/octet-stream < Content-Disposition: attachment; filename="xss-image.svg"; filename*=UTF-8''xss-image.svg


Descargar herramienta