タイトルの通りです。
とはいえ、XSS 脆弱性を知るためにまずはブラウザに備わる SOP という機能について説明します。
Same Origin Policy (SOP) とは
Same Origin Policy (SOP) は、Webブラウザの保護機構であり、セキュリティ対策の一環として、ルールに基づいて Origin 間の書き込みや読み込みを制限します。
Origin の決定
SOPでは、以下の3つの要素に基づいてOriginが決まります:
-
スキーム(Scheme): 例:
https
-
ホスト名(Hostname): 例:
example.com
-
ポート番号(Port Number): 例:
443
例えば、https://example.com:443/some/path
の場合:
-
スキーム:
https
-
ホスト名:
example.com
-
ポート番号:
443
このURLが示すOriginは、https://example.com:443
です。
同一Originの場合
- 読み込み、書き込みが可能です。
異なるOriginの場合
- 読み込み不可。
- 書き込み許可制(CORS)
SOP の動作原理
通信を行うソースコードが埋め込まれたWebページが、その通信先のOriginを比較して判断します。
Cross-Site Scripting (XSS) 脆弱性
Cross-Site Scripting (XSS) は、JavaScriptやHTMLタグを何らかの方法でWebページに注入し、それを用いて情報を盗んだり、Webアプリケーション内で不正な操作を行う攻撃手法です。このような脆弱性を「XSS脆弱性」と呼びます。
上述の通り Origin をまたぐ通信は制約があるのでおこなれませんが、同一 Origin だった場合は特に制約がないためこの脆弱性が存在する可能性があります。
XSS の種類
-
Reflected XSS
- 攻撃で取得した内容を画面に表示する手法。
-
Stored XSS
- リクエストに含まれた悪意のある値がデータベースに保存され、その後別のリクエストで使用される手法。
-
DOM-based XSS
- 取得した値をDOMを操作して表示させる手法。
XSS 脆弱性のリスク
-
Cookie奪取
- JavaScriptで
document.cookie
にアクセスされてしまう。
- JavaScriptで
-
Cookie付きリクエストによる不正操作
- 同一Origin内で任意のURLを入れてリソースを直接操作。
-
フィッシング
- DOM操作を通じて、偽のフォームを表示し、クレジットカード情報などを盗む。
XSS 対策
-
出力の際のエスケープ処理
- 特にReflected XSSとStored XSSに有効です。
-
innerHTML
やeval
など、HTMLとして解釈されるAPIは使用せず、DOM APIを利用します。
-
HTMLエスケープ
- HTMLタグ内にエスケープ処理を施す。
-
href
属性の場合、スキームのチェックを行い、http://
などの正当なスキームであることを確認します。
-
Cookieに HttpOnly 属性を付ける
- JavaScriptからのアクセスを防ぎます。
-
Content Security Policy (CSP) の活用
- コンテンツの制限を通じて、悪意のあるスクリプトの実行を防ぎます。