SQL (Structured Query Language) インジェクション攻撃は概して単純であることを考えると、今でもハッカーが利用できる最も一般的で最も危険な攻撃の 1 つとして存在しているのは驚くべきことです。その犠牲者のリストには、インターネット世界の大御所が並んでいます。LinkedIn や Yahoo! から、FBI (Federal Bureau of Investigation) や NASA (National Aeronautics and Space Administration)、さらには最もセキュアな Web サイトでさえも、この有名な攻撃の犠牲になっています。最も大掛かりな SQL インジェクションの事例の 1 つは、2011年、Sony PlayStation Network Web サイトで発生しました。ハッカーは SQL インジェクションを使って、7700 万件のユーザー・アカウント (そして関連する個人情報) にアクセスすることに成功したのです。この攻撃によるダウンタイムだけで、Sony は数百万ドルもの収益減という犠牲を被りました。銀行からソーシャル・メディアに至るまでの Web サイトに対する SQL インジェクション攻撃の被害額は、合計すると数十億 US ドルに達します。
SQL インジェクション攻撃の概要
SQL インジェクション攻撃の仕組みを理解するために、単純な例について見ていきます。このタイプの攻撃は、ユーザー入力で適切にフィルタリングされていないエスケープ文字を利用して、データベースに対するクエリーの操作を悪用します。
図 1 に、単純な SQL インジェクション攻撃を図解します。アーキテクチャーとしては、Web クライアントから、ユーザーが HTTP を使用してフロントエンドの Web サーバーとやりとりします。このフロントエンド Web サーバーはバックエンド SQL サーバーとやりとりします。ユーザーがログインする場合、フロントエンド Web サーバーはユーザーが定義した情報を使用して SQL クエリーを作成します。セキュア Web サーバーであれば、通常はユーザーに対し、システムとの間で認証を行うためにユーザー名とパスワードを入力するよう要求します。Web サーバーは一般に、以下のような SQL 操作を実行します (ここで、uname
と pword
は入力変数です)。
select * from Users where userid=’uname’ AND password= ‘pword’;
Web フォームに対し、巧妙に仕組まれた入力をすることで、設計者の意図を変えて、実行されるクエリーを変更することができます。図 1 に示している例では、私はすべてのレコードを要求するようにクエリーの条件を変更しました。その方法は、OR
式を使用し (これは常に true に評価されます)、パスワード・チェックをコメントアウトするというものです。
図 1. 単純な SQL インジェクション攻撃の図解
この単純な例により、Web ページのフォーム入力からバックエンド SQL データベースとの通信における脆弱性を悪用できる仕組みがわかるはずです。この処理を実行した結果、式を満たす全レコードのリストが返されます。つまり、ユーザー・データベース全体が返されるというわけです。それでは、Web サイトに対して SQL インジェクションに対する脆弱性を突いた攻撃の過程を辿り、この攻撃が実際にどのように動作するのかを見ていきましょう。
SQL インジェクション攻撃のデモ
図 1 から、SQL インジェクションが無効なユーザー入力を利用して、バックエンド・データベースと直接通信することを可能にする仕組みがわかったところで、Web サーバーでこの攻撃を実験してみます。Web サイト http://demo.testfire.net
は、架空の銀行 Altoro Mutual のデモンストレーション・テスト・サイトです。このサイトでは、脆弱性が内在する Web サーバーの本番バージョンを実行しています。
まず、Web ブラウザーでターゲット・サイトを開くと、図 2 のようなページで迎えられます。ページ上部の右側のほうに「Sign In (サインイン)」リンクがあります。これが、この例で攻撃するターゲットです。このリンクをクリックすると、ログイン・ページが表示されます。
図 2. Altoro Mutual 銀行のホーム・ページ
図 3 に示すログイン・ページを見るとわかるように (Mozilla Firefox Firebug プラグインを使用しています)、この Web サイトでは、confirminput
という関数の中でフィールドの JavaScript 検証を使用しています。
図 3. Firebug によるページのソースの検査
いずれかのフィールドを空白にしてログインしようとすると、フィールドを空白にすることはできないというメッセージが表示されます。ここで私のアイデアを少し詳しく説明しておくと、ユーザー名フィールドに無作為の名前を入力し、パスワード・フィールドに特殊文字を入力して、アプリケーションがどのように応答するか試してください。この場合、私は図 4 に示すように、サンプル・ユーザー名 (donald
) と、アポストロフィー ('
) 文字からなるパスワードを入力しました。
図 4. パスワード・エントリーにアポストロフィー (') 文字を入力した場合のエラー応答
ユーザー名とパスワードの組み合わせが正しくないというメッセージを表示する代わりに、Web サーバーは寛大にも SQL クエリーについての詳細情報を表示しています。具体的には、password
パラメーターにアポストロフィーを使用すると、バックエンド・データベースに対するクエリーの構文が壊れてしまうということです。以下の SQL クエリーに示すように、エラーは WHERE
節の構造にあることがわかります。
query = SELECT User FROM Users WHERE Username = 'donald' AND Password = '''
この情報を利用すれば、この SQL クエリーを悪用できるかどうかを判別することができます。SQL では、ハイフンを 2 つ続けて入力すると (--
)、その行のそれ以降はコメントとして解釈されます。コメントであれば、SQL データベースは行の残りの部分を無視することになります。
SQL コメントによってクエリーの残りの部分、つまりパスワードの部分を破棄すれば、パスワードを知らなくてもクエリーを成功させることができます。前の例ではアポストロフィーを使用するとクエリーが壊れることがわかりました。この情報を基に、何らかの SQL をユーザー名に挿入してクエリーを変更します。例えば、「don'--
」と入力して、パスワードに適当な文字を入力すると、Web サーバーから図 5 に示すエラー応答が返されました。
図 5. SQL をユーザー名に挿入した場合のエラー応答
この場合、(図 4 でのように) 例外を発生させるのではなく、クエリーを変更することで、開発者の意図を無視するようにします。内部では、クエリーは以下のようになります。
query = SELECT User FROM Users WHERE Username = 'don'--' AND Password = '*'
この例から、「Username (ユーザー名)」フィールドに単純な追加 ('--) をするだけで、クエリーのパスワード部分が意味のないものになりますが、一方で正常なクエリーとしてデータベースに渡されます。この情報を用いれば、今度は、システムには管理者アカウントがあって、そのアカウント名が「admin」であるという確率ゲームをすることになります。ユーザー名を「admin'--」とすること以外は前の例と同じ操作を行えば、管理者アカウントへのログインに成功して、管理者ユーザーの名前を確認し、管理者アカウントに関するその他の詳細情報を見つけて、その管理者アカウントを自分のものとして使用することが可能になります。
簡単な SQL の知識と非セキュアな Web サイトがあれば、内部エラー・チェックを迂回して、管理者パスワードの情報がなくても管理者として自分を認証させることができます。管理者アカウントが有効でないとしても (または、外部からアクセスできない場合でも)、多少複雑なユーザー名を使用すれば、Users
テーブルの最初のアカウントにアクセスできる可能性があります。この場合、ユーザー名に「' OR 1=1--
」と入力して、クエリーが常に真の条件になるようにクエリーを変更します。この悪用方法では、管理者特権を手に入れることはできないものの、Web サイトの奥深くにアクセスして、さらに悪用できる可能性があります。
脆弱性のテスト
先ほどの例では、本番 Web サーバーに対する簡単な攻撃について説明しました。あいにく、この単純な攻撃は数多くの攻撃のうちの 1 つに過ぎません。そこで、このセクションでは IBM Security AppScan Standard を使用してアプリケーションの脆弱性を簡単に検証する方法を説明します。
Security AppScan Standardをインストールする
Security AppScan Standard をインストールするには、最初のステップとして、このアプリケーションを IBM developerWorks サイトからダウンロードします (「参考文献」のリンクを参照)。基本的なダウンロード手順は以下のとおりです。
- 任意の Java対応の Web ブラウザーで、Security AppScan Webサイトにナビゲートします。
- 「Evaluate (評価)」タブで、「Download Now (今すぐダウンロード)」をクリックします。
- ログインまたは登録プロセスを完了します。
- 「Security Systems Products (セキュリティー・システム製品)」ページで、「IBM Security AppScan Standard V8.8 Windows Multilingual evaluation (IBM Security AppScan Standard V8.8 Windows 多言語評価版)」を選択し、「Download Now (今すぐダウンロード)」をクリックします。
アプレット・ウィンドウが開いて、アプレットの実行許可を付与するように求められることがあります。
- 初めて IBM Download Director を実行するときには、デフォルトのダウンロード先を選択するよう求めるプロンプトが出されます。「OK」をクリックしてデフォルトの場所を確認します。
- ダウンロードが完了するとウィンドウが表示され、そのウィンドウからファイルを起動できます。「Yes (はい)」をクリックしてください。
- インストール言語を選択します (図 6 を参照)。
図 6. 優先するインストール言語の選択
アプリケーションがインストールに備えてイメージを解凍し、インストール・プロセスを開始します。
- ライセンスの条項に同意して (図 7 を参照)、「Next (次へ)」をクリックします。
図 7. ソフトウェア・ライセンス条項
- 次のウィンドウで「Install (インストール)」をクリックし、デフォルトの場所を使用します。
ソフトウェアのフル・インストールが開始されます。
- インストール・プロセスの終わり近くに、Web サービスをスキャンするためのオプション・コンポーネントをダウンロードするかどうかを尋ねられます。このデモでは、「No (いいえ)」をクリックします。
- 次のステップではライセンスがインストールされるため、数分待たなければならない場合がありますが、インストールが完了した時点で、インストールの完了を知らせるウィンドウが表示されます (図 8 を参照)。
図 8. インストールの完了
- 「Finish (終了)」をクリックしてインストールを完了します。
注: Microsoft .NET Framework 4.5 も必要です。「参考文献」のリンクを参照してください。
インストールが完了したので、次のステップで、Security AppScan Standard を構成してスキャンを開始します。
Security AppScan Standard を構成してスキャンを開始する
Security AppScan Standard がインストールされたら、構成を行って、ターゲット Web サイトのスキャンを開始します。
Security AppScan Standard を起動するには、デスクトップに表示されたアイコンをクリックするか、「Start (スタート)」 > 「IBM Security AppScan Standard」の順にクリックします。アプリケーションが起動されて、中央にポップアップ・ウィンドウが表示されます (図 9 を参照)。最初に「Getting Started (PDF) (スタートアップ・ガイド (PDF))」リンクをクリックして、ご使用のコンピューターにこのガイドをダウンロードすることをお勧めします。これは、アプリケーションを理解するのに大いに役立つリファレンスで、Security AppScan の背後にある基本原則、スキャンの構成方法と実行方法、結果の解釈方法が記載されています。このガイドをダウンロードしてから、次のステップに進んでください。
図 9. Security AppScan Standard のポップアップ・ウィンドウ
スキャンを開始するには、図 9 に示されているポップアップ・ウィンドウで「Create New Scan (新規スキャンの作成)」をクリックします。このリンクをクリックすると、「New Scan (新規スキャン)」ウィンドウが開きます (図 10 を参照)。左上の「Recent Templates (最近使用したテンプレート)」の下に表示されている demo.testfire.net
サイトのリンクをクリックすることで、先ほど攻撃したこのサイトをスキャンしてください。
図 10. スキャンの作成
図 11 に示すスキャン構成ウィザードが表示されます。Web アプリケーション・スキャンのオプションがすでに設定されているので、「Next (次へ)」をクリックして次のステップに進みます。
図 11. 「Welcome to the Configuration Wizard (構成ウィザードへようこそ)」ウィンドウ
「URL and Servers (URL およびサーバー)」ペインが表示されます (図 12 を参照)。このペインで、スキャンを開始するために使用する URL を指定し、「Case-Sensitive Path (大文字と小文字を区別するパス)」オプションを有効にしてください。他はすべてデフォルトのままにして、「Next (次へ)」をクリックします。
図 12. 「URL and Servers (URL およびサーバー)」ペイン
次に表示されるのは、「Login Management (ログイン管理)」ペインです (図 13 を参照)。「Login Method (ログイン方法)」では、「Recorded (記録済み)」が選択された状態のままにして、Security AppScan Standard がユーザーとして自動的にログインできるようにします。特定のサイトがワンタイム・パスワードまたは CAPTCHA
を使用しているとしたら、「Prompt (プロンプト)」オプションを選択することもできます。「Next (次へ)」をクリックして次のステップに進みます。
図 13. 「Login Management (ログイン管理)」ペイン
次は、「Test Policy (テスト・ポリシー)」ペインが表示されます。ウィンドウの上の部分では、「Test Policy (テスト・ポリシー)」が「Default (デフォルト)」に設定され、「Send tests on login and logout pages (ログイン・ページとログアウト・ページに関するテストを送信する)」と「Clear session identifiers before testing login pages (ログイン・ページをテストする前にセッション識別子をクリアする)」の両方のチェック・ボックスが選択された状態になっています。「Next (次へ)」をクリックして次のステップに進みます。
図 14. 「Test Policy (テスト・ポリシー)」ペイン
次に表示される「Complete Scan Configuration Wizard (スキャン構成ウィザードを完了)」ペインで、構成を終了します。「Start a full automatic scan (自動フルスキャンを開始)」オプションを選択してから、「Start Scan Expert when Scan Configuration Wizard is complete (スキャン構成ウィザードが完了したらスキャンを開始)」チェック・ボックスを選択します (図 15 を参照)。「Finish (終了)」をクリックしてスキャンを開始します。「Auto Save (自動保存)」ウィンドウで、「Yes (はい)」をクリックし、スキャン・ファイル名として「AltoroJ」と指定した後、「Save (保存)」をクリックします。
図 15. 「Complete Scan Configuration Wizard (スキャン構成ウィザードを完了)」ペイン
Scan Expert は実行中に、メイン・ウィンドウに結果を取り込みます (図 16 を参照)。この Web サイトは予備段階としてスキャンされるため、Security AppScan Standard が一連の推奨を作成します (ウィンドウの下部に表示されます)。これらの推奨は、選択されたままの状態で構いません。スキャンが完了したら、ウィンドウの右下にある「Apply Recommendations (推奨を適用)」をクリックしてください。
図 16. Scan Expert のウィンドウ
「Apply Recommendations (推奨を適用)」をクリックすると、推奨を表示するペインが消え、スキャンが開始されます。ウィンドウの下の部分に、スキャンの進行状況がフェーズの定義とスキャンの経過時間と併せて表示されます。その下には、興味深い情報が示されます。それは、最初のフェーズがたった 51% 完了した時点で、98 ものセキュリティー問題 (34 の高レベルの問題、18 の中レベルの問題、31 の低レベルの問題、15 の通知) が検出されていることです (この時点での結果が、図 17 に示されています)。完了するまでスキャンを実行してください (最初のフェーズが完了した後、フェーズ 2、フェーズ 3 へと進みます)。
図 17. スキャンの進行状況
図 17 には、右上隅に 3 つのアイコンが示されています。この 3 つのアイコンを使用して、結果のビューを未加工のデータ (Data) から、検出された問題 (Issues)、そして推奨される修復タスクのリスト (Tasks) へと変更することができます。「Issues (問題)」アイコンをクリックすると、対処すべき問題のリストが表示されます。具体的には、Security AppScan Standard によって検出された SQL インジェクション問題 (この記事の前半でデモした単純な脆弱性を遥かに上回る全部で 33 の問題) のリストを表示することができます。また、図 18 には Security AppScan Standard がスキャンの全フェーズを完了した時点で、337 のセキュリティー問題が検出されたことが示されています。そのうち、114 の問題は高レベルのカテゴリーです。
図 18. 検出された SQL インジェクション問題
ウィンドウの右側のタブには、大量の情報が表示されます。「Advisory (アドバイザリー)」タブをクリックすると、エラーの考えられる原因が一覧表示され、検出された特定のエラーの技術的な説明と併せて悪用の例 (さらに詳しい情報へのリンクを含む) を確認することができます。「Fix Recommendation (推奨される修正)」タブには、特定の状況を回避する各種フレームワークについてのさらに詳細な情報が表示されます。これが、Security AppScan Standard の主な長所です。つまり Security AppScan Standard は、脆弱性を検出してリストとして提供するとともに、セキュリティー上の弱点がどのように悪用されるのかに関する詳細情報、その弱点を修正して回避するための指針も提供します。
まとめ
この記事を読んで、Security AppScan に潜む能力を理解できたはずです。Security AppScan は、クラス最高の脆弱性スキャンによる検出機能 (この記事は、その機能を表面的に紹介しただけです) を提供するだけでなく、セキュリティー上の弱点や、それらの悪用方法、修正方法などに関する豊富な情報を公開します。Web サイトは常に脅威にさらされていますが、Security AppScan のようなツールによって、セキュアで信頼性できる Web アプリケーションのデプロイメントに向けて大きな飛躍を遂げることができます。
参考文献
学ぶために
- The Code Curmudgeon の「SQL Injection Hall of Shame」を調べてください。
- developerWorks の Security サイトでセキュリティー・トピックに関する詳細な情報を入手してください。
- さまざまな技術トピックに関する書籍をオンラインのテクノロジー・ブックストアで閲覧してください。
- Twitter で developerWorks をフォローしてください。
- 初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃った developerWorks オンデマンド・デモを見てください。
製品や技術を入手するために
- Security AppScan Standard について詳しく学んでダウンロードしてください。
- Microsoft .NET Framework 4.5 をダウンロードしてください。
議論するために
- developerWorks コミュニティーに参加してください。このコミュニティーは、専門家のネットワークとして、互いにつながり合って情報を共有し、コラボレーションするための統合コミュニティー・ツール・セットです。
コメント
IBM PureSystems
IBM がどのように IT に革命をもたらしているのかをご自身でお確かめください
Knowledge path
developerWorks の Knowledge path シリーズでは、テーマ別の学習資料をご提供しています
ソフトウェア評価版: ダウンロード
developerWorksでIBM製品をお試しください!