XSS
2023-02-26 (日) 11:13:55
XSS とは †
名称 †
- Cross-Site Scripting
- クロスサイトスクリプティング
概要 †
- Webアプリの脆弱性を利用して、ブラウザに対して攻撃する手法。
- 不正な処理は、クライアント側で実行される。(サーバ側で実行されるのは、CSRF)
- 攻撃者は不正なスクリプトを含むページを表示させることで、利用者の個人情報等の盗難を試みる。
- 攻撃により発生し得る被害
- 利用者の個人情報等の盗難
- 利用者のPC上のファイルの破壊、PCにバックドアが仕掛けられる等
- Cross-Site とは
- 「Origin」参照
XSSの分類 (CWEにおける分類) †
Webページの出力処理の不備による脆弱性 †
反射型 (非持続型) †
- Reflected XSS Attacks
- フィッシングなどで偽装した罠サイトに誘導してから、罠サイト経由でXSSの脆弱性がある正規のWebサイトを書き換える。
- 攻撃者のJavaScriptの配置場所
- JavaScriptが攻撃対象のWebサイトとは別のWebサイトにある。
- 攻撃対象のWebサイトの作りが、入力値を表示する箇所の脆弱性が攻撃箇所になる。
格納型 (持続型) †
- Stored XSS Attacks
- Persistent XSS Attacks
- 攻撃対象のWebサイト(SNS、Webメール等)に投稿により、攻撃用のJavaScriptを仕込まれる。
- 攻撃者のJavaScriptの配置場所
- JavaScriptが攻撃対象のデータベース等に保存される。
JavaScriptを用いたWebページの出力処理(DOM操作)の不備による脆弱性 †
Dom Based XSS †
攻撃の内容 †
直接的な攻撃方法 †
- Cookieを盗む
- 偽のJavaScriptを実行する
- 偽情報や偽装した入力フォームを表示する
偽装したWebページの特徴 †
- URLが正規のWebサイトと同じ
- URLでWebページの表示内容が正規のものであるか(偽装されていないか)判断できない。
- HTTPSの場合、SSL証明書が正規のWebサイトと同じ
- SSL証明書を確認してもWebページの内容が正規のものであるか(偽装されているか)できない。
対策 †
対策(Webアプリケーション) †
エスケープ処理 †
- エスケープの種類
- HTMLの特殊文字のエスケープ (Output Escaping)
- JavaScriptの特殊文字のエスケープ (JavaScript Escaping)
- 出力する値に含まれるJavaScriptの特殊文字を通常の文字として扱うように変換することで、特殊文字が持つ効果を無効にする処理のこと。
- イベントハンドラの値のエスケープ (Event handler Escaping)
- HTMLの特殊文字のエスケープ
- HTMLの要素に含まれる文字に対するエスケープ
- 「<」->「&lt;」 ※必須
- 「&」->「&amp;」 ※必須
- 「>」->「&gt;」
- HTMLの属性値に含まれる文字に対するエスケープ
- 「<」->「&lt;」 ※必須
- 「&」->「&amp;」 ※必須
- 「>」->「&gt;」
- 「"」->「&quot;」 ※必須
- 「'」->「&#39;」
- HTMLの要素に含まれる文字に対するエスケープ
- JavaScriptの特殊文字のエスケープ
- イベントハンドラの引数に含まれる文字に対するエスケープ
- 「\」->「\\」
- 「'」->「\'」
- 「"」->「\"」
- 「改行」->「\n」
- イベントハンドラの引数に含まれる文字に対するエスケープ
- script要素内にあるスクリプトに対する対策
- そもそもscript要素内のスクリプトの文字列リテラルを動的に生成しない。
- カスタムデータ属性を利用して取得して設定する。
- スクリプトのスキームを不許可にする
- 属性値にURLを指定する属性にスクリプトのスキームが指定された場合、スクリプトが実行されないようにする対応。
- JavaScriptスキーム(javascript:)、VBScriptスキーム(vbscript:)
- HTMLの属性値(URL)に対する対策
- 対象となるHTMLタグと属性
- aタグのhref属性
- imgタグのsrc属性
- 対策の内容
- HTTPスキーム(http:)とHTTPSスキーム(https:)であることをチェックする。
- URLがHTTPやHTTPSで始まるもののみ許可する。
- HTMLエスケープによるURLのパーセントエンコードをする。
- 対象となるHTMLタグと属性
- エスケープ処理の関数 (PHP)
- htmlspecialchars()
HTTPレスポンスヘッダの指定 †
- Content-typeのcharset
- 文字エンコーディングを正しく指定する。
- Content-Security-Policy
HTMLタグの属性値 †
- 属性値をダブルコート「"」で囲み必ず文字列として扱われるようにする。
参考情報 †
- 第三者が提供するスクリプトファイルを使わない。
- 任意のサイトが提供するJavaScriptファイルを自サイトに埋め込んだ場合、攻撃を受ける危険性が高くなる。
- 提供元が信用できない場合は、使うべきではない。(そもそもが悪意のあるスクリプト、サーバの脆弱性でスクリプトが差し替えられる)
対策(その他) †
- CookieにHttpOnly属性を指定する。
- HTTPヘッダからしかCookieにアクセスできなくなる
- JavaScript(document.cookie)を使ってCookieにアクセスできなくなる。
- 古いブラウザはHttpOnly属性に対応していないものがある
参考情報 †
- Cookieにdomain属性を指定(Cookieの有効範囲を自身のウェブサイトのドメインに限定)しても、XSSの攻撃を防ぐことはできない。
関連サイト †
- CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
https://cwe.mitre.org/data/definitions/79.html
- CWE-79 クロスサイトスクリプティング - JVN
https://jvndb.jvn.jp/ja/cwe/CWE-79.html
- DOM Based XSSに関する脆弱性の届出が急増 (2013.1.29) - IPA
https://www.ipa.go.jp/about/technicalwatch/20130129.html