
Los sitios web de Ghost CMS desactualizados que han sido comprometidos por CVE-2026-26980 pueden sufrir inyección de código de spam en las páginas. Utilice esto para limpiar y editar en masa los campos de inyección de código.
Elimina el código inyectado de cada entrada y página de un sitio web Ghost CMS mediante la Admin API.
Utilícelo para limpiar un sitio Ghost comprometido — por ejemplo, uno afectado por la vulnerabilidad de inyección de código CVE-2026-26980 — eliminando las etiquetas <script> introducidas por el atacante y otro marcado inyectado de los campos de inyección de código Header y Footer de cada entrada y cada página.
Es seguro por defecto (primero simulación, luego aplicación) y estrictamente delimitado: solo borra esos dos campos por entrada. La inyección de código de todo el sitio (Ghost Admin → Settings → Code injection), el contenido de las entradas y todos los demás ajustes nunca se tocan.
requirements.txt):pip install -r requirements.txt
6478abc123def456:8f9e0d1c2b3a4567890abcdef1234567890abcdef1234567890abcdef12345678
Cree un archivo llamado ghost_cleaner_config.json en el mismo directorio que el script:
{
"ghost_url": "https://yourdomain.com",
"admin_api_key": "YOUR_KEY_ID:YOUR_KEY_SECRET"
}
Si omites este paso, el script creará un archivo de configuración de ejemplo para ti en la primera ejecución y saldrá — solo tienes que rellenarlo y volver a ejecutarlo.
Ejecuta siempre esto primero para ver exactamente qué se borraría antes de tocar nada:
python3 ghost_injection_cleaner.py
Ejemplo de salida:
Ghost Injection Remover
Mode : DRY-RUN (read-only)
Target: https://yourdomain.com
NOTE: /ghost/api/admin/settings/ (site-wide injection) is
never read or written by this script.
============================================================
POSTS
============================================================
47 posts fetched.
✦ 'My First Post'
HEAD: '<script>(function(){var _x="...obfuscated..."</script>'
🔍 DRY-RUN - would be cleared.
============================================================
PAGES
============================================================
6 pages fetched.
============================================================
SUMMARY
============================================================
Would clear : 1 posts/pages
Already clean: 52 posts/pages
Re-run with --apply to commit these changes.
Una vez que estés satisfecho con la salida del dry-run, ejecuta con --apply. Se te pedirá confirmación:
python3 ghost_injection_cleaner.py --apply
Type YES to confirm changes to posts and pages: YES
...
✅ Cleared.
python3 ghost_injection_cleaner.py --config /path/to/my_config.json
Para cada entrada y página, establece ambos campos en null:
| Campo | Ubicación en el editor de Ghost |
|---|---|
codeinjection_head | Configuración de la entrada/página → Inyección de código → Encabezado |
codeinjection_foot | Configuración de la entrada/página → Inyección de código → Pie de página |
Las entradas y páginas que no tienen inyección se omiten silenciosamente.
Missing dependencies
Ejecuta pip install -r requirements.txt y vuelve a intentarlo.
admin_api_key must be in 'id:secret' format
Asegúrate de que tu clave tenga dos puntos en el medio. Debería verse como dos cadenas hexadecimales separadas por :. Cópiala directamente desde Ghost Admin sin añadir espacios.
ERROR: Ghost API returned HTTP 401
Tu clave de Admin API puede ser incorrecta o la integración puede haber sido eliminada. Vuelve a Ghost Admin → Settings → Integrations y verifícalo.
ConnectionError o tiempo de espera agotado
Comprueba que ghost_url en tu configuración sea correcta y que el sitio sea accesible desde la máquina en la que ejecutas el script.
El script se queda colgado en un sitio grande Cada página de 50 entradas genera un JWT nuevo y espera a la API. Esto es normal — dale un minuto.