ケース別、攻撃の手口

2009年2月27日(金)
近藤 伸明

換金可能な情報の情報漏えい

 ここでは、データベースに格納されたデータそのものである、個人情報などを取得する方法を例として取り上げる。

 例えば、ECサイトのデータベースにクレジットカード情報の含まれる会員情報が保管されているとする。その会員向けのサービスとして、クレジットカード以外の会員情報を表示するWebページがあるとする。

 その際に使用するSQL文に、クレジットカード情報の格納されたテーブルにアクセスするSQL文を挿入して、会員名などを表示する個所に、クレジットカード番号を表示させる方法がある。

select u.user_name,c.card_number, c.card_date from t_users u join t_card c on u.id = c.user_id where id=’$userid’ ;

 前提として使用するSQL文は上記のように、画面に表示する文字列をデータベースから取得する(図2-1)。

 「t_users」はユーザー情報が格納されているテーブル、「user_name」はそのテーブルに格納された会員名のカラムとする。さらに「t_card」というテーブルにクレジットカード情報が格納され、「card_number」「card_date」というカラムにクレジットカード番号や有効期限が保存されているものとする。

 その時、検索のキーワードとなる「$userid」の値がブラウザから送られるPOSTやGET、Cookieの値を参照している場合、「$userid」の値を以下のように改ざんして攻撃する。

「’ or 1=1 --」

 SQL文は以下のようになる。

select u.user_name,c.card_number, c.card_date from t_users u join t_cardc on u.id = c.user_id where id=’ ’ or 1=1 --’ ;

 「--」以降はコメントなので、SQL文は以下のようになる。

select u.user_name,c.card_number, c.card_date from t_users u join t_cardc on u.id = c.user_id where id=’ ’ or 1=1

 上記の例では、本来、特定の会員が登録しているクレジットカード番号と有効期限だけが表示されるが、改ざんされたリクエストでは、任意の会員の氏名とクレジットカード番号と有効期限が表示される(図2-2)。

 例では行数を制限していないので、データベースにカード番号を登録している会員の全レコードが対象となる。1レコードだけを上から下まで順番に取得していくように条件を組み込んで調整すれば、テーブルに格納しているすべてのデータを順番に少しずつ取り出すこともできる。

 この攻撃には、第3回で紹介した「バインド機構」「エスケープ処理」が対策として有効だ。

 この手法以外に、「パスワードの変更」の際に、条件を書き換えて、全ユーザーのパスワードを変更し、ユーザーになりすまし個人情報を取得する方法や、前述した「認証の迂回」の手口を使いクレジットカード情報などの個人情報を取得する方法もある。

Webサイトを攻撃するための有用な情報の漏えい

 Webサイトを攻撃するための有用な情報となる、システム情報やデータベースを構成する情報は、いろいろな方法で取得可能であるが、ここでは簡単に5つの方法を紹介する。

 1つ目が、データベースへのアクセス失敗時のエラーメッセージである。攻撃コードを挿入した際にデータベースのエラーメッセージが表示されれば、実行結果からアプリケーションの挙動を予測し、攻撃を繰り返すことで、以下のような情報を収集することができる。

・テーブル名
・カラム名
・カラムの型

 テーブルの情報を読み取る攻撃コードを決定するには、対象となるテーブル名、カラム名、カラムの型が必要となる。この攻撃はその手掛かりとなる情報を収集するために使われることが多い。

 2つ目がシステムカタログの閲覧だ。データベースのスキーマ情報が不明の場合、システムカタログなどのデータベースを参照するようなSQLを発行することで、スキーマ情報を得ることができる。実際にストアドプロシージャを動的に定義/実行し、システムカタログから情報を取得した後、標的とする型の列を改ざんする攻撃手法が存在する。

 3つ目がデータベースの種類、バージョンの取得だ。一部のデータベースではSQLに所定の文字列を与えることで、データベースの種類、バージョン情報を返すものがある。製品/バージョンがわかれば、攻撃者はそれに適した攻撃ができる。

 4つ目が任意のファイルの読み込み、書き込みだ。一部のデータベースでは、SQL文の中からサーバー内の任意のファイルを読み書きできる関数を持つ。それらの関数を実行することで、データベースサーバーにある一部のファイルを任意に操作できるので、データベースサーバーを乗っ取る攻撃に有用である。

 5つ目がスリープ機能を利用したレスポンス時間の差異だ。SQLインジェクションの攻撃を実施する際に、レスポンスに攻撃結果が表示されない場合、指定した攻撃が実行されたか否かを判断するために、攻撃の内容にレスポンス時間を遅くさせるための仕組みを組み入れる。レスポンス時間が遅れれば、攻撃が実行されたことがわかる。

 これらの攻撃については、「開発用のエラーメッセージをブラウザに表示しない」、第3回で紹介した「バインド機構」「エスケープ処理」が対策として有効だ。

株式会社神戸デジタル・ラボ

2003年神戸デジタル・ラボに入社。
2007年からWebセキュリティ診断業務を事業化し、現在に至る。
2008年4月に経済産業省から発表された「モデル取引・契約書(追補版)」のセキュリティガイドライン ワーキング・グループ委員として「Web アプリケーションセキュリティ」を担当。
2010年10月、CSS2010にてセキュリティ関連論文を発表するなど、診断業務のかたわらセキュリティ基盤研究開発業務に活躍中。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています