Ghost CMS : une SQLi aveugle non authentifiée livre la clé Admin
- Ghost 3.24.0 a 6.19.0 (corrige en 6.19.1)
Le contexte
La faille se situe dans la Content API de Ghost, exposée publiquement et en lecture seule. Le point clé : la clé d'API Content est publique par conception - elle est intégrée dans le HTML du thème et visible de tout visiteur. L'endpoint est donc, du point de vue de l'attaquant, effectivement non authentifié. Détail notable : la vulnérabilité a été découverte par Anthropic à l'aide de Claude.
La mécanique
La cause racine est dans l'utilitaire slug-filter-order.js du sérialiseur d'entrée de la Content API. Le code concatène directement les valeurs de slug fournies par l'utilisateur dans des instructions SQL CASE, par interpolation de chaîne, sans paramétrage ni requête préparée (CWE-89).
En plaçant une charge forgée dans le paramètre filter=slug:[...] ou order=slug:[...], un attaquant injecte du SQL arbitraire dans la clause ORDER BY, ce qui donne une lecture aveugle de n'importe quelle table de la base : identifiants admin, hashes bcrypt, secrets de session, et surtout clés Admin API.
Pourquoi c'est sévère
Ghost sépare deux systèmes de clés : la clé Content (publique, lecture seule) et la clé Admin (la clé maîtresse - écriture sur articles, thèmes et comptes). Cette CVE livre la clé Admin à quiconque la demande, sans authentification, en une seule requête.
La chaîne d'attaque observée par XLab/QiAnXin : extraction de la clé Admin via la SQLi, puis injection de JavaScript malveillant dans l'ensemble des articles via l'Admin API. Plus de 700 domaines ont été compromis (universités, fintech, SaaS, médias) pour alimenter des attaques de type ClickFix.
Remédiation
- Mettre à niveau vers Ghost 6.19.1 ou supérieur. Le correctif remplace l'interpolation de chaîne par des liaisons de requêtes paramétrées et ferme entièrement la surface d'attaque. C'est la seule action de fond - il n'existe pas de contournement applicatif.
- Restreindre la clé Content ne sert à rien : elle est publique par conception. Comme mitigation temporaire, une règle WAF ou reverse proxy peut bloquer les requêtes Content API contenant
slug:[dans le paramètre de filtre.
Post-incident
- faire tourner la clé Admin API ;
- rechercher du JS injecté dans le contenu publié ;
- inspecter les journaux à la recherche de requêtes lisant les tables d'utilisateurs admin ou les jetons de session hors des flux applicatifs normaux.
Ce qu'il faut retenir
Une clé "publique par conception" devient une surface non authentifiée dès qu'un seul paramètre n'est pas paramétré. Mettre à jour la version ne suffit pas si la clé Admin a déjà fuité : la rotation de la clé et la chasse au JS injecté font partie de la remédiation, pas de l'optionnel.
- Kreomnis