
CVE-2026-87902を再現するDockerベースのローカルラボ。WordPressのページテンプレートにおけるパストラバーサルによりローカルのPHPファイルインクルージョンが発生し、PEARを利用したRCEに至る脆弱性で、PoCスクリプトを同梱。
CVE-2026-87902(WordPress ページテンプレート解析パストラバーサル → ローカル PHP ファイルインクルード → pearcmd ファイル書き込み RCE)を再現するローカル Docker 演習場。
⚠️ 認可された環境でのセキュリティ学習・研究専用。ローカル Docker 内でのみ実行可能であり、未認可のターゲットに対して使用することは禁止されています。脆弱性は 2026-09-22 に公式によって修正され、サポート対象の全ブランチでパッチがリリースされています。
get_page_template() がユーザー制御可能な pagename パラメータに対して二次的な urldecode() を行った後、テンプレート候補名に連結する。locate_template() は file_exists() でファイルを探し、読み込み前に realpath/拡張子/読み取り可能チェックのみを行い、パスが依然としてテーマディレクトリ内にあることを検証していない(canonicalization はあるが、containment がない)| # | 条件 | 本演習場での満たし方 |
|---|---|---|
| 1 | 公開済みで、カスタムテンプレートが指定されていないページ | setup.sh がサンプルページを自動生成・削除 |
| 2 | 有効なテーマの最上位に page-* ディレクトリが存在 | theme/mytheme/page-templates/(有効化テーマにこのディレクトリを含む) |
| 3 | 読み取り可能な /usr/local/lib/php/pearcmd.php | 公式 php イメージに PEAR が同梱 |
| 4 | register_argc_argv=On + 書き込み可能な出力先 | 公式イメージには php.ini がなく、コンパイル時のデフォルト値は On;/tmp は書き込み可能 |
docker compose up -d # 初回はイメージを自動取得(約1GB)
sh setup.sh # セットアップ + /flag 設置 + 4条件の検証
python cve-2026-87902.py --url http://127.0.0.1:8091
期待される出力:
[*] page id : 4 (about, default template, via /index.php?rest_route=...)
[*] depth 7 : stage 1 HTTP 200, stage 2 HTTP 200
[+] marker : 'CVE-2026-87902-POC-OK' found 12 time(s) in the stage-2 response
[+] EXPLOIT SUCCESSFUL - PHP executed with the web-server account's privileges
(12 回 = PEAR 設定ファイルには 12 個の設定項目があり、それぞれに payload が埋め込まれている)
stage 1 で PEAR が書き出したファイルを確認する(#PEAR_Config 0.9 で始まる serialize テキストで、payload は通常の文字として 12 個の設定項目に埋め込まれている):
docker compose exec wordpress cat /tmp/wp-pear-rce-flag.php
register_argc_argv=On によりクエリ文字列が + で $argv に分割され、pearcmd は自分がターミナルで呼び出されたと誤認する;config-create <root> <file> が root(埋め込まれた PHP コード)をそのまま対象ファイルに書き込む<?=...?> が実行され、/flag を読み取って出力するCVE-2026-87902-POC-OK(コンテナ内の /flag に存在)setup.sh を実行してください完全なクリーンアップ(コンテナ + データボリューム + イメージ):
docker compose down -v --rmi all
docker-compose.yml WordPress 7.0.2-php8.3-apache + MySQL 8.4 + wp-cli
theme/mytheme/ 実験用テーマ(page-templates/ ディレクトリを含む、条件②)
cve-2026-87902.py PoC(ressl/cve-2026-87902-poc より、著作権は原作者に帰属)
setup.sh ワンクリックセットアップ + 4条件の自己チェック