Shikata Ga Nai

Private? There is no such things.

LAB: DOM XSS in jQueryのセレクタシンクとhashchangeイベントを利用した攻撃

Hello there, ('ω')ノ

🔍 概要

このラボでは、jQueryの$()セレクタ関数がlocation.hashの値をもとに特定のブログ記事に自動スクロールする機能を持っています。この実装により、DOMベースのクロスサイトスクリプティング(DOM XSS)の脆弱性が生じています。攻撃者は、location.hashに悪意のある入力を与えることで、任意のJavaScriptコードを実行させることが可能です。


🎯 攻撃の目的

被害者のブラウザでprint()関数を呼び出すことで、DOM XSSの脆弱性を実証します。


🛠️ 手順

  1. 脆弱なコードの確認 ブラウザの開発者ツールやBurp Suiteを使用して、以下のようなJavaScriptコードが存在することを確認します:
   $(window).on('hashchange', function(){
       var post = $('section.blog-list h2:contains(' + decodeURIComponent(window.location.hash.slice(1)) + ')');
       if (post) post.get(0).scrollIntoView();
   });

このコードは、URLのハッシュ部分が変更されると、その値を使って特定のブログ記事にスクロールする機能を実装しています。

  1. 悪意のあるiframeの作成 ラボのエクスプロイトサーバーを開き、以下のHTMLコードを「Body」セクションに追加します:
   <iframe src="https://YOUR-LAB-ID.web-security-academy.net/#" onload="this.src+='<img src=x onerror=print()>'"></iframe>

YOUR-LAB-IDは、ラボのURLに合わせて適切に置き換えてください。

  1. エクスプロイトの保存と確認 「Store」をクリックしてエクスプロイトを保存し、「View exploit」をクリックして、print()関数が呼び出されることを確認します。

  2. 被害者へのエクスプロイトの配信 エクスプロイトサーバーに戻り、「Deliver to victim」をクリックして、被害者にエクスプロイトを配信します。


💡 解説とポイント

  • hashchangeイベントの利用: location.hashの値が変更されると、hashchangeイベントが発火し、指定された関数が実行されます。

  • jQueryのセレクタの脆弱性: $()関数にユーザー入力が直接渡されると、意図しないDOM操作が可能となり、XSSの原因となります。

  • iframeを使った自動化: iframeを使用することで、ユーザーの操作なしにhashchangeイベントをトリガーし、攻撃を自動化できます。

  • print()関数の使用: Chromeブラウザでは、alert()関数が制限されている場合があるため、代わりにprint()関数を使用してXSSの実行を確認します。


✅ まとめ

このラボでは、jQueryのセレクタ関数とhashchangeイベントを悪用したDOMベースのXSS攻撃を実施しました。ユーザー入力を適切にサニタイズしないことが、どのようにしてセキュリティ上の重大なリスクにつながるかを理解することができます。このような脆弱性を防ぐためには、ユーザーからの入力を信頼せず、適切なエスケープ処理や入力検証を行うことが重要です。

Best regards, (^^ゞ