ソース:
訳:
数か月前、私は HackerOne プラットフォーム上の VDP に取り組み。
私は通常、サブドメインを検出するためにパッシブ偵察とアクティブ偵察でテストを開始し。
これに続いて、Web サイトを移動するときにさまざまなパラメーターで SQL インジェクション、XSS、SSTI などのテストを実行します。
Web サイトに {7*7} が 49 として反映されていることに気付きました。私の最初の直感は SSTI の悪用を試みることでした。これが RCE の達成につながりました :))
SSTI の悪用に時間を費やした後、その Web サイトが Vue.js フレームワーク を利用する クライアントサイド テンプレート エンジン で構築されていることがわかって。
その結果、SSTI を悪用するすべての道は閉ざされて :))
What are Client-Side Template Engines?
などのクライアント側テンプレート エンジンは AngularJS や Vue.js 、その名前が示すように、クライアント側でデータをレンダリングします。 これらのエンジンは、アクセス可能でクライアントに提示されるデータにのみアクセスでき、データをローカルで処理し。
その影響は主にユーザーに限定されます
そのため、これを簡単に悪用して DOM XSS にエスカレートできるようになりました。
脆弱性の悪用:
を使用してアラートのトリガーを試みるだけです あとは、テンプレート インジェクション{{alert(document.cookie)}} 。
別の悪用方法:
- 初期ペイロードがアラートのトリガーに失敗した場合、JavaScript の実行が可能かどうかについて貴重な洞察が得られます。 このような場合、エラーがスローされ、通常は 「Uncaught TypeError: アラートは関数ではありません」を示します。 このエラーは Vue.js に起因し、多くの場合、特定の行 (行 12345 など) で発生します。
- この行を分析すると、パラメーター「code」をコンテンツとして利用して、新しく構築された関数が明らかになります。 プロセスをより深く理解するために、この行にブレークポイントが設定されています。
- ブラウザのデバッガを活用すると、興味深い機能についてさらに詳しく知ることができます。 JavaScript 関数がオブジェクトであることを考慮すると、「constructor」プロパティを利用して、インスタンス オブジェクトの作成を担当するコンストラクター関数を参照します。 これは、ペイロード {{$emit.constructor}} を使用して実現されます。
- 関数のコンストラクターにアクセスすると、独自の関数を作成できます。 たとえば、ペイロード: {{$emit.constructor`alert(document.cookie)`()}} を利用して、アラート ボックスをポップアップする関数を作成します。
ほなほな。