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.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
drupal-ckeditor-fileisimage — Drupal 11.4.8 - Alta - Remota - Subida - La carga de imágenes de CKEditor 5 todavía omite FileIsImage | Kitploit
Herramientas/GitHubGitHub/abraxas/drupal-ckeditor-fileisimage
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebVirtualización de SeguridadSeguridad WebPruebas de PenetraciónLabs y Práctica
GitHub
abraxas/drupal-ckeditor-fileisimage

drupal-ckeditor-fileisimage

Drupal 11.4.8 - Alta - Remota - Subida - La carga de imágenes de CKEditor 5 todavía omite FileIsImage

Ver Repositorio
3hace 3 díasAú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

Abraxas Labs - drupal-ckeditor-fileisimage

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  drupal-ckeditor-fileisimage

drupal-ckeditor-fileisimage

Clase: Carga sin restricciones / XSS almacenado Alcance: Remoto

Drupal core 11.4.8 (61044508) - Drupal

SA-CORE-2026-009 añadió FileIsImage en los campos de imagen de JSON:API y REST. CKEditor5ImageController::getImageUploadValidators sigue devolviendo únicamente FileExtension, FileSizeLimit y FileImageDimensions. FileImageDimensions retorna sin violación cuando el archivo no es una imagen válida. La extensión del nombre de archivo es la comprobación restante.

Un usuario de un formato de texto con carga de imágenes de CKEditor 5 puede enviar bytes que no son imagen con el nombre x.png a /ckeditor5/upload-image/{editor} y obtener 201 más una URL pública de archivos.

IDsin CVE todavía
ClaseCarga sin restricciones / XSS almacenado si se detecta
AlcanceRemoto (usuario autenticado del formato)
CWECWE-434, CWE-79
CVSSMedio: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
ProductoDrupal core
Afectado11.4.8 (61044508071749629aaf3380aa85971e94df9e84)
Authusuario autenticado de un formato de texto con carga de imágenes de CKEditor 5 (basic_html / full_html en Standard)
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1

Qué puede hacer un atacante

Necesita una cuenta que pueda usar un formato cuyo editor tenga image_upload.status en true. En Standard eso es basic_html y full_html. Un completo desconocido sin cuenta no puede alcanzar esta ruta (_entity_access: editor.use más CSRF).

PrivilegioMétodo / sinkTipoDemostrado en laboratorio o inferido
Escribir bytes que no son imagen en un .png público bajo sites/default/files/inline-images/POST /ckeditor5/upload-image/{editor} multipart uploadintegridadDemostrado en laboratorio. x.png devolvió 201 y url=/sites/default/files/inline-images/x.png
Leer esos bytes de vuelta en la URL pública de archivosGET de la url del JSONreconocimientoDemostrado en laboratorio. 200, 49 bytes, el cuerpo contenía DRUPAL-CKEDITOR-FILEISIMAGE-WITNESS
XSS almacenado en un visitante si el servidor web o el navegador detecta el archivo como HTML/JSMisma URL pública, Content-Type no imageintegridad (origen del visitante)Inferido. Este laboratorio no cambió el MIME de Apache. Drupal almacenó los bytes.
Subir una imagen real a través de la misma rutaControl control.png PNG 1x1previstoDemostrado en laboratorio. 201

Cerrado en este remanente: PHP/RCE vía .php (demostrado en laboratorio 422 FileExtension); carga no autenticada; JSON:API/REST ImageItem (esas rutas ya añaden FileIsImage); LPE; un shell en la lista de extensiones de imagen permitidas por defecto.

Cómo lo encontré

Fijé Drupal 11.4.8 después de la oleada de SA-CORE de 2026. JSON:API ya añade la restricción faltante:

if (\is_a($field_definition->getItemDefinition()->getClass(), ImageItem::class, TRUE) && !array_key_exists('FileIsImage', $validators)) {
  $validators['FileIsImage'] = [];
}

REST FileUploadResource.php hace lo mismo. CKEditor 5 se dejó con nombre de archivo + tamaño + dimensiones:

return [
  'FileExtension' => [
    'extensions' => implode(' ', $allowed_extensions),
  ],
  'FileSizeLimit' => [
    'fileLimit' => $max_filesize,
  ],
  'FileImageDimensions' => [
    'maxDimensions' => $max_dimensions,
  ],
];

FileImageDimensionsConstraintValidator retorna sin violación cuando el archivo no es una imagen válida. El hub drupal:11.4 flotó a 11.4.9; este pin es composer-exact drupal/recommended-project:11.4.8. 11.4.0 eliminó Article de Standard, así que la imagen aplica core/recipes/article_content_type después de la instalación para que /node/add/article cargue CKEditor 5.

Desvíos ya registrados: tratar FileImageDimensions como una comprobación de MIME (son dimensiones sobre una imagen válida, y un no-op en caso contrario); afirmar un shell PHP en la lista de permitidos por defecto (.php es 422); usar la etiqueta flotante del hub y ver aparecer 11.4.9. Teatro: un reverse shell. El oráculo es 201 en el falso x.png más 422 en los mismos bytes con el nombre x.php.

Remanentes del mismo pin: SSRF de segundo salto de oEmbed.

Laboratorio

python3 drupal-ckeditor-fileisimage-Abraxas-Labs.py

o

cd lab
./run.sh

Objetivo solo http://127.0.0.1:19500. Drupal 11.4.8 Standard en vivo sobre php:8.4-apache-trixie, SQLite.

SUCCESS drupal-ckeditor-fileisimage png-http=201 php-http=422 control-png-http=201 editor=basic_html stored-http=200 stored-has-witness=yes url=/sites/default/files/inline-images/x.png DRUPAL-CKEDITOR-FILEISIMAGE-WITNESS

La solución

Añadir 'FileIsImage' => [] a CKEditor5ImageController::getImageUploadValidators. Mantener FileExtension para que .php siga siendo 422. Los tipos de medios de imagen en Media Library deberían usar ImageItem en lugar de un FileItem genérico para que hereden la misma restricción.

Referencias

  • github.com/drupal/drupal etiqueta 11.4.8 (61044508071749629aaf3380aa85971e94df9e84)
  • CKEditor5ImageController.php
  • Cercano parcheado (no esta carga): SA-CORE-2026-009
  • Misma etiqueta: drupal-oembed-ssrf
  • CWE-434 · CWE-79

Licencia

GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.

Descargar herramienta