XSS とは†
- Cross-site Scripting
- クロスサイトスクリプティング
- Webアプリの脆弱性を利用して、ブラウザに対して攻撃する手法。
- ウェブページの入力データをサニタイズしないで表示させている脆弱性を悪用した攻撃。
- 不正な処理は、クライアント側で実行される。(サーバ側で実行されるのは、CSRF)
- 攻撃者は不正なスクリプトを含むページを表示させることで、利用者の個人情報等の盗難を試みる。
- 攻撃者が用意したウェブサイト上に、攻撃対象の脆弱性を持ったウェブサイトへのリンク(スクリプトを仕込んだURL)を埋め込んでおく。
- リンクは攻撃者のウェブサイトだけでなく、掲示板やSNS、メール本文等に埋め込んで誘導することも可能。
- 攻撃者のウェブサイト上のリンクをクリックすると、攻撃対象となったウェブサイトがCookieを発行されると同時に攻撃者が仕込んだスクリプトが表示される。
- スクリプトによって表示されるのは、入力欄やボタンなど。
- 攻撃者が仕込んだスクリプトのリンクをクリックすると、閲覧者向けに発行されたCookieが攻撃者のウェブサイトに転送される。
- 攻撃により発生し得る被害
- 利用者の個人情報等の盗難
- 利用者のPC上のファイルの破壊、PCにバックドアが仕掛けられる等
XSSの分類 (CWEにおける分類)†
Webページの出力処理の不備による脆弱性†
格納型 (持続型)†
- Stored XSS Attacks
- Persistent XSS Attacks
- 攻撃対象のWebサイト(SNS、Webメール等)に投稿により、攻撃用のJavaScriptを仕込まれる。
- 攻撃者のJavaScriptの配置場所
- JavaScriptが攻撃対象のデータベース等に保存される。
反射型 (非持続型)†
- Reflected XSS Attacks
- フィッシングなどで偽装した罠サイトに誘導してから、罠サイト経由でXSSの脆弱性がある正規のWebサイトを書き換える。
- 攻撃者のJavaScriptの配置場所
- JavaScriptが攻撃対象のWebサイトとは別のWebサイトにある。
- 攻撃対象のWebサイトの作りが、入力値を表示する箇所の脆弱性が攻撃箇所になる。
JavaScriptを用いたWebページの出力処理(DOM操作)の不備による脆弱性†
Dom Based XSS†
攻撃の内容†
直接的な攻撃方法†
偽装したWebページの特徴†
- URLが正規のWebサイトと同じ
- URLでWebページの表示内容が正規のものであるか(偽装されていないか)判断できない。
- HTTPSの場合、SSL証明書が正規のWebサイトと同じ
- SSL証明書を確認してもWebページの内容が正規のものであるか(偽装されているか)できない。
対策(Webアプリケーション)†
エスケープ処理†
- イベントハンドラの値のエスケープ (Event handler Escaping)
- HTMLの特殊文字のエスケープ
- HTMLの要素に含まれる文字に対するエスケープ
- 「<」->「&lt;」 ※必須
- 「&」->「&amp;」 ※必須
- 「>」->「&gt;」
- HTMLの属性値に含まれる文字に対するエスケープ
- 「<」->「&lt;」 ※必須
- 「&」->「&amp;」 ※必須
- 「>」->「&gt;」
- 「"」->「&quot;」 ※必須
- 「'」->「&#39;」
- JavaScriptの特殊文字のエスケープ
- イベントハンドラの引数に含まれる文字に対するエスケープ
- 「\」->「\\」
- 「'」->「\'」
- 「"」->「\"」
- 「改行」->「\n」
- script要素内にあるスクリプトに対する対策
- そもそもscript要素内のスクリプトの文字列リテラルを動的に生成しない。
- カスタムデータ属性を利用して取得して設定する。
- スクリプトのスキームを不許可にする
- 属性値にURLを指定する属性にスクリプトのスキームが指定された場合、スクリプトが実行されないようにする対応。
- JavaScriptスキーム(javascript:)、VBScriptスキーム(vbscript:)
- HTMLの属性値(URL)に対する対策
- 対象となるHTMLタグと属性
- 対策の内容
- HTTPスキーム(http:)とHTTPSスキーム(https:)であることをチェックする。
- URLがHTTPやHTTPSで始まるもののみ許可する。
- HTMLエスケープによるURLのパーセントエンコードをする。
HTTPレスポンスヘッダの指定†
HTMLタグの属性値†
- 属性値をダブルコート「"」で囲み必ず文字列として扱われるようにする。
参考情報†
- 第三者が提供するスクリプトファイルを使わない。
- 任意のサイトが提供するJavaScriptファイルを自サイトに埋め込んだ場合、攻撃を受ける危険性が高くなる。
- 提供元が信用できない場合は、使うべきではない。(そもそもが悪意のあるスクリプト、サーバの脆弱性でスクリプトが差し替えられる)
対策(その他)†
参考情報†
- Cookieにdomain属性を指定(Cookieの有効範囲を自身のウェブサイトのドメインに限定)しても、XSSの攻撃を防ぐことはできない。
関連サイト†
関連用語†