「SQLインジェクション」や「クロスサイトスクリプティング」という用語に聞き覚えはないだろうか。セキュリティに関連する用語であることを知る人は多くても、詳細な説明をできる人はまだ少ないかもしれない。どちらもWebアプリケーションの脆弱性を指す用語である。
個人情報の保護に関する法律(個人情報保護法)の施行によって、より多くの注目を集めるようになった個人情報漏えいに関するニュースが毎日のように流れている。漏えいした個人情報が、もしWebサイトから盗み出されたものであれば、原因はSQLインジェクションであった可能性がある。
この連載では、Webアプリケーションの脆弱性、攻撃手法の実例を挙げて解説するとともに、その脆弱性を防御する装置として市場に現れたWebアプリケーションファイアウォール(WAF:ワフと発音)を使用した防御方法について説明する。Webアプリケーションセキュリティを専門とする方以外も対象として、できる限りやさしい内容を心掛けるつもりである。
現在、ありとあらゆるアプリケーションはWeb化される傾向にある。クライアントにWebブラウザがインストールされていれば使用できるWebアプリケーションの利便性については語るまでもないことであるが、攻撃者のターゲットとしてもWebアプリケーションは魅力的である。その理由を簡潔に述べるなら、“機密情報に近い位置まで、合法的に忍び寄ることができるから”である。
ほとんどのWebアプリケーションにおいて、どんなユーザーでも、Webブラウザからデータベースへなんらかのトランザクションを発生させることができる。もちろん、通常の動作をする限りは定められた情報しかデータベースから取り出せないが、膨大な機密情報まであと一歩のところまで極めて合法的にたどり着ける。
図1は簡単なWebシステムの概略図である。クライアントはWebサーバに対して大きく分けて静的コンテンツへのリクエスト(HTML、GIF、JPGなど)と動的コンテンツへのリクエストを送信する。ここでは動的コンテンツへのリクエストの例としてCGI(Common Gateway Interface)を挙げる。
CGIはWebサーバ上の任意のプログラムを実行するための仕組みだ。まず、Webサーバはクライアントからのリクエストに含まれるパラメータをプログラムに渡す。プログラムは受け取ったパラメータの内容に応じた実行結果のHTMLを生成してWebサーバに返し、それがクライアントに表示される。また、プログラムの処理の中でデータベースへのアクセスが発生するケースでは、パラメータの内容がデータベースに対して発行するSQL文の一部となる。
ここで忘れてならないのは、ユーザーはWebアプリケーション開発者の意図どおりに行動するとは限らないということである。Webアプリケーションにおいてユーザーに渡される情報はHTMLである。通常、HTMLは平文であり、基本的な知識さえあれば誰でもHTMLソースからWebページの構造を把握できる。どのアプリケーションに対して、どのようなデータが送信されるのかを、ユーザーはHTMLソースから判断できるのである。
図2の赤枠で囲まれた部分はログイン認証に使用されるフォームである。このWebページのソースのうち、赤枠部分に関連する部分を抜き出したものが以下のものである。
<FORM NAME=login ACTION=login.php METHOD=post> <TABLE width="100%" ………… <INPUT type="text" name="username" size="8"> <INPUT type="password" name="password" size="8"> <INPUT type="submit" name="action" value="Go!"> </FORM>
このHTMLからは以下のことが分かる。
パラメータの送信先:login.php
使用するHTTPメソッド:POST
パラメータの種類と属性:
コントロールの種類 | 名前 | 文字数 | 値 |
---|---|---|---|
テキスト | username | 8 | ユーザー入力値 |
テキスト (マスク表示) |
password | 8 | ユーザー入力値 |
送信ボタン | action | - | Go! |
HTMLソースを眺めるだけで、これだけの情報が取り出せるわけである。あるCGIに対してユーザーがデータを送信するとき、送信データの内容をユーザー側でいくらでも加工できる、という認識を持たなければならない。その加工したデータから、攻撃者はWebアプリケーション開発者が想定しないトランザクションを発生させる。
データを加工するとき、高度な知識はまったく必要としない。簡単な例を挙げるならば、表示したWebページをローカルマシンに保存し、HTMLを編集すればCGIに送信するデータの内容を書き換えることができる(後述のHiddenフィールドマニピュレーションを参照)。
Webアプリケーションの脆弱性はユーザー行動に関する過度の信頼から発生することが多い。ユーザーを過度に信頼してはならない。インターネットに接続するWebアプリケーションに限らず、社内システムであっても同様である。
Copyright © ITmedia, Inc. All Rights Reserved.