結論: **XSS(クロスサイトスクリプティング)**は、Webサイトの弱点を使い、そのサイトを見に来た他の利用者のブラウザで、不正なスクリプトを動かす攻撃です。原因は、入力された文字を、そのまま画面に出力してしまうこと。対策の基本は、出力する時のエスケープで、これに、CSPやCookieの設定などを重ねます。
XSSとは
XSSは、Cross-Site Scripting(クロスサイト・スクリプティング)の略です。掲示板、コメント欄、検索結果の画面など、入力した内容が、画面に表示される場所で起こりえます。
流れは、次のとおりです。
- 攻撃者が、不正なスクリプトを、コメント欄などに入力する
- サイトの対策が不十分で、そのスクリプトが、そのままページに含まれる
- 他の利用者が、そのページを開く
- 利用者のブラウザで、スクリプトが実行される
スクリプトは、そのサイトの中で動くものとして、ブラウザに扱われます。そのため、サイトの利用者として、できることが、悪用されます。
起こりうる被害
| 被害 | 内容 |
|---|---|
| ログイン情報の窃取 | Cookieなどを盗まれ、利用者になりすまされる(Cookieとは、セッションとは) |
| 偽の入力欄の表示 | 本物そっくりの入力欄を出し、パスワードなどを入力させる |
| 表示の改ざん | ページの内容を書き換え、偽の情報や、不審なリンクを見せる |
| 利用者の操作の代行 | 利用者の権限で、投稿や設定の変更をされる |
被害を受けるのは、サイトの利用者です。ただし、サイトの運営者も、信用の低下や、対応の負担という影響を受けます。
XSSの3つの種類
| 種類 | 内容 |
|---|---|
| 反射型 | 入力した内容が、その場で、画面に反映される。不審なリンクを開かせて、実行させる |
| 格納型(蓄積型) | 入力した内容が、サイトに保存され、ページを開いた人すべてに、影響する |
| DOMベース型 | サーバーを通さず、ブラウザ側のスクリプトが、危険な書き換えをして起こる |
格納型は、ページを開くだけで、被害が広がりやすいため、特に注意が必要です。CMSやツールの脆弱性情報でも、格納型XSSは、よく報告される種類の1つです。
SQLインジェクションとの違い
| XSS | SQLインジェクション | |
|---|---|---|
| 狙うもの | サイトを見る利用者のブラウザ | サイトのデータベース |
| 不正なものが動く場所 | 利用者の端末(ブラウザ) | サーバー側 |
| 共通点 | 入力されたデータが、命令として扱われてしまう | 同左 |
SQLインジェクションの仕組みは、SQLインジェクションとはで解説しています。
対策:出力する時に「ただの文字」にする
① 出力時のエスケープ(基本)
特殊な文字を、「ただの文字」に変換してから、画面に出力します。
| 元の文字 | 変換後 |
|---|---|
< |
< |
> |
> |
& |
& |
" |
" |
出力する場所(HTMLの中、属性の中、JavaScriptの中、URLの中)によって、必要な変換が違います。場所に合った方法を使います。
② フレームワークの自動エスケープを、切らない
ReactやVueなどは、標準の書き方で、自動的にエスケープします。HTMLをそのまま出力する機能(ReactのdangerouslySetInnerHTML、Vueのv-htmlなど)は、安全が確認できた文字列だけに使います。
③ HTMLを許可する場合は、専用の部品を使う
リッチテキストのように、一部のHTMLを許可したい場合は、自作の処理ではなく、サニタイズ用の、実績のあるライブラリを使います。
④ 被害を小さくする、追加の対策
| 対策 | 内容 |
|---|---|
| CSP(コンテンツセキュリティポリシー) | 実行してよいスクリプトの出どころを、ブラウザに指定する |
| Cookieの属性(HttpOnly・Secure・SameSite) | スクリプトからCookieを読み取れないようにするなど |
| 入力チェック | 形式を確認する補助。それだけでは不十分 |
| WAF | 既知の攻撃パターンを、手前で止める補助(WAFとは) |
| 部品の更新 | 使っているソフトやプラグインの、脆弱性の修正を適用する |
入力チェックだけに頼ると、漏れが出やすくなります。出力時のエスケープを主役にして、他の対策を重ねます。
利用者ができる備え
利用者は、サイトの弱点を、直接直せません。それでも、次の備えで、被害を小さくできます。
- 不審なリンクを開かない(特に、メールやSMSのリンク)
- ブラウザと、拡張機能を、最新にする
- 重要なサービスには、多要素認証を設定する(二段階認証とパスキー)
- ログイン画面は、ブックマークや公式アプリから開く
まとめ
- XSSは、サイトの弱点を使い、他の利用者のブラウザで、不正なスクリプトを動かす攻撃
- 被害にあうのは利用者。Cookieの窃取、偽の入力欄、表示の改ざんなどが起こりうる
- 原因は、入力された文字を、そのまま出力してしまうこと。種類は、反射型・格納型・DOMベース型
- 対策の基本は、出力時のエスケープ。CSP・Cookieの設定・部品の更新を重ねる
関連記事:SQLインジェクションとは、SQLインジェクション対策、WAFとは、Cookieとは、脆弱性とは
あわせて読みたい:CSRF(クロスサイトリクエストフォージェリ)とは