
CVE-2025-68147 用の PoC リポジトリ: OpenSourcePOS における保存型クロスサイトスクリプティング (XSS)。この脆弱性により、Store Config モジュールへの悪意のある JavaScript インジェクションを介して特権昇格が可能になります。ペイロードの詳細とパッチ検証 (v3.4.0) を含みます。セキュリティ研究者: Aditya Singh (Nixon-H)。
| メタデータ | 詳細 |
|---|---|
| CVE ID | CVE-2025-68147 |
| 重大度 | 高 CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N |
| 脆弱性タイプ | 格納型クロスサイトスクリプティング (CWE-79) |
| 影響を受けるバージョン | OpenSourcePOS v3.4.0、v3.4.1 |
| 修正済みバージョン | v3.4.2 |
| 影響を受けるコンポーネント | ストア設定モジュール(Return Policy フィールド) |
| 報告者 | Aditya Singh (Nixon-H) |
OpenSourcePOS の ストア設定 モジュールに、格納型クロスサイトスクリプティング (XSS) の脆弱性が発見されました。このアプリケーションは、"Return Policy" フィールドのユーザー入力を ospos_app_config データベーステーブルに保存する前に、適切にサニタイズしていませんでした。
この欠陥により、設定権限を持つ認証済みの攻撃者(または、別の CSRF チェーンを悪用する攻撃者)が任意の JavaScript ペイロードを注入できる可能性がありました。"Return Policy" はすべての販売レシートに動的にレンダリングされるため、注入されたペイロードは、レシートが生成または表示されるたびに、任意のユーザー(権限の低いレジ担当者、他の管理者、顧客など)のブラウザで自動的に実行されます。
この脆弱性は、レシート表示テンプレートの app/Views/sales/receipt_default.php に存在します。
このアプリケーションは、グローバル設定配列($this->config['return_policy'])から "Return Policy" 文字列を取得し、表示用に準備します。
nl2br() を使用して、改行を HTML の改行タグ(<br>)に変換していました。nl2br() は HTML の特殊文字をサニタイズしません。<script>、``、onload 属性などのタグを完全にそのまま残します。脆弱なコード(修正前):
<div id="sale_return_policy">
<?php echo nl2br($this->config['return_policy']); ?>
</div>
管理者が設定を保存すると、ペイロードは生のままデータベースに保存されます。
ospos_app_configreturn_policyPolicy Text... <script>alert('XSS')</script>コントローラー側(Config.php)に入力サニタイズがなく、ビュー側(receipt_default.php)に出力エスケープがないため、このアプリケーションは格納型 XSS に対して脆弱です。
この攻撃は ストア設定 パネルを標的としますが、影響を受けるのは 販売/レシート モジュールです。
http://[TARGET]/config(設定保存の POST リクエスト)http://[TARGET]/sales/receipt/[SALE_ID]ステップ 1: インジェクション 管理者としてログインし、ストア設定 -> 一般 に移動しました。"Return Policy" テキストエリアに、以下の特定のペイロードを注入しました:
Standard Return Policy: No Refunds.
<script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
ステップ 2: 永続化
「送信」をクリックすると、アプリケーションは /config/save に POST リクエストを送信しました。ペイロードはデータベースへの保存に成功しました。
ステップ 3: トリガー 他のユーザーへの影響を検証するため:
http://localhost/sales/receipt/1)にリダイレクトします。ブラウザは return_policy の div を解析し、<script> タグに遭遇すると、即座に JavaScript を実行します。確認された結果:
XSS_BY_NIXON_SUCCESSFUL というメッセージのブラウザアラートボックスが表示されました。
スクリーンショット 1: アラートの発動
スクリーンショット 2: 設定内のペイロード
🎥 ビデオデモ: クリックして PoC ビデオをダウンロード/視聴
これはスコープ変更 (S:C) を伴う脆弱性です。攻撃はサーバーに保存されますが、被害者のブラウザコンテキストで実行されるためです。
/sales/receipt/105)を表示します。スクリプトは静かに実行され、document.cookie(ospos_session ID を含む)を攻撃者のサーバーに送信します。/employees/save への隠し POST リクエストを強制的に送信させます。hacker / password123)がバックグラウンドで即座に作成されます。被害者はレシートしか見えませんが、攻撃者は永続的なバックドアを獲得します。この脆弱性は OpenSourcePOS v3.4.2 で修正されました。
メンテナーは、コンテキスト認識型出力エンコーディング を実装するパッチを適用しました。設定値は nl2br() に渡される前に、CodeIgniter のグローバル esc() ヘルパー関数でラップされるようになりました。
パッチ(コミット 22297a):
<div id="sale_return_policy">
<?php echo nl2br(esc($this->config['return_policy'])); ?>
</div>
確認: v3.4.2 にアップグレード後、同じペイロードは無害なテキストとしてレンダリングされます:
Standard Return Policy: No Refunds. <script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
22297a)が開発され、研究者によって検証されました。