連載
» 2005年11月22日 00時00分 公開

Webアプリケーションファイアウォールの必要性(2):多様化するWebアプリケーションへの攻撃 (4/4)

[草薙伸, 伴崇博,F5ネットワークスジャパン株式会社]
前のページへ 1|2|3|4       

バッファオーバーフロー(Buffer Overflow)

 大きな入力データを送り込むことで、プログラムが確保したメモリサイズをあふれさせ、予期せぬ動作を引き起こすのが「バッファオーバーフロー」だ。この脆弱性は多くのネットワークアプリケーションで発生する共通のセキュリティホールであるが、Webサーバソフト自体にも発生し得るし、サーバ上で作り込んだWebアプリケーションにおいても多く発生する。バッファオーバーフローを利用し、不正アクセスを行うには複雑で高度な知識が必要となるが、成功した場合にはシステムを操作できる可能性がある。

 Webアプリケーションにおけるバッファオーバーフローの脆弱性は、以下のようなページで発生しやすい。

<form action=http://test.fubar.jp/search.cgi method="get" name="search">
<input type="text" name="search" value="" maxlength="45"></td>
<form>

 このソースでは、検索フィールド「search」に入力できる文字列は45文字までに制限されているので、Webブラウザ上から46文字以上のタイプをしても入力されない。しかし、このHTMLをダウンロードし、以下のように書き換える。

<form action=http://test.fubar.jp/search.cgi method="get" name="search">
<input type="text" name="search" value="" maxlength="1099511627776"></td>
<form>

 これによって同じ検索フィールドに1GBの文字を入力することができ、バッファオーバーフロー攻撃が可能になる。これはクライアント側のWebブラウザのチェック機構に依存して、HTML上でデータ長の制限を行っているために発生し得る問題点である。チェック機構をクライアント側に依存してはならない。

【編集部より】

例示したHTMLソースの一部に間違いがありました。お詫びして訂正させていただきます (2005年11月30日)

誤:size

正:maxlength


 バッファオーバーフロー攻撃からサイトを守るには以下の方法が有効である。

  • Apacheにおける「LimitRequestBody」などを設定し、Webサーバであらかじめ受け入れる送信データ量の制限を設定しておく
  • 特定のサイズ以上のデータが送られてきたらクライアントにエラーを返すようなコーディングを行う

SQLインジェクション(SQL Injection)

 「インジェクションフロー(Injection Flaws)」と呼ばれる攻撃手法がある。これはWebアプリケーションに命令を挿入(インジェクション)することによって、Webアプリケーションと接続しているシステムに命令を送りつけるものだ。

 この中で最も著名になったのが「SQLインジェクション」である。SQLコマンドを挿入することでバックエンドのデータベースを呼び出す脆弱性だ。

 SQLインジェクションもクライアントから送られる入力データを入念に検証していないWebアプリケーションにおいて発生する。攻撃者はメタキャラクタを入力データに挿入し、Webアプリケーションを経由して不正なクエリをデータベースに送信する。

 攻撃者はどのようなSQLコマンドによってデータベースを呼び出せるかを探らねばならないが、攻撃者がこの脆弱性を発見した場合の結果は悲惨である。たびたびニュースを賑わせるWebサイトからの個人情報漏えいもSQLインジェクションによって引き起こされたものであることが多い。場合によってはデータベースを改ざん、あるいは破壊することもある。この欠陥は比較的発見しやすいものでありながら、攻撃されたときの被害が甚大である。

 例えばあるWebサイトでは、入力されたユーザー名を変数「uname」に、パスワードを変数「pass」にそれぞれ代入しSQL文をデータベースに送って認証を行う仕組みを持っているとする。

select username,cardnum,….. from user_db where username='uname' and password='pass' 

 ここで以下のような入力を行うと、「uname」にすべてのデータをマッチさせ、さらにパスワードの検索を行わないでSQL文を終わらせることができる。

' or 1=1 #

 具体的には以下のSQLが実行されることになる。

select username,cardnum,….. from user_db where username='' or 1=1 #

 このSQLでは入力された「'」によってくくりを終了させる。1=1は「すべてを真」とする。最後の「#」で以降の文字をコメントとして無視させる。これによってパスワードの入力をせずにログオンが可能となる。

 SQLインジェクションも特殊文字を悪用することによって行われるので、ユーザー名やパスワードの文字種制限やサニタイジングが有効である。

 今回紹介した攻撃手法にかかわらず、単純にサーバの設定管理にミスがあれば、それももちろん脆弱性となり得る。例えばサーバの管理サービスにアクセス可能であったり、ファイルのパーミッション設定に問題があったりした場合などだ。

 次回から、これらWebアプリケーションの脆弱性をセキュアプログラミングではなく、WAFのような外部機器にて防御していく手法について説明していく。


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。