目次
- XSSとは?
- 攻撃による影響は?
- XSS対策として必要なこと
XSSとは?
- Cross Site Scripting の略
- 攻撃対象のアプリケーションに対してスクリプトを埋め込まれ、利用者のブラウザ上で実行されることで被害をもたらす攻撃
攻撃による影響
サイト利用者に対しての攻撃
- 本物サイト上に偽のページが表示される
- フィッシング
- 企業やサービスのWebサイトに悪意のあるURLを記載することで、ユーザを偽サイトに誘導し、個人情報及び機密データを入力させられる
- 偽情報流出
- フィッシング
- ブラウザに保存されているCookie上の情報を盗まれる
- セッションハイジャック・・・格納されたセッションIDが盗まれることが原因で、利用者へのなりすましに遭う
- サーバ内への侵入
- 機密情報の搾取(さくしゅ)
- 不正出金
- クレジットカードの不正利用
- 個人情報等が格納
- その情報が漏えいする
- セッションハイジャック・・・格納されたセッションIDが盗まれることが原因で、利用者へのなりすましに遭う
- 任意のCookieをブラウザに保存させられる
- セッションIDが送り込まれ、セッションID固定化攻撃を受ける
XSS対策として必要なこと
1) HTMLテキストの入力を許可しない場合の対策
2) HTMLテキストの入力を許可する場合の対策
3) 全てのウェブアプリケーションに共通の対策
それぞれの根本的解決を抽出して下に記載します
1) HTMLテキストの入力を許可しない場合の対策
根本的解決
-
出力する要素に対してエスケープ処理を入れる
- ウェブページの表示に影響する特別な記号文字(「<」、「>」、「&」等)を、HTMLエンティティ(「
<
」、「>
」、「&
」等)に置換する - エスケープ処理が必須となる場面
- 外部からウェブアプリケーションに渡される「入力値」の文字列
- データベースやファイルから読み込んだ文字列
- 何らかの文字列を演算によって生成した文字列
- JavaScriptのdocument.writeメソッドやinnerHTMLプロパティ等を使用して動的にウェブページの内容を変更する場合
sanitize-htmlのようなライブラリを使用してサニタイズしたりします
- ウェブページの表示に影響する特別な記号文字(「<」、「>」、「&」等)を、HTMLエンティティ(「
-
URLを出力するときは、「http://」や 「https://」で始まるURLのみを許可
- urlには、「javascript:」の形式で始まるものもある
- 出力するリンク先や画像のURLが、外部からの入力に依存して動的に生成される場合、そのURLにスクリプトが含まれていると、XSSへの脆弱性が生まれる
- urlには、「javascript:」の形式で始まるものもある
-
<script>...</script>
で 要素の内容を動的に生成しない- 外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性がある
- 例)innerHTML
-
スタイルシートを任意のサイトから取り込めるようにしない
- スタイルシートには、スクリプトを記述することができる
- 任意のサイトに置かれたスタイルシートを取り込めるような設計をすると、生成するウェブページにスクリプトが埋め込まれてしまう可能性がある
- スタイルシートには、スクリプトを記述することができる
2) HTMLテキストの入力を許可する場合の対策
根本的対策
- 入力されたHTMLテキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する
- ただし、これには複雑なコーディングが要求され、処理に負荷がかかるといった影響もあるため、実装には十分な検討が必要
構文解析・・・プログラミング言語 → 機械語への変換の際に行われる処理の一つ
3) 全てのウェブアプリケーションに共通の対策
根本的対策
-
HTTPレスポンスヘッダのContent-Typeフィールドに文字コード(charset)を指定する
- 「Content-Type: text/html; charset=UTF-8」のように、文字コード(charset)を指定
→ 省略した場合、ブラウザは、文字コードを独自の方法で推定して、推定した文字コードにしたがって画面表示を処理
webサーバーにApacheを使用している場合、以下のように文字コードの指定を行う
- 「Content-Type: text/html; charset=UTF-8」のように、文字コード(charset)を指定
httpd.conf ファイル、または、.htaccess ファイル
AddType "text/html; charset=UTF-8" html
返ってきたレスポンスヘッダが以下
charset=UTF-8
を文字コードとして指したことで、Content-Type
として返却されています
HTTPレスポンスヘッダ.
HTTP/1.1 200 OK
Date: Sat, 29 Oct 2022 11:03:45 GMT
Server: Apache
Last-Modified: Sat, 29 Oct 2022 12:03:45 GMT
Connection: close
Content-Type: text/html; charset=UTF-8
- 文字コード指定をしない場合に生まれる脆弱性
特定の文字コードをブラウザに選択させられる。
文字列を埋め込んだ上、その文字コードで解釈した場合にスクリプトのタグとなるような文字列を埋め込まれる可能性がある
その場合、仮にエスケープ処理を入れている場合でも想定していた文字コードとは異なる文字コードを指定された場合はエスケープ処理が走ることはない
参考