学習忘備録

学習のアウトプットや感じた事を発信していきます

クロスサイトスクリプティング ( XSS )

書籍を読んで

www.amazon.co.jp

こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。

 

クロスサイト・スクリプティング(XSS)

通常、Webアプリケーションには外部からの入力などに応じて表示が変化する箇所があり、この部分のHTMLの生成の実装に問題があると、XSSという脆弱性が生じる

正しいHTMLを生成する事がXSS解消への第一歩

必須対策

表示の際に、HTMLで特殊な意味を持つ記号文字(メタ文字)をエスケープすること

  • 要素内容 -> 「<」「&」エスケープする
  • 属性値 -> ダブルクォーテーションで囲って、「<」「"」「&」エスケープする
共通対策

HTTPレスポンスに文字エンコーディンを明示する

PHPでの開発の場合

HTMLのエスケープ処理に htmlspecialchars関数を利用出来る

$string, $quote_style, $charset

実際のプログラミング
  • 要素内容については $quote_styleはどの値でもよい
  • 属性値は以下の両方を行う
    • 属性値はダブルクォートで囲う
    • $quote_styleは、ENT_COMPATかENT_QUOTESを指定する

シングルクォートで囲う事や、ENT_QUOTESで統一するのも安全側に倒した良い方法を取る形で良い

攻撃手法
  • クッキー値の盗み出し
  • その他のJavaScriptによる攻撃
  • 画面の書き換え
保険対策
  • X-XSS-Protection レスポンスヘッダの使用
    • 最近のブラウザにXSSフィルタというセキュリティ機能が実装されている
      • XSSフィルタ -> 反射型XSSをブラウザが検知し、無害な出力に変更するもの
    • デフォルトで有効だが、利用者が無効化している場合がある
    • 利用者によるXSSフィルタ設定を上書きして有効化させる
    • Webサーバ(nginx, apacheなど)に設定を行う
  • 入力値の検証
    • 条件に合致しない入力の場合にエラーを表示させ、再入力を促す
    • 自由書式の入力欄についてはこの方法では対策できない
  • CookieにHttpOnly属性を付与
      • HttpOnly属性 -> JavaScriptからのクッキーの読み出しを禁止する
    • セッションIDの盗み出しを防止することが出来る
  • TRACEメソッドの無効化
    • 古いブラウザに対して有効なXSTという攻撃がある
    • 現在はほぼないと考えられる
    • ただ、TRACEメソッドを許可していると脆弱性と考えられてしまう
JavaScriptの文字列リテラルの動的生成の対策

JavaScriptエスケープルールは複雑なため、脆弱性の温床になりやすい

出来ればJavaScriptを動的生成することは避けたい

しかし、動的パラメータを渡したいというニーズは多い為、2種類の方法を紹介

  • カスタムデータ属性の利用
    • script要素の外部でパラメータを定義して、JavaScriptから参照する方法
  • インラインJSONPによる方法
    • JSON形式のパラメータを伴う関数をscript要素で呼び出す
HTMLタグやCSSの入力を許す場合の対策

利用者の入力にHTMLタグやCSSの入力を許可したい場合

--> ライブラリを利用するのが望ましい

PHP -> HTML Purifier(http://htmlpurifier.org/)

エラーメッセージからの情報漏洩
  • エラーメッセージに攻撃者にとって有益なアプリケーションの内部情報が含まれる
  • 意図的な攻撃として、エラーメッセージに秘密情報(個人情報など)を表示させられる

このような問題があるため、エラーが発生した場合、利用者に表示する画面はエラー内容ではなく、「アクセスが集中しています ~」にとどめ、エラーの詳細内容はエラーログに出力するようにする。

さらに進んだ学習のために

教科書に載らないWebアプリケーションセキュリティ − @IT

Masato Kinugawa Security Blog