XSS Attack から学ぶセキュアコーディング

 

ソース:

medium.com

脆弱性XSS

 

訳:

例 1: セッションハイジャック脆弱性

図 2: 脆弱なコード

図 3: クッキー

ここでは、アプリケーションにCookieを設定し。
URL param(name) を操作して、スクリプトを実行し、攻撃者のエンドポイントに Cookie を送信することができ。


図 4: パラメータは最初に「encodeURIComponent()」を使用してエンコードされ、次に特殊文字を処理するために URL に渡されて

URL Param: “?name=[Encoded_URI_Component]”

 

「img src」が存在しない場合、「onerror」部分が実行され、その結果、Cookie が攻撃者のエンドポイントに送信されて。

 

図 5: Cookie が攻撃者のエンドポイントに送信される (リクエスト URL)

 

例 2: 不正行為の脆弱性

場合によっては、私たちの知識や行動なしに、私たちのアカウントで投稿が作成されることがあり。

 

図 6: 脆弱なコード

URL Param: “?name=<img src=“error.gif” onerror=“createPost(‘HACK_TITLE’, ‘HACK_DESCRIPTION’);” />”

 

「img src」がない場合、「onerror」部分が実行され、ユーザー入力が適切に処理されず、リクエストがシステムから送信されたため、投稿が作成されて。

 

図 7: ペイロード

図 8: 投稿が行われるエンドポイント

 

例 3: キーストロークのキャプチャ

 

図 9: 脆弱なコード

図 10: パラメータは最初に「encodeURIComponent()」を使用してエンコードされ、次に特殊文字を処理するために URL に渡され

URL Param: “?name=[Encoded_URI_Component]”

 

すべてのキーストロークが監視され、攻撃者のエンドポイントに送られ。

 

図 11: 監視されるキーストローク

図 12: キーストロークが送信されるエンドポイント

 

例 4: 重要な情報を盗む

 

コンテンツ全体/DOM (あらゆる種類の情報を含むことができる) を特定の URL に送信する。

 

図 13: 脆弱なコード

図 14: パラメータは最初に「encodeURIComponent()」を使用してエンコードされ、次に特殊文字を処理するために URL に渡され

URL Param: “?name=[Encoded_URI_Component]”

 

ページのコンテンツ全体が攻撃者のエンドポイントに送信され。

 

図 15: 攻撃者のエンドポイントに送信されたコンテンツ全体

 

例 5: フィッシング攻撃

 

図 16: 脆弱なコード

図 17: パラメータは最初に「encodeURIComponent()」を使用してエンコードされ、次に特殊文字を処理するために URL に渡され

URL Param: “?name=[Encoded_URI_Component]”

 

フォームが開き、そこからログインの詳細が偽のエンドポイントに送信され。

 

図 18: URL を押すとログイン フォームが開きます

図 19: ログインの詳細が偽のエンドポイントに送信されます

緩和

  • すべてのユーザー入力を処理する
  • innerText を使用する | innerHTML の代わりに textContent

  • 逃げる

 

 

特殊文字をコードに置き換えて、DOM 要素ではなくテキストとしてみなされるため実行されないようにし。

  • Reactのようなライブラリを使う

 

{name} — DOM 要素ではなくテキストとして考慮されます

  • DOM Purify などのライブラリを使用してデータをサニタイズする

 

  • CSP ヘッダー (コンテンツ セキュリティ ポリシー)

許可されたソース | スクリプトナンス | レポート専用モード

次の例では、サードパーティのサイトが CSP ヘッダーを通じてブロックされて

 

 

ほなほな。