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
15hace 8 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

Análisis: https://abraxaslabs.tech/research/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 infracció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 por POST bytes que no son imagen con el nombre x.png a /ckeditor5/upload-image/{editor} y obtener un 201 más una URL pública de archivos.

IDaún sin CVE
ClaseCarga sin restricciones / XSS almacenado si se detecta por sniffing
AlcanceRemoto (usuario autenticado de un 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)
Autenticaciónusuario 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/JS por sniffingMisma URL pública, Content-Type no imageintegridad (origen del visitante)Inferido. Este laboratorio no modificó el MIME de Apache. Drupal almacenó los bytes.
Subir una imagen real a través de la misma rutaControl control.png PNG de 1x1previstoDemostrado en laboratorio. 201

Descartado en este análisis: PHP/RCE mediante .php (demostrado en laboratorio 422 FileExtension); carga no autenticada; ImageItem de JSON:API/REST (esas rutas ya añaden FileIsImage); LPE; una shell en la lista de extensiones de imagen permitidas por defecto.

Cómo lo encontré

Fijé Drupal 11.4.8 tras 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 una 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, por lo que la imagen aplica core/recipes/article_content_type después de la instalación para que /node/add/article cargue CKEditor 5.

Errores ya registrados: tratar FileImageDimensions como una comprobación de MIME (son dimensiones sobre una imagen válida, y una no-op en caso contrario); afirmar una 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: una reverse shell. El oráculo es 201 en un x.png falso más 422 en los mismos bytes nombrados x.php.

Restos del mismo pin: SSRF de segundo salto en oEmbed.

Laboratorio

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

o

cd lab
./run.sh

Dirígete solo a 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 devolviendo 422. Los tipos de medios de imagen en la Biblioteca de Medios 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
  • Parcheado cercano (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 de loopback. Sin garantía.

Descargar herramienta