HTTP・Webアプリケーション(2)
Webサーバ
Webサーバの実装・設定不備による脆弱性と対策
対策と脆弱性
Webサーバプログラムのバージョンを最新化し、パッチを適用する
不要な機能やコマンドを無効にするか、使用可能な範囲を制限する
- コマンドやメッソドの設定不備によりコンテンツの改ざんや管理情報の漏えいする可能性がある
- PUTメソッドが使用可能になっている→不要なコンテンツが書き込まれる
- TRACEメソッドが使用可能&XSSの脆弱性がある
→HTTPヘッダのCookieや認証情報が取得される - Webサーバの管理者用コマンドが有効/不適切な設定
→Webサーバのアクセスログ・利用状況などが不正閲覧される
ディレクトリのアクセス権を適切に設定する
すべてのディレクトリにデフォルトページを置く
デフォルトページを置かない場合、ディレクトリ参照を禁止する
- ディレクトリ関連の設定不備により、ディレクトリトラバーサル攻撃を受ける
- ディレクトリ参照によって機密情報にアクセスされる可能性がある
- ディレクトリのアクセス権の設定不備
- ディレクトリ参照が許可されている
- デフォルトページ(index.htmlなど)が置かれていない
クライアントに詳細なエラーメッセージを送らないよう設定する
- エラーメッセージの出力設定不備により、機密情報が漏えいする可能性がある
HTTPヘッダにWebサーバプログラムの詳細情報を含めないよう設定する
- HTTPヘッダ情報からWebサーバプログラムの種類やバージョン情報が知られる可能性がある
- Webサーバプログラムの種類、バージョンによってBOF攻撃を受ける脆弱性がある
IPSを用いてOSやWebサーバプログラムの脆弱性を突いた攻撃を遮断する
Webアプリケーション
攻撃の種類
- クロスサイトスクリプティング
- SQLインジェクション
- OSコマンドインジェクション
- HTTPヘッダインジェクション
- メールヘッダインジェクション
- ディレクトリトラバーサル攻撃
- クロスサイトリクエストフォージェリ
クロスサイトスクリプティング(XSS)
ウェブページの部分をユーザからの入力をそのままエコーバック(オウム返し)することによって生成しているアプリケーションのセキュリティ上の不備を利用して、サイト間を横断して悪意のあるスクリプトを注入する攻撃のことをいう。また経緯上、それを許してしまう脆弱性についても、このように呼ぶ
- クッキーの値を取得あるいは設定することにより、セッションハイジャックする
- 強制的なページ遷移を起こさせ、クロスサイトリクエストフォージェリ対策を回避する
(取得したクッキーを攻撃者側でそのまま利用できない場合に用いられる) - CSSのインポート機能を利用して不正なファイルをロードさせる
- ページ全体を置き換えることにより、偽のページを作り出す。典型的にはフィッシングに用いられる
- フォームの送信先を置換することにより、入力を第三者サイトに送信するよう仕向ける。
"<"、">" 、"&" 、"/"などの文字を、特殊文字(タグ)として認識するブラウザの仕様を利用した攻撃手法
基本的対策
1.HTTPレスポンスヘッダに文字コードを指定する 2.HTML要素の属性は""(ダブルクオーテーション)で囲む 3.出力する全ての要素に対してメタキャラクタのエスケープ処理を行う 4.URLは「http://」か「https://」で始まるもののみ出力する 5.<script></script>要素の内容を動的に生成しない |
1.HTTPレスポンスヘッダに文字コードを指定する
HTTPのレスポンスヘッダのContent-Typeフィールドには、「Content-Type:text/html;charset=UTF-8」のように、文字コード(charset)を指定する
HTMLのMETAタグでも、Content-Typeでcharsetを指定できるが、ブラウザの挙動に依存するため、確実に正しい文字コードで表示できるように、HTTPのレスポンスヘッダで文字コードを指定するようにする
2.HTML 要素の属性は""(ダブルクオーテーション)で囲む
HTML 要素の属性を「'」(シングルクォーテーション)で囲むと、3のエスケープ処理の方法によっては、XSSの脆弱性を埋め込んでしまう可能性があるので、必ず「"」(ダブルクオーテーション)で囲む
3.出力する全ての要素に対してエスケープ処理を行う
出力する全ての要素に対して、以下の文字のエスケープ処理を行う。出力箇所が多く漏れやすいので、確実に対処する
最近は、JavaScriptでHTMLを動的に生成することがあるが、その場合もエスケープ処理を行う必要がある
4.URL は「http://」か「https://」で始まるもののみ出力する
URLは「http://」や「https://」だけでなく、JavaScriptを実行できる「javascript:」という記述もできる。スクリプトが注入されないように、URLは「http://」と「https://」から始まるもののみ出力する(ホワイトリスト方式)
5.<script></script> 要素の内容を動的に生成しない
<script></script>要素内容の動的な生成は、安全な形でエスケープするのは非常に難しいため、動的に生成しないようにする。
メタキャラクタ
正規表現、プログラム言語において、ある特別な働きをする文字
サニタイジング
特殊文字を無害化すること
保険的対策
1.入力値のチェックを行う 2.CookieにHttpOnly属性を付与する 3.Traceメソッドを無効化する |
1.入力値のチェックを行う
&<>”' などの危険な文字列が入力された場合に、エラーとしたり、該当文字を削除する方法
画面以外で作成された値には対応できない
2.Cookie に HttpOnly 属性を付与する
XSSはJavaScriptでCookieにアクセスしようとするが、CookieにHttpOnly属性が付いている場合はJavaScriptからはアクセスできない
但し、HttpOnly属性は全てのブラウザで対応が同じではないことに留意する必要がある
3.Trace メソッドを無効化する
XSSの脆弱性がある場合に、TRACEメソッドが有効だと、クロスサイト・トレーシングという攻撃が成立し、HTTPリクエストヘッダーの内容を取得されている
CookieにHttpOnly 属性を付けていても、HTTPリクエストヘッダーにはCookieは含まれるため、Cookieの漏洩を防ぐことができない
ゲートウェイ上での対策
- >Webアプリケーションファイアウォールを用いてXSS脆弱性を突いた攻撃を遮断する方法
Perl、Java、ECMAScriptなどのスクリプト言語やプログラム言語で広く用いられる正規表現、UNIXで用いられるシェル、SQL文などにおいて、何らかの特別な働きをする文字をメタキャラクタと呼ぶ
次のような種類がある
これら文字を単なる文字として扱いたい場合には、それぞれの言語などによって定められた方法で処理することで、メタキャラクタとしての働きを失わせる。これをエスケープ処理という
(例)「.」は正規表現で「任意の1文字」→文字(ピリオド)として扱う場合は
- フィッシング
銀行、クレジットカード会社、ショッピングサイトからの連絡を装ったメールを送付、本物のサイトに酷似した悪意あるページへのリンクを張り付け、口座番号やクレジットカード番号、パスワードなどを入力させて盗むという詐欺行為
ユーザのURLのタイプミスを狙って偽のサイトを立ち上げるケースもある
(例)yahoo→yafoo:http://www.yafoo.co.jp/という偽サイト立ち上げる
XSS脆弱性を利用して偽の入力項目をWebページ上に作り出すケース、DNSキャッシュポイズニングによって、正しいURLを入力しても偽サイトに誘導されるケースがある
- 標的型攻撃
明確な目的を持つ攻撃者が、特定の組織や団体等をターゲットとして、その取引先や関係者、公的機関などを騙ってマルウェアや不正なリンクが埋め込まれたメールを送信することで相手を騙し、情報を盗もうとするサイバー攻撃手法
- クリックジャッキング攻撃
「悪意のあるサイト上の特定箇所をクリックさせ、別サイトの設定情報を変更させる」攻撃手法
攻撃者は、悪意のあるサイトにiframeで別サイトを埋め込み、それを視覚的に見えないよう工夫することで、ユーザが気づかないうちに、別サイトの設定情報を変更すること
【対策方法】
Webサイトから返されるHTTPレスポンスヘッダに、「X-Frame-Options」ヘッダを含めておくことで、ブラウザがこの値を解釈し、クリックジャッキングを防止する(iframe内の表示を制御)手法がある
ヘッダの値としては、
・DENY:フレーム内のページ表示を全ドメインで禁止
・SAMEORIGIN:フレーム内のページ表示を同一ドメイン内のみ許可
・ALLOW-FROM uri:フレーム内のページ表示を指定されたドメインに限り許可
があり、用途に応じて設定が可能
- SEOポイズニング
検索エンジンの順位付けアルゴリズムを悪用し、閲覧者をマルウェアに感染させるような悪意のあるサイトを検索結果の上位に表示させるようにする行為
SEOとは、対象サイトのHTMLに検索キーワードを効果的に埋め込むなどして、検索エンジンの検索結果の上位に表示されるようにすること
SQLインジェクション
アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法。
実行方法
エスケープ処理がされていない
アプリケーションが入力値を適切にエスケープ(サニタイジング)しないままSQL中に展開することで発生する。
データベースのアクセス権設定
Webアプリケーションによるデータベースの操作に必要以上の権限(管理者権限など)が与えられていると、不正なSQL文が実行される可能性が高くなる
Webサーバのエラーメッセージ処理設定
Webサイトにシステムから表示されるエラーメッセージをそのまま表示する
(攻撃者に対してヒントを与えてしまうことになるため)
対策
- 言語毎に用意されたバインド機構(あらかじめSQL文の雛形を用意しておいて、変数を表す記号(プレースホルダ)に値(バインド値)を割り当てて、SQL文を実行できる機能)を利用する
- Webサーバ上のプログラム(スクリプト)でSQLインジェクション対策(不正な入力値による処理を防ぐなど)を行う
- Webサイトにシステムから表示されるエラーメッセージをそのまま表示しないようにする
- DBサーバの設定により、システムで利用するデータベースアカウントに対しては、最小限の権限だけを設定する
- また、Webアプリケーションファイアウォール(WAF)を利用する
- 定期的にアクセスログから攻撃数を検出し、攻撃内容の解析を行う
- 定期的にWebサイト全体の脆弱性検査を行う
OSコマンドインジェクション
閲覧者からのデータの入力や操作を受け付けるようなWEBサイトで、プログラムに与えるパラメータにOSに対する命令文(コマンド)を紛れ込ませて不正に操作する攻撃
対策
- OSコマンド呼び出しを使わない実装方法を選択する。
- OS呼び出し機能のある関数の利用を避ける。
- 外部から入力された文字列をコマンドラインのパラメータに渡さない。
- OSコマンドに渡すパラメータを安全な関数によりエスケープする。
- OSを起動可能な言語機能の利用時は、ホワイトリスト方式で引数をチェックする。
- ルールに従わないデータはエラーとして扱う(エスケープ処理は行わない)。
- Webアプリケーションファイアウォールを用いてOSのコマンドインジェクションを遮断する
HTTPヘッダインジェクション
HTTPを使って通信するシステムにおいて、動的にHTTPヘッダを生成する機能の不備を突いてヘッダ行を挿入することで不正な動作を行なわせる攻撃手法
攻撃例
- ユーザのブラウザに偽の情報を表示
- 不正なスクリプトの組込み
- 任意のクッキーの発行
- キャッシュサーバのキャッシュを汚染
対策
- Webアプリの実行環境やプログラム言語が用意している,ヘッダ出力用の関数やAPIを使用する
- Webアプリの実行環境やプログラム言語が用意している,ヘッダ出力用の関数やAPIを使用する
- 出力文字列の改行コード以降の文字列を削除
- クッキーを発行する場合はURLエンコードを確実に行う
メールヘッダインジェクション
問い合わせフォームなどのメールを送信する画面で、メールの内容を改ざんし、迷惑メールの送信などに悪用されてしまう攻撃手法
実行方法
メールの宛先に改行コードを挿入することで、新しいメールヘッダを追加し、本来の宛先以外にメールを送信したり、メールの内容を改ざんしたりする
対策
- メールヘッダをすべて固定値にし、ユーザの入力値をメールヘッダに出力しない
- Webアプリケーションの実行環境や言語に実装されているメール送信用のAPIを使用する
- hiddenフィールド等、改ざんが容易な場所にメール送信先のアドレスを設定しない
- メールヘッダとして用いるユーザ入力データに対して改行コードのチェックを行い、含まれていた場合は削除する
ディレクトリトラバーサル攻撃
管理者が意図していないパスでサーバ内のファイルを指定することによって,本来は許されないファイルを不正に閲覧する攻撃
実行方法
「../」のような文字列を使ってWebサーバのディレクトリ・パスを遡り(横断して)、公開されていないディレクトリにアクセスする手法
対策
1.外部からのパラメータでファイル名を直接指定しない 2.ファイルを開く場合は、固定ディレクトリ+ファイル名にする 3.ファイルのアクセス権を正しく設定する 4.ファイル名のチェックを行う |
1.外部からのパラメータでファイル名を直接指定しない
外部からのパラメータでファイル名を直接指定すると、パラメータが改ざんされたり、不正なパスを指定される可能性があるため、ファイル名を指定しない仕様に変更する
(例)
・ファイル名を固定にする
・ファイル名を番号などで間接的に指定する
2.ファイルを開く場合は、固定ディレクトリ+ファイル名にする
固定ディレクトリのパスに、パラメータからパスを除いたファイル名を加えてパスを作成する
(例)
入力パラメータが、「../../../etc/hosts」であれば、「/var/files/」+「hosts」とパスを作成する →攻撃を無効化
3.ファイルのアクセス権を正しく設定する
ファイルのアクセス権を正しく設定することで、ファイルへのアクセスを防ぐことができる場合がある
4.ファイル名のチェックを行う
ファイル名に、「/」、「../」、「..\」等のパスで利用する文字列を検出した場合には処理を中止する
主なプロトコルの脆弱性と対策

 

