Webアプリケーション・セキュリティ
はじめに
企業情報システムの多くは、(1)Webアプリケーション・サーバー(画面や業務ロジックを担当する)と(2)データベース・サーバー(データを格納する)で構築されています。これらのサーバー・ソフトに対する不正アクセスや操作ミスを防ぐことが、企業のデータを守るうえで重要です。
本連載では、2回にわたり、Webアプリケーション・サーバーのセキュリティ(第1回)と、データベース・サーバーのセキュリティ(第2回)を解説します。
Webサイトにおける脆弱性の現状
Webアプリケーション・サーバーのセキュリティ対策を考える前提として、
- 脆弱性の現状
- 脅威(攻撃)の現状
を知っておく必要があります。脆弱性と脅威の両方が揃うと、企業のデータは安全ではなくなります。
まずは、脆弱性の現状から説明します。
IPA(独立行政法人情報処理推進機構)のセキュリティセンターでは、経済産業省の告示に基づき、ソフトウエア製品の脆弱性やWebサイトの脆弱性に関する届け出を受け付けています。2010年7月から同年9月の届出状況によると、1位がクロス・サイト・スクリプティング*1で、2位がSQLインジェクション*2となっています(図1)。
- [*1] クロス・サイト・スクリプティングは、ソフトウエアのセキュリティ・ホールの1つで、Webサイトの訪問者の入力をそのまま画面に表示する掲示板などのプログラムが、悪意のあるコードを訪問者のWebブラウザに送ってしまう脆弱性のこと。悪意を持ったユーザーがHTMLフォームなどを通してJavaScriptなどのスクリプト・コードを入力した時に、プログラム側に適切なチェック機構がないと、そのスクリプト内容がそのままHTMLに埋め込まれ、ページを閲覧したコンピュータでスクリプトが実行されてしまうことがある。
- [*2] SQLインジェクションは、データベースと連動したWebサイトで、データベースへの問い合わせや操作を行なうプログラムにパラメータとしてSQL文の断片を与えることにより、データベースを改ざんしたり、不正に情報を入手する攻撃。また、そのような攻撃を許してしまうプログラムの脆弱性のこと。
出典IPA: http://www.ipa.go.jp/security/vuln/report/documents/vuln2010q3.pdf |
Webサイトの脆弱性の種類(2010年3Q) |
Webサイトの脅威の現状
次に、脅威の現状を説明します。
図2は、IPAが公開している「JVN iPedia(脆弱性対策情報データベース)」における、2009年8月から2010年7月末までの1年間のアクセス・ログを解析した事例です。1位がディレクトリ・トラバーサル*3、2位はSQLインジェクションとなっています。
- [*3] ディレクトリ・トラバーサルは、公開することを意図していないディレクトリのファイルに対して、不正にディレクトリ・パスをさかのぼってアクセスする攻撃。
Webへの攻撃の多くは、ボットや自動ツールを用いて、ランダムなIPアドレスに対して仕掛けてきます。このため、インターネットに公開されているWebサーバーは常に攻撃にさらされている、という認識を持つ必要があります。脆弱性の現状と脅威の現状の両方に登場するSQLインジェクションによる情報漏えい事件が後を絶たないのも、こうした理由が背景にあります。
出典IPA: http://www.ipa.go.jp/about/press/pdf/100827press2.pdf |
図2: Webサイトを狙った攻撃件数の動向 |
SQLインジェクション攻撃
以下では、SQLインジェクション攻撃について概説します。SQLインジェクションは、いったん攻撃にあうと、個人情報やクレジットカード情報の漏えいなど、企業にとって甚大な被害をもたらす可能性があります。
SQLインジェクション攻撃のほとんどは、ユーザーからのパラメータ入力を受け入れるアプリケーションを通じて実行されます。攻撃者は、アプリケーション開発者が意図したものとはまったく異なる結果を得るために、入力フィールドやURLパラメータに対して、攻撃用の文字列を入力します。
例えば、会員専用Webページのログイン画面に、ユーザー名とパスワードを入力するHTMLフォームがあるとします。ここで、ユーザー名のフィールドに「‘a’ OR 1=1 --」のような文字列を挿入することで、簡単な攻撃が可能になっているケースがあります。
具体的に、ユーザーがWebアプリケーションにログインする場合に、どのようなSQLクエリーが生成されるかを解説します。例えば、ユーザー名に「saito」、パスワードに「123」と入力したときに、データベース・サーバーに以下のクエリーを送信するWebアプリケーションがあるとします。
SELECT * FROM users WHERE username =’$saito’ AND password = ‘123’;
ここで、攻撃者が、ユーザー名に 「 ‘a’ OR 1=1 -- 」と入力したとします。そのときのSQLクエリーは、次のようになります。
SELECT * FROM users WHERE username =’a’ OR 1=1 --’ AND password = ‘pwd’
2重ハイフン文字「--」は、SQLサーバーによって最初のコメントとして解釈されます。このため、「--」以降の文字は無視されます。この結果、このクエリーは、データベースによって以下のように解釈されます。SQLインジェクション脆弱性のあるアプリケーションの場合、ログインに成功します。「1=1」が常に真なので、条件は常に真となるからです。
SELECT * FROM users WHERE username = ‘a’ OR 1=1;