XSS

2023-02-26 (日) 11:13:55

XSS とは

名称

  • Cross-Site Scripting
  • クロスサイトスクリプティング

概要

  • Webアプリ脆弱性を利用して、ブラウザに対して攻撃する手法。
    • Webページの入力データに含まれるスクリプトをサニタイズせずに表示させているWebサイトの脆弱性を悪用した攻撃。
  • 不正な処理は、クライアント側で実行される。(サーバ側で実行されるのは、CSRF
  • 攻撃者は不正なスクリプトを含むページを表示させることで、利用者の個人情報等の盗難を試みる。
    1. 攻撃者が用意したWebサイト上に、攻撃対象の脆弱性を持ったWebサイトへのリンク(スクリプトを仕込んだURL)を埋め込んでおく。
      • リンクは攻撃者のWebサイトだけでなく、掲示板やSNS、メール本文等に埋め込んで誘導することも可能。
    2. 攻撃者のWebサイト上のリンクをクリックすると、攻撃対象となったWebサイトがCookieを発行されると同時に攻撃者が仕込んだスクリプトが表示される。
      • スクリプトによって表示されるのは、入力欄やボタンなど。
    3. 攻撃者が仕込んだスクリプトのリンクをクリックすると、閲覧者向けに発行されたCookieが攻撃者のWebサイトに転送される。
  • 攻撃により発生し得る被害
    • 利用者の個人情報等の盗難
    • 利用者のPC上のファイルの破壊、PCにバックドアが仕掛けられる等
  • Cross-Site とは

XSSの分類 (CWEにおける分類)

Webページの出力処理の不備による脆弱性

反射型 (非持続型)

  • Reflected XSS Attacks
  • フィッシングなどで偽装した罠サイトに誘導してから、罠サイト経由でXSSの脆弱性がある正規のWebサイトを書き換える。
  • 攻撃者のJavaScriptの配置場所
    • JavaScriptが攻撃対象のWebサイトとは別のWebサイトにある。
    • 攻撃対象のWebサイトの作りが、入力値を表示する箇所の脆弱性が攻撃箇所になる。

格納型 (持続型)

  • Stored XSS Attacks
  • Persistent XSS Attacks
  • 攻撃対象のWebサイト(SNSWebメール等)に投稿により、攻撃用の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)
      • 出力する値に含まれるHTMLメタ文字を通常の文字として扱うよう変換することで、メタ文字が持つ効果を無効にする処理のこと。
    • JavaScript特殊文字のエスケープ (JavaScript Escaping)
      • 出力する値に含まれるJavaScript特殊文字を通常の文字として扱うように変換することで、特殊文字が持つ効果を無効にする処理のこと。
    • イベントハンドラの値のエスケープ (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タグと属性
      • aタグのhref属性
      • imgタグのsrc属性
    • 対策の内容
      • HTTPスキーム(http:)とHTTPSスキーム(https:)であることをチェックする。
      • URLがHTTPやHTTPSで始まるもののみ許可する。
      • HTMLエスケープによるURLのパーセントエンコードをする。
  • エスケープ処理の関数 (PHP)
    • htmlspecialchars()

HTTPレスポンスヘッダの指定

  • Content-typeのcharset
    • 文字エンコーディングを正しく指定する。
  • X-XSS-Protection
    • WebブラウザのXSSフィルタ機能(反射型XSSを無効にする機能)を有効にする。
    • Webサーバで出力するようにすると便利。
  • Content-Security-Policy

HTMLタグの属性値

  • 属性値をダブルコート「"」で囲み必ず文字列として扱われるようにする。

参考情報

  • 第三者が提供するスクリプトファイルを使わない。
    • 任意のサイトが提供するJavaScriptファイルを自サイトに埋め込んだ場合、攻撃を受ける危険性が高くなる。
    • 提供元が信用できない場合は、使うべきではない。(そもそもが悪意のあるスクリプト、サーバの脆弱性でスクリプトが差し替えられる)

対策(その他)

  • CookieHttpOnly属性を指定する。
    • HTTPヘッダからしかCookieにアクセスできなくなる
    • JavaScript(document.cookie)を使ってCookieにアクセスできなくなる。
    • 古いブラウザはHttpOnly属性に対応していないものがある

参考情報

  • Cookieにdomain属性を指定(Cookieの有効範囲を自身のウェブサイトのドメインに限定)しても、XSSの攻撃を防ぐことはできない。

関連サイト

関連用語