SQL インジェクション攻撃に対抗する

セキュリティー上の弱点を突いたよくある攻撃からサイトを守る

セキュリティー上の弱点を突いた攻撃に対する脆弱性のなかで、簡単に対処できるとは言え、OWASP Top 10 の第 1 位に挙げられたのは、SQL (Structured Query Language) などのインジェクション攻撃に対する脆弱性です。この類の攻撃は 1995年から存在していましたが、今でも Web アセットに対して最もよく使われる攻撃手段の 1 つとして存在しています。この記事を読んで、SQL インジェクション攻撃について、さらには本番 Web サイトでこの攻撃がどのように実行されるかについて、理解してください。その上で、IBM Security AppScan Standard を使用して、Web サイトにこの類の脆弱性があるかどうかをテストする方法を学んでください。

M. Tim Jones, Firmware Architect, Independent author

Photo of M. Tim JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』(現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。彼は米国のコロラド州ロングモン在住で、Micron で働いています。



2014年 7月 10日

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 操作を実行します (ここで、unamepword は入力変数です)。

select * from Users where userid=’uname’ AND password= ‘pword’;

Web フォームに対し、巧妙に仕組まれた入力をすることで、設計者の意図を変えて、実行されるクエリーを変更することができます。図 1 に示している例では、私はすべてのレコードを要求するようにクエリーの条件を変更しました。その方法は、OR 式を使用し (これは常に true に評価されます)、パスワード・チェックをコメントアウトするというものです。

図 1. 単純な SQL インジェクション攻撃の図解
単純な SQL インジェクション攻撃を説明した図

この単純な例により、Web ページのフォーム入力からバックエンド SQL データベースとの通信における脆弱性を悪用できる仕組みがわかるはずです。この処理を実行した結果、式を満たす全レコードのリストが返されます。つまり、ユーザー・データベース全体が返されるというわけです。それでは、Web サイトに対して SQL インジェクションに対する脆弱性を突いた攻撃の過程を辿り、この攻撃が実際にどのように動作するのかを見ていきましょう。


SQL インジェクション攻撃のデモ

図 1 から、SQL インジェクションが無効なユーザー入力を利用して、バックエンド・データベースと直接通信することを可能にする仕組みがわかったところで、Web サーバーでこの攻撃を実験してみます。Web サイト http://demo.testfire.net は、架空の銀行 Altoro Mutual のデモンストレーション・テスト・サイトです。このサイトでは、脆弱性が内在する Web サーバーの本番バージョンを実行しています。

まず、Web ブラウザーでターゲット・サイトを開くと、図 2 のようなページで迎えられます。ページ上部の右側のほうに「Sign In (サインイン)」リンクがあります。これが、この例で攻撃するターゲットです。このリンクをクリックすると、ログイン・ページが表示されます。

図 2. Altoro Mutual 銀行のホーム・ページ
Altoro Mutual 銀行のホーム・ページを示す画像

クリックして大きなイメージを見る

図 2. Altoro Mutual 銀行のホーム・ページ

Altoro Mutual 銀行のホーム・ページを示す画像

図 3 に示すログイン・ページを見るとわかるように (Mozilla Firefox Firebug プラグインを使用しています)、この Web サイトでは、confirminput という関数の中でフィールドの JavaScript 検証を使用しています。

図 3. Firebug によるページのソースの検査
Firebug におけるページのソースを示す画像

クリックして大きなイメージを見る

図 3. Firebug によるページのソースの検査

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 をユーザー名に挿入した場合のエラー応答
SQL をユーザー名に挿入した場合のエラー応答を示す画像

この場合、(図 4 でのように) 例外を発生させるのではなく、クエリーを変更することで、開発者の意図を無視するようにします。内部では、クエリーは以下のようになります。

query = SELECT User FROM Users 
	WHERE Username = 'don'--' AND Password = '*'

この例から、「Username (ユーザー名)」フィールドに単純な追加 ('--) をするだけで、クエリーのパスワード部分が意味のないものになりますが、一方で正常なクエリーとしてデータベースに渡されます。この情報を用いれば、今度は、システムには管理者アカウントがあって、そのアカウント名が「admin」であるという確率ゲームをすることになります。ユーザー名を「admin'--」とすること以外は前の例と同じ操作を行えば、管理者アカウントへのログインに成功して、管理者ユーザーの名前を確認し、管理者アカウントに関するその他の詳細情報を見つけて、その管理者アカウントを自分のものとして使用することが可能になります。

簡単な SQL の知識と非セキュアな Web サイトがあれば、内部エラー・チェックを迂回して、管理者パスワードの情報がなくても管理者として自分を認証させることができます。管理者アカウントが有効でないとしても (または、外部からアクセスできない場合でも)、多少複雑なユーザー名を使用すれば、Users テーブルの最初のアカウントにアクセスできる可能性があります。この場合、ユーザー名に「' OR 1=1--」と入力して、クエリーが常に真の条件になるようにクエリーを変更します。この悪用方法では、管理者特権を手に入れることはできないものの、Web サイトの奥深くにアクセスして、さらに悪用できる可能性があります。


脆弱性のテスト

AppScan Standard 評価版

AppScan Standard 評価版

IBM Security AppScan は、ソフトウェア開発ライフサイクル全体にわたって脆弱性テストを管理するように設計された、有数のアプリケーション・セキュリティー・テスト・スイートです。IBM Security AppScan は、脆弱性の評価を自動化するとともに、SQL インジェクション、クロスサイト・スクリプティング、バッファー・オーバーフロー、そして新規 Flash/Flex アプリケーションおよび Web 2.0 のデータ漏洩のスキャンを含む、あらゆる一般的な Web アプリケーションの脆弱性のスキャンとテストを行います。

AppScan は、OWASP Top 10 2013 年版のすべてをカバーしています。このソリューションには、業界標準 TLS (Transport Layer Security) プロトコル 1.2 のサポートが組み込まれており、FIPS (Federal Information Publication Standard) 140-2 および NIST (National Institute of Standards and Technology) SP (Special Publication) 800-131a に準拠します。

AppScan Standard の試用版をダウンロードしてください。

先ほどの例では、本番 Web サーバーに対する簡単な攻撃について説明しました。あいにく、この単純な攻撃は数多くの攻撃のうちの 1 つに過ぎません。そこで、このセクションでは IBM Security AppScan Standard を使用してアプリケーションの脆弱性を簡単に検証する方法を説明します。

Security AppScan Standardをインストールする

Security AppScan Standard をインストールするには、最初のステップとして、このアプリケーションを IBM developerWorks サイトからダウンロードします (「参考文献」のリンクを参照)。基本的なダウンロード手順は以下のとおりです。

  1. 任意の Java対応の Web ブラウザーで、Security AppScan Webサイトにナビゲートします。
  2. 「Evaluate (評価)」タブで、「Download Now (今すぐダウンロード)」をクリックします。
  3. ログインまたは登録プロセスを完了します。
  4. 「Security Systems Products (セキュリティー・システム製品)」ページで、「IBM Security AppScan Standard V8.8 Windows Multilingual evaluation (IBM Security AppScan Standard V8.8 Windows 多言語評価版)」を選択し、「Download Now (今すぐダウンロード)」をクリックします。

    アプレット・ウィンドウが開いて、アプレットの実行許可を付与するように求められることがあります。

  5. 初めて IBM Download Director を実行するときには、デフォルトのダウンロード先を選択するよう求めるプロンプトが出されます。「OK」をクリックしてデフォルトの場所を確認します。
  6. ダウンロードが完了するとウィンドウが表示され、そのウィンドウからファイルを起動できます。「Yes (はい)」をクリックしてください。
  7. インストール言語を選択します (図 6 を参照)。
    図 6. 優先するインストール言語の選択
    優先するインストール言語の選択方法を示す画像

    アプリケーションがインストールに備えてイメージを解凍し、インストール・プロセスを開始します。

  8. ライセンスの条項に同意して (図 7 を参照)、「Next (次へ)」をクリックします。
    図 7. ソフトウェア・ライセンス条項
    ソフトウェア・ライセンス条項を示す画像
  9. 次のウィンドウで「Install (インストール)」をクリックし、デフォルトの場所を使用します。

    ソフトウェアのフル・インストールが開始されます。

  10. インストール・プロセスの終わり近くに、Web サービスをスキャンするためのオプション・コンポーネントをダウンロードするかどうかを尋ねられます。このデモでは、「No (いいえ)」をクリックします。
  11. 次のステップではライセンスがインストールされるため、数分待たなければならない場合がありますが、インストールが完了した時点で、インストールの完了を知らせるウィンドウが表示されます (図 8 を参照)。
    図 8. インストールの完了
    インストールの完了ウィンドウを示す画像
  12. 「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 のポップアップ・ウィンドウ
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 (構成ウィザードへようこそ)」ウィンドウ
「Welcome to the Configuration Wizard (構成ウィザードへようこそ)」ウィンドウを示す画像

「URL and Servers (URL およびサーバー)」ペインが表示されます (図 12 を参照)。このペインで、スキャンを開始するために使用する URL を指定し、「Case-Sensitive Path (大文字と小文字を区別するパス)」オプションを有効にしてください。他はすべてデフォルトのままにして、「Next (次へ)」をクリックします。

図 12. 「URL and Servers (URL およびサーバー)」ペイン
「URL and Servers (URL およびサーバー)」ペインを示す画像

次に表示されるのは、「Login Management (ログイン管理)」ペインです (図 13 を参照)。「Login Method (ログイン方法)」では、「Recorded (記録済み)」が選択された状態のままにして、Security AppScan Standard がユーザーとして自動的にログインできるようにします。特定のサイトがワンタイム・パスワードまたは CAPTCHA を使用しているとしたら、「Prompt (プロンプト)」オプションを選択することもできます。「Next (次へ)」をクリックして次のステップに進みます。

図 13. 「Login Management (ログイン管理)」ペイン
「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 (テスト・ポリシー)」ペイン
「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 (スキャン構成ウィザードを完了)」ペイン
「Complete Scan Configuration Wizard (スキャン構成ウィザードを完了)」ペインを示す画像

Scan Expert は実行中に、メイン・ウィンドウに結果を取り込みます (図 16 を参照)。この Web サイトは予備段階としてスキャンされるため、Security AppScan Standard が一連の推奨を作成します (ウィンドウの下部に表示されます)。これらの推奨は、選択されたままの状態で構いません。スキャンが完了したら、ウィンドウの右下にある「Apply Recommendations (推奨を適用)」をクリックしてください。

図 16. Scan Expert のウィンドウ
Scan Expert のウィンドウを示す画像

クリックして大きなイメージを見る

図 16. Scan Expert のウィンドウ

Scan Expert のウィンドウを示す画像

「Apply Recommendations (推奨を適用)」をクリックすると、推奨を表示するペインが消え、スキャンが開始されます。ウィンドウの下の部分に、スキャンの進行状況がフェーズの定義とスキャンの経過時間と併せて表示されます。その下には、興味深い情報が示されます。それは、最初のフェーズがたった 51% 完了した時点で、98 ものセキュリティー問題 (34 の高レベルの問題、18 の中レベルの問題、31 の低レベルの問題、15 の通知) が検出されていることです (この時点での結果が、図 17 に示されています)。完了するまでスキャンを実行してください (最初のフェーズが完了した後、フェーズ 2、フェーズ 3 へと進みます)。

図 17. スキャンの進行状況
スキャンの進行状況を示す図

クリックして大きなイメージを見る

図 17. スキャンの進行状況

スキャンの進行状況を示す図

図 17 には、右上隅に 3 つのアイコンが示されています。この 3 つのアイコンを使用して、結果のビューを未加工のデータ (Data) から、検出された問題 (Issues)、そして推奨される修復タスクのリスト (Tasks) へと変更することができます。「Issues (問題)」アイコンをクリックすると、対処すべき問題のリストが表示されます。具体的には、Security AppScan Standard によって検出された SQL インジェクション問題 (この記事の前半でデモした単純な脆弱性を遥かに上回る全部で 33 の問題) のリストを表示することができます。また、図 18 には Security AppScan Standard がスキャンの全フェーズを完了した時点で、337 のセキュリティー問題が検出されたことが示されています。そのうち、114 の問題は高レベルのカテゴリーです。

図 18. 検出された SQL インジェクション問題
検出された SQL インジェクション問題を示す画像

クリックして大きなイメージを見る

図 18. 検出された SQL インジェクション問題

検出された SQL インジェクション問題を示す画像

ウィンドウの右側のタブには、大量の情報が表示されます。「Advisory (アドバイザリー)」タブをクリックすると、エラーの考えられる原因が一覧表示され、検出された特定のエラーの技術的な説明と併せて悪用の例 (さらに詳しい情報へのリンクを含む) を確認することができます。「Fix Recommendation (推奨される修正)」タブには、特定の状況を回避する各種フレームワークについてのさらに詳細な情報が表示されます。これが、Security AppScan Standard の主な長所です。つまり Security AppScan Standard は、脆弱性を検出してリストとして提供するとともに、セキュリティー上の弱点がどのように悪用されるのかに関する詳細情報、その弱点を修正して回避するための指針も提供します。


まとめ

この記事を読んで、Security AppScan に潜む能力を理解できたはずです。Security AppScan は、クラス最高の脆弱性スキャンによる検出機能 (この記事は、その機能を表面的に紹介しただけです) を提供するだけでなく、セキュリティー上の弱点や、それらの悪用方法、修正方法などに関する豊富な情報を公開します。Web サイトは常に脅威にさらされていますが、Security AppScan のようなツールによって、セキュアで信頼性できる Web アプリケーションのデプロイメントに向けて大きな飛躍を遂げることができます。

参考文献

学ぶために

製品や技術を入手するために

議論するために

  • developerWorks コミュニティーに参加してください。このコミュニティーは、専門家のネットワークとして、互いにつながり合って情報を共有し、コラボレーションするための統合コミュニティー・ツール・セットです。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=976638
ArticleTitle=SQL インジェクション攻撃に対抗する
publish-date=07102014