情報セキュリティスペシャリスト
情報技術者試験まとめへ

HTTP・Webアプリケーション(2)

Webサーバ

Webサーバの実装・設定不備による脆弱性と対策

対策と脆弱性

Webサーバプログラムのバージョンを最新化し、パッチを適用する
不要な機能やコマンドを無効にするか、使用可能な範囲を制限する
ディレクトリのアクセス権を適切に設定する
すべてのディレクトリにデフォルトページを置く
デフォルトページを置かない場合、ディレクトリ参照を禁止する
クライアントに詳細なエラーメッセージを送らないよう設定する
HTTPヘッダにWebサーバプログラムの詳細情報を含めないよう設定する
IPSを用いてOSやWebサーバプログラムの脆弱性を突いた攻撃を遮断する

Webアプリケーション

攻撃の種類


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


ウェブページの部分をユーザからの入力をそのままエコーバック(オウム返し)することによって生成しているアプリケーションのセキュリティ上の不備を利用して、サイト間を横断して悪意のあるスクリプトを注入する攻撃のことをいう。また経緯上、それを許してしまう脆弱性についても、このように呼ぶ

"<"、">" 、"&" 、"/"などの文字を、特殊文字(タグ)として認識するブラウザの仕様を利用した攻撃手法

基本的対策

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の漏洩を防ぐことができない

ゲートウェイ上での対策


≪メタキャラクタ・エスケープ処理≫

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とは、対象サイトのHTMLに検索キーワードを効果的に埋め込むなどして、検索エンジンの検索結果の上位に表示されるようにすること


SQLインジェクション


アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法。

実行方法

エスケープ処理がされていない

アプリケーションが入力値を適切にエスケープ(サニタイジング)しないままSQL中に展開することで発生する。

データベースのアクセス権設定

Webアプリケーションによるデータベースの操作に必要以上の権限(管理者権限など)が与えられていると、不正なSQL文が実行される可能性が高くなる

Webサーバのエラーメッセージ処理設定

Webサイトにシステムから表示されるエラーメッセージをそのまま表示する
(攻撃者に対してヒントを与えてしまうことになるため)

対策

OSコマンドインジェクション


閲覧者からのデータの入力や操作を受け付けるようなWEBサイトで、プログラムに与えるパラメータにOSに対する命令文(コマンド)を紛れ込ませて不正に操作する攻撃

対策

HTTPヘッダインジェクション


HTTPを使って通信するシステムにおいて、動的にHTTPヘッダを生成する機能の不備を突いてヘッダ行を挿入することで不正な動作を行なわせる攻撃手法

攻撃例

対策

メールヘッダインジェクション


問い合わせフォームなどのメールを送信する画面で、メールの内容を改ざんし、迷惑メールの送信などに悪用されてしまう攻撃手法

実行方法

メールの宛先に改行コードを挿入することで、新しいメールヘッダを追加し、本来の宛先以外にメールを送信したり、メールの内容を改ざんしたりする

対策

ディレクトリトラバーサル攻撃


管理者が意図していないパスでサーバ内のファイルを指定することによって,本来は許されないファイルを不正に閲覧する攻撃

実行方法

「../」のような文字列を使ってWebサーバのディレクトリ・パスを遡り(横断して)、公開されていないディレクトリにアクセスする手法

対策

1.外部からのパラメータでファイル名を直接指定しない
2.ファイルを開く場合は、固定ディレクトリ+ファイル名にする
3.ファイルのアクセス権を正しく設定する
4.ファイル名のチェックを行う
1.外部からのパラメータでファイル名を直接指定しない

外部からのパラメータでファイル名を直接指定すると、パラメータが改ざんされたり、不正なパスを指定される可能性があるため、ファイル名を指定しない仕様に変更する
(例)
 ・ファイル名を固定にする
 ・ファイル名を番号などで間接的に指定する

2.ファイルを開く場合は、固定ディレクトリ+ファイル名にする

固定ディレクトリのパスに、パラメータからパスを除いたファイル名を加えてパスを作成する
(例)
入力パラメータが、「../../../etc/hosts」であれば、「/var/files/」+「hosts」とパスを作成する  →攻撃を無効化

3.ファイルのアクセス権を正しく設定する

ファイルのアクセス権を正しく設定することで、ファイルへのアクセスを防ぐことができる場合がある

4.ファイル名のチェックを行う

ファイル名に、「/」、「../」、「..\」等のパスで利用する文字列を検出した場合には処理を中止する

主なプロトコルの脆弱性と対策


 

ページトップへ 次へ