Shikata Ga Nai

Private? There is no such things.

LAB: jQueryのアンカーhref属性とlocation.searchによるDOM型XSS

Hello there, ('ω')ノ

🔍 ラボの概要

このラボでは、submit feedback ページにおいて、DOMベースのクロスサイトスクリプティング(DOM XSS)脆弱性が存在します。

具体的には、jQueryの $ セレクタ関数が location.search から取得したデータを使用して、アンカータグの href 属性を動的に変更しています。

この実装により、攻撃者は悪意のあるJavaScriptコードを注入し、ユーザーがリンクをクリックした際に任意のスクリプトを実行させることが可能となります。


🛠️ 解決手順

  1. submit feedback ページにアクセスします。

  2. URLのクエリパラメータ returnPath に任意の文字列を設定し、ページをリロードします。

    例: https://YOUR-LAB-ID.web-security-academy.net/feedback?returnPath=/test([medium.com][1])

  3. ブラウザの開発者ツールを開き、<a id="backLink"> 要素を確認します。

    この要素の href 属性が、returnPath パラメータの値に設定されていることを確認します。

  4. returnPath パラメータの値を、JavaScriptスキームを使用した悪意のあるコードに変更します。

    例: javascript:alert(document.cookie)([infosecwriteups.com][2])

    最終的なURL:

    https://YOUR-LAB-ID.web-security-academy.net/feedback?returnPath=javascript:alert(document.cookie)

  5. ページがリロードされたら、<a id="backLink"> 要素の href 属性が javascript:alert(document.cookie) に変更されていることを確認します。

  6. Back リンクをクリックすると、alert ダイアログが表示され、document.cookie の内容が表示されます。([medium.com][3])


🧠 解説

この脆弱性は、ユーザーからの入力(この場合はURLのクエリパラメータ)が適切に検証・サニタイズされずに、DOM要素の属性に直接挿入されることに起因します。

特に、href 属性に javascript: スキームを使用することで、リンククリック時に任意のJavaScriptコードを実行させることが可能となります。

このような実装は、ユーザーの信頼を悪用し、セッションハイジャックやフィッシング攻撃などのリスクを高めます。


💡 対策

  • ユーザーからの入力をDOMに挿入する前に、適切なエスケープやサニタイズ処理を行う。

  • href 属性にユーザー入力を使用する場合、javascript: スキームを禁止し、許可されたスキーム(例: http, https)のみを許容する。

  • セキュリティライブラリやフレームワークの利用を検討し、既知の脆弱性を回避する。

Best regards, (^^ゞ