
Demonstração educacional de exploit do CVE-2024-12877 para Injeção de Objetos PHP no plugin GiveWP do WordPress. Inclui análise de causa raiz, técnicas de bypass de regex e práticas seguras de exploração.
Semana 66 | Autor: Ali Soltani (soltanali0)
Bem-vindo à Semana 66 da série GO-TO CVE, onde dissecamos vulnerabilidades, analisamos as causas raiz e demonstramos técnicas práticas de exploração em um contexto educacional e seguro.
CVE-2024-12877 é uma vulnerabilidade de Injeção de Objetos PHP no GiveWP, um dos plugins de doação do WordPress mais utilizados. O uso inseguro de unserialize() em entrada controlada pelo usuário permite que atacantes acionem métodos mágicos do PHP (como __wakeup()), podendo levar a:
CVSS: 9.8 Crítico | Vetor: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
O GiveWP alimenta milhares de sites de caridade, ONGs e plataformas de arrecadação de fundos. Como ele lida com dados financeiros e de doadores sensíveis, uma vulnerabilidade aqui tem um impacto altíssimo. Um atacante que explore a injeção de objetos pode escalar de um único plugin para comprometer toda a instalação do WordPress e o servidor subjacente.
Causa raiz: unserialize() em entrada não confiável.
Métodos mágicos do PHP: O PHP os invoca automaticamente durante o ciclo de vida do objeto:
A vulnerabilidade decorre do uso inseguro da função PHP unserialize() em entrada controlada pelo usuário. Embora unserialize() seja projetada para reconstruir estruturas de dados do PHP, ela traz um efeito colateral perigoso: quando objetos são reconstruídos, o PHP invoca automaticamente os métodos mágicos.
__wakeup() – acionado quando um objeto é desserializado
__destruct(), __toString(), __get/__set(), __call/__callStatic() – podem ser explorados para execução maliciosa
Validação por Regex: O GiveWP implementou verificações de regex para detectar entrada serializada. Embora a nova regex capture mais tipos de dados, regex não pode prevenir de forma confiável a injeção de objetos.
Com um objeto serializado especialmente criado, o atacante define as propriedades do objeto, e o próprio PHP executa a lógica do atacante ao invocar os métodos mágicos.
O GiveWP implementou validação baseada em regex para verificar se a entrada era serializada. Regex Antiga (incompleta)
• Reconhecia apenas arrays e objetos.
• Outros tipos serializados (string, int, bool, float, null) ignoravam a detecção.
• Reconhece todos os tipos serializados do PHP.
• Bloqueia alguns payloads triviais.
• Mas o problema central permanece: se unserialize() for usado em entrada do usuário, a regex não vai salvar você.
Este trecho foi escrito para comparar duas implementações diferentes de regex:
• is_serialized_old() → a versão antiga, que apenas detecta arrays e objetos.
• is_serialized_new() → a versão melhorada, que reconhece todos os tipos de dados serializados do PHP (arrays, objetos, strings, inteiros, booleanos, floats e null). Criamos um conjunto de valores de teste (array, object, string, integer, boolean, float, null), serializamo-los e verificamos cada um contra ambas as funções de regex. Em termos simples:
E depois de executar este código no seu dokcer, veja este resultado no navegador.
Passo 1
Passo 2: Criar uma classe vulnerável
Esta classe possui um método __wakeup() que será executado automaticamente quando o objeto for desserializado.
Passo 3: Criar o payload
Passo 4: Saída Depois de salvar o arquivo, você pode ver este exploit neste arquivo.
Exploit :
• Regex Antiga: FALSE → falhou ao detectar o payload.
• Nova Regex: TRUE → detectou-o como entrada serializada.
• Execução: Hello RCE! → O payload foi desserializado, e o método mágico __wakeup() executou código controlado pelo atacante.
Prevenção • Não use unserialize() em entrada não confiável. Substitua-o por json_decode() ou outras alternativas mais seguras.
• Mantenha o GiveWP e todos os plugins do WordPress atualizados.
• Implemente um Web Application Firewall (WAF) para bloquear payloads serializados maliciosos.
• Siga o Princípio do Menor Privilégio: execute contas PHP e de banco de dados com as permissões mínimas necessárias.
Resultados:
Ponto-chave: Nunca confie em regex para proteger unserialize(). A abordagem mais segura é evitar totalmente a desserialização de entrada não confiável.
unserialize() em entrada não confiável; prefira json_decode() ou outras alternativas seguras.Eu administro dois canais no Telegram dedicados à pesquisa e exploração de vulnerabilidades:
Episódios Semanais GO-TO CVE: Toda semana, mergulhamos fundo em um novo CVE e compartilhamos análises detalhadas, demonstrações e insights. 🔗 Junte-se a nós aqui
CVEdb – Arquivo de Exploits: Este canal arquiva exploits de 1 dia e PoCs personalizados para CVEs. Um ótimo recurso para pesquisadores que desejam ver técnicas de exploração ativas. 🔗 Junte-se ao CVEdb
Siga os canais para ficar por dentro das últimas CVEs, técnicas de exploração e insights de pesquisa em segurança.
Este repositório é estritamente para fins educacionais e de pesquisa. Explorar vulnerabilidades sem permissão é ilegal e antiético. O autor não é responsável pelo mau uso.