
WPLP Cookie Consent(gdpr-cookie-consent)<= 4.4.1 における未認証の任意ファイルアップロード → RCE - 技術解説とPoC
CVE-2026-75865 の概念実証(PoC)および技術解説書です。これは、WordPress 用プラグイン WPLP Cookie Consent – Cookie Banner & Consent Management for GDPR, CCPA & Google Consent Mode(スラッグ gdpr-cookie-consent)における、認証なしの任意ファイルアップロードによるリモートコード実行(RCE)に関するものです。4.4.1 までの全バージョンに影響します。
| 主要情報 |
|---|
| CVE | CVE-2026-75865 |
| 深刻度 | 緊急 — CVSS 3.1 9.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| 脆弱性分類 | CWE-862(認可の欠如)+ CWE-434(危険なタイプのファイルの無制限アップロード) |
| 影響を受けるバージョン | gdpr-cookie-consent ≤ 4.4.1 |
| 修正バージョン | 4.4.2 |
| CVE 採番機関 | Wordfence |
| 公開日 | 2026-09-01 |
| 発見者 | Supakiad S. (m3ez) |
このプラグインの SaaS「コネクタ」REST エンドポイントは、ベンダーの SaaS アプリケーションに認証を委譲して Bearer JWT を検証しますが、プラグインは検証エンドポイントが HTTP 200 を返すことだけをチェックします。JWT と対象サイトの間に所有権の紐付けがないため、SaaS が発行した有効なトークン(無料アカウントのものなど)はすべて受け入れられます。
その後、saas_upload_logo() 関数は、攻撃者が指定した base64 ブロブを、攻撃者が指定したファイル名で公開ディレクトリ wp-content/uploads/ に書き込みますが、コンテンツや拡張子の検証は一切行われません。エンドポイントを保護する保存済み API トークン(master_key)も実際には秘密ではありません。プラグイン自身の /store-auth ルートが、同じ JWT チェックの後にリクエストパラメータからこのトークンを上書きするため、認証なしのリクエストから Web ルートでのペイロード実行までの完全なチェーンには、対象 URL と無料の SaaS アカウントのみが必要です。
この脆弱性は 4.4.2 で修正され、アップロードエンドポイントが完全に削除され、コネクタの信頼モデル(JWT 所有権の紐付け、hash_equals()、HMAC リクエスト署名)が再設計されました。
完全な技術分析: REPORT.md
| ファイル | 説明 |
|---|---|
REPORT.md | 詳細な技術解説書: 行番号付きコードによる根本原因分析、4.4.1 → 4.4.2 の修正差分比較、攻撃チェーン、検出と緩和策 |
cve_2026_75865.py | PoC スクリプト — 対象リストをスキャンし、脆弱なサイトを検出して、完全なチェーン(管理者列挙 → master-key 上書き → ペイロードアップロード → 検証)をライブ出力付きで実行します |
payload.php | デフォルトで使用される最小限の無害なペイロード: マーカー文字列を出力し、自己削除(?delete=1)に対応 |
git clone https://github.com/ghostpels/CVE-2026-75865.git
cd CVE-2026-75865
pip install requests # colorama は任意(カラー出力用)
# 1. 有効な SaaS JWT(app.wplegalpages.com の任意のアカウント)を jwt.txt に保存
# 2. 対象リストを作成し、テストを許可されたシステムに対してのみ実行:
python cve_2026_75865.py -l targets.txt -o vuln.txt -t 40 --marker CVE-2026-75865-POC
検証済みのペイロード URL は、各対象の検証が完了するとすぐに vuln.txt に 1 行ずつライブで追記されます。
| オプション | デフォルト | 説明 |
|---|---|---|
-l, --list | (必須) | 対象リスト(1 行に 1 URL) |
-o, --output | vuln.txt | 検証済みペイロード URL(ライブ追記) |
-t, --threads | 40 | 同時実行ワーカー数 |
--shell | payload.php | スクリプトと同じ場所にあるペイロードファイル。アップロード名 = そのベース名 |
--filename | — | カスタムアップロードファイル名(まずこの拡張子が試され、次に --exts が試されます) |
--exts | php,phtml,php5,php74,php7,php3,php4,phar | プライマリ拡張子がブロックされた場合のフォールバック拡張子 |
--jwt-file | jwt.txt | SaaS JWT(最初の空でない行) |
--marker | — | ペイロード応答に含まれていれば有効と判定される文字列 |
--timeout | 15 | リクエストごとのタイムアウト(秒) |
-k, --insecure | オフ | TLS 検証を無効化 |
-v, --verbose | オフ | 接続エラーの詳細を表示 |
このリポジトリは、教育および防御的なセキュリティ研究のみを目的として公開されています。このツールは、自分が所有するシステム、または明示的な書面によるテスト許可を得たシステムに対してのみ使用してください。著者は、この資料の誤用またはそれによって生じた損害について一切の責任を負いません。