Jtest Security-Java対応ソースコードセキュリティ検証ツール-
クロスサイトスクリプティング
クロスサイト スクリプティング (XSS) は、ユーザの入力データを使用して動的にページを出力する Webアプリケーションの脆弱性を利用し、ユーザのブラウザ上で悪意のあるスクリプトを実行させるセキュリティ攻撃です。
多くの場合、攻撃者が用意した Web ページや電子メール中のリンクから脆弱性のある Web サイトに誘導するという段階を踏むため、クロスサイト (サイトをまたがる) スクリプティングと呼ばれます。
ごく簡単なケースとして、ユーザがフォームのテキスト ボックスに文字列を入力して送信すると、その文字列を含む HTMLページを返す Webアプリケーションを例に紹介します。
多くの場合、攻撃者が用意した Web ページや電子メール中のリンクから脆弱性のある Web サイトに誘導するという段階を踏むため、クロスサイト (サイトをまたがる) スクリプティングと呼ばれます。
ごく簡単なケースとして、ユーザがフォームのテキスト ボックスに文字列を入力して送信すると、その文字列を含む HTMLページを返す Webアプリケーションを例に紹介します。
クロスサイトスクリプティング(XSS)の例
ここで、テキスト ボックスに次の文字列を入力して送信したとします。
アプリケーションで入力データをチェックしていない場合、出力された Web ページにスクリプトがそのまま含まれるため、次のようなダイアログが表示されます。
この例では、スクリプトは単にメッセージボックスを表示するだけですが、攻撃者は悪意のあるスクリプトを使用して、Cookie 情報の詐取、偽のページの表示、第三者へのフォーム情報の送信など、さまざまな操作を行うことができます。
ユーザに悪意のあるスクリプトを実行させるため、攻撃者はパラメータに細工を施した URL リンクを含む HTML ページや電子メールをユーザに閲覧させ、リンクをクリックするように仕向けます。
次のリンクをクリックすると、フォームのテキスト ボックスにスクリプトを入力して送信ボタンをクリックした場合と同じリクエストがアプリケーションに送信されます。
ユーザに悪意のあるスクリプトを実行させるため、攻撃者はパラメータに細工を施した URL リンクを含む HTML ページや電子メールをユーザに閲覧させ、リンクをクリックするように仕向けます。
次のリンクをクリックすると、フォームのテキスト ボックスにスクリプトを入力して送信ボタンをクリックした場合と同じリクエストがアプリケーションに送信されます。
スクリプトとしては、一般的に JavaScript が多く使用されますが、ユーザのブラウザでサポートされているスクリプト言語であれば、言語を問いません。
対策
XSS を防ぐには、ユーザからの入力データの検証と、出力データの適切なエンコーディングを徹底します。
入力データを表示する前に、必ずデータの長さ、型、構文などが許可される範囲内であるかどうかを検証します。
また、出力データは HTML、XML などの出力フォーマットに従って適切にエンコードします。
Jtest Securityのルール
このルールは、悪意のあるスクリプトを含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力メソッドに渡されている場合に違反をレポートします。このルールはバグ探偵 (フロー解析) ルールなので、入力データの取得と出力が別のメソッドに分かれていたり、複数の実行パスが存在する場合でも、実行パスを辿って違反を検出することができます。
- チェックできる入力データ
- リモート メソッドおよびエントリ ポイント メソッドのパラメータ
- ネイティブ メソッド
- 検証を行っていない Struts フォーム
- ネットワーク
- Servlet リクエスト
- ファイル
- パイプ
- リモート メソッド
- リフレクション メソッド
- 環境変数およびシステム プロパティ
- データベース
- ストリーム指向 API (ストリーム、リーダー、チャネル)
- コンソール
- GUI コントロール
- チェックできる出力メソッド
- javax.servlet.ServletOutputStream
- void print(...) methods
- void println(...) methods
- void write(...) methods
- java.io.PrintWriter
- void print(...) methods
- void println(...) methods
- void write(...) methods
- 検証メソッドの指定も可能
- ルールのパラメータでは検証メソッドを指定することも可能です。検証メソッドは、スクリプトを含んでいる可能性のある入力データを受け取り、チェック済みの安全なデータをパラメータまたは戻り値として返すメソッドです。検証メソッドをパラメータで指定しておくと、チェック済みのデータに対して誤って違反が検出されることがなくなるため、解析結果の精度が向上します。
Jtest Securityが検出する脆弱性(抜粋)一覧
- クロスサイト スクリプティング(XSS) (本ページ)
- SQLインジェクション、コマンドインジェクション、XMLインジェクションなどのインジェクション
- HTTPレスポンス分割
- 悪意のあるファイルの実行
- 強制ブラウズ
- 不適切なエラー処理(近日公開予定)
| |||||||||














