SQLインジェクションとは?例と対策

SQLインジェクション(SQLi)とは、SQL(構造化問い合わせ言語)データベースを使用するアプリケーションを標的とするサイバー脅威のことです。攻撃者は、悪意のあるSQLコードをクエリに挿入することでアプリケーションのコードの脆弱性を悪用し、潜在的に価値のある情報を含む非公開データベースへの不正アクセスを可能にします。

SQLインジェクション攻撃は、データ侵害、データ破壊、システム制御の喪失など、さまざまな悪影響をもたらす可能性があります。これらのサイバー攻撃は、SQLデータベースを使用するあらゆるアプリケーションを標的とし、ウェブサイトが最も脆弱で一般的に悪用されるターゲットとなっています。

サイバーセキュリティ教育とトレーニングを始めましょう

無料トライアルを始める

無料トライアルのお申し込み手順

  • 弊社のサイバーセキュリティ エキスパートが貴社に伺い、セキュリティ環境を評価して、脅威リスクを診断します。
  • 24 時間以内に最小限の構成で、30 日間ご利用いただけるプルーフポイントのソリューションを導入します。
  • プルーフポイントのテクノロジーを実際にご体験いただきます。
  • 組織が持つセキュリティの脆弱性に関するレポートをご提供します。このレポートは、サイバーセキュリティ攻撃の対応に直ちにご活用いただくことができます。

フォームに必要事項をご入力の上、お申込みください。追って、担当者よりご連絡させていただきます。

Proofpointの担当者がまもなくご連絡いたします。

SQLインジェクションの仕組み

SQLインジェクションは、アプリケーションがバックエンドのSQLデータベースとやり取りする方法を悪用します。以下はSQLインジェクションの仕組みを簡潔に説明したものです。

  • クエリの構築: アプリケーションは通常、データの取得や保存のためにSQLクエリを使用してデータベースとやり取りします。これらのクエリは、ユーザー入力からの部分を含む文字列を連結または接続することで構築される場合があります。
  • 悪意のある入力: アプリケーションがユーザー入力を適切に処理しない場合、攻撃者はSQLコードを含む入力を提供できます。アプリケーションがこの入力を通常のデータとして処理する代わりに、データベースはそれをSQLクエリの一部として実行します。
  • 操作されたクエリ: 悪意のある入力がSQLクエリに連結されると、クエリの構造や意図が変更されます。これにより、攻撃者は不正なデータの取得、認証のバイパス、さらにはデータベースでの管理操作の実行が可能になる場合があります。

SQLインジェクション攻撃の成功は、主にアプリケーションがSQLクエリをどのように構築し、ユーザー入力をどのように処理するかに依存します。入力を適切にサニタイズおよび検証することで、これらの脆弱性を防ぐことができます。

SQLクエリとは?

SQLは、リレーショナルデータベース管理システム(RDBMS)で保持されるデータを管理したり、リレーショナルデータストリーム管理システム(RDSMS)でストリーム処理を行ったりするための標準的なプログラミング言語です。簡単に言えば、データベースから情報を保存、更新、削除、検索、取得するために使用される宣言型プログラミング言語です。

SQLクエリは、リレーショナルデータベースとやり取りするために構造化された問い合わせ言語で書かれたコマンドや指示です。これらのクエリにより、ユーザーはデータベースに保存されたデータに対して、データの取得、挿入、更新、削除など、様々な操作を実行することができます。

SQLクエリは、データベース内で以下のような幅広い特定の機能を実行できます。

  • データベースからデータを取得する
  • データベース内のレコードを挿入、更新、または削除する
  • 全く新しいデータベースを作成する
  • データベース内に新しいテーブルを構築する
  • データベース内にストアドプロシージャを作成する
  • データベース内にビューを作成する
  • テーブル、プロシージャ、ビューに対する権限を設定する

SQLクエリは、ステートメントとして構造化された特定のコマンドです。これらは、ユーザーがデータベースにデータを追加、修正、または取得できるようにするプログラムに集約されます。

SQLクエリの基本的な例を以下に挙げます。

  • SELECT: テーブルからデータを取得するためのクエリ。
    SELECT column1, column2 FROM tablename WHERE condition;
  • INSERT INTO: テーブルに新しいデータを挿入するためのクエリ。
    INSERT INTO tablename (column1, column2) VALUES (value1, value2);
  • UPDATE: テーブル内の既存のデータを修正するためのクエリ。
    UPDATE tablename SET column1=value1 WHERE condition;

これらはSQLクエリの基本的な例です。単純なデータ取得から複雑なデータ変換や分析まで、幅広い機能を持つSQLは、リレーショナルデータに対する複雑な操作や操作を可能にする強力で汎用性の高い言語です。

SQLインジェクションの種類

SQLインジェクションの脆弱性は、悪意のあるSQLコードが入力フィールドに挿入され、その後のSQL操作に影響を与える際に発生します。これらの脅威は大きく3つのカテゴリーに分類されます。それは、インバンドSQLi、インファレンシャルSQLi、アウトオブバンドSQLiです。

1. インバンドSQLi

インバンドSQLiは最も一般的で直接的なSQLインジェクションの形式です。インバンドSQLiでは、攻撃者が悪意のあるコードを挿入し、同じ媒体を通じてフィードバックを受け取ることができます。インバンドSQLインジェクションの最も一般的な2つのタイプは、エラーベースSQLiとユニオンベースSQLiです。

エラーベースSQLi

クエリを操作することで、攻撃者はサーバーのエラーメッセージから貴重なデータベース情報を抽出します。場合によっては、この方法でデータベース全体を把握することさえ可能です。

ユニオンベースSQLi

この手法はUNION SQL演算子を利用します。攻撃者は複数のSELECT操作の結果を結合し、その結合されたデータがアプリケーションの応答に反映されます。

2. インファレンシャルSQLi

インファレンシャルSQLインジェクションは、インバンド型SQLインジェクションとは異なり、攻撃者が悪用するのに時間がかかる場合がありますが、それでも非常に効果的です。この種の攻撃では、実際にはウェブアプリケーションを介してデータが転送されず、攻撃者はインバンド(つまり、アプリケーションの応答のHTML内)で攻撃の結果を見ることができません。代わりに、脅威アクターはペイロードを送信し、ウェブアプリケーションの応答とデータベースサーバーの動作を観察することで、データベース構造を再構築することができます。インファレンシャルSQLiの主な2つの形式は、ブラインドブーリアン型SQLiとブラインドタイムベース型SQLiです。

ブラインドブーリアン型SQLi

ブーリアン型SQLインジェクションは、データベースにSQLクエリを送信し、クエリがTRUEまたはFALSEを返すかどうかに応じて、アプリケーションに異なる応答を強制的に生成させることで機能します。

ブラインドタイムベース型SQLi

タイムベース型SQLインジェクションは、データベースにSQLクエリを送信し、アプリケーションに指定された時間(秒単位)だけ待機してから応答するよう強制するインファレンシャルSQLインジェクション技術です。

3. アウトオブバンドSQLi

アウトオブバンドSQLインジェクションはあまり一般的ではありません。標的となるデータベースを攻撃者のマシンに接続する必要があるためです。この種のSQLインジェクションは、攻撃者が攻撃を仕掛けるチャネルと結果を収集するチャネルが同じではない場合に発生します。代わりに、攻撃者はメールなど、異なるチャネルを使用して攻撃を仕掛けます。

要約すると、インバンドSQLiは最も一般的で悪用しやすい一方で、インファレンシャルSQLiは攻撃者が悪用するのに時間がかかる場合がありますが、それでも非常に効果的です。お伝えしたように、アウトオブバンドSQLiはあまり一般的ではありません。

SQLインジェクションの例

SQLインジェクションは複雑な攻撃となる可能性がありますが、簡略化された例を通じて、その仕組みを理解することができます。

例えば、「User Logins」と「Customer Info」という2つのデータベーステーブルがあるとします。「User Logins」テーブルには、ユーザー名とパスワードの2つのフィールドがあります。「Customer Info」テーブルには、氏名、住所、メールアドレス、電話番号、クレジットカード番号などの追加情報が含まれています。

攻撃者は、ログインフォームに悪意のあるコードを挿入して、「User Logins」テーブルからユーザー名とパスワードを取得することができます。攻撃者がユーザー名フィールドに以下のコードを入力した場合、

 

SQL code example

 

文の最後にあるダブルハイフン(--)は、元のSQL文の残りの部分をコメントアウトするために使用されます。この部分には通常、パスワードのチェックも含まれています。

上記のステートメントは「1=1」が常に真(true)であるため、常にtrueを返します。また、ダブルハイフンで残りのステートメントがコメントアウトされるため、パスワードのチェックが無視され、攻撃者は有効なパスワードを入力せずにログインできてしまいます。

SQLインジェクションの被害

SQLインジェクション攻撃は、攻撃者のスキル、意図、およびシステムの脆弱性に応じて、さまざまな被害をもたらす可能性があります。不正アクセスが成功した場合、SQLインジェクション攻撃がもたらす潜在的な影響には以下のようなものがあります。

  • データ漏洩: SQLインジェクションで最も即座に生じる深刻な影響の一つは、データベースの記録への不正アクセスです。攻撃者は、ユーザー認証情報、個人情報、財務データなどの機密情報を閲覧できる可能性があります。
  • データの損失または破壊: 悪意のある攻撃者は、記録の変更、挿入、削除を行い、データの整合性の喪失、データの破損、または虚偽の情報の導入を引き起こす可能性があります。
  • サービス拒否: 記録のロック、テーブルの削除、またはその他の方法でデータベースを混乱させることで、攻撃者は正規ユーザーがアプリケーションを利用できなくする可能性があります。
  • データベースサーバーの乗っ取り: 高度なSQLインジェクション攻撃により、攻撃者がデータベースサーバーの制御権を獲得する可能性があります。データベースサーバーがネットワークの他の部分から適切に分離されていない場合、これがさらなる侵害への足がかりとなる可能性があります。
  • リモートでのコード実行: 一部のデータベースシステムでは、SQLを通じてシステムレベルのコマンドを実行することが可能です。攻撃者がそのようなシステムでSQLインジェクションの脆弱性を発見し悪用した場合、サーバー上で任意のコマンドを実行する可能性があり、システム全体の侵害につながる可能性があります。
  • データの露出: 攻撃者はSQLインジェクションを利用してアプリケーションの動作を変更し、通常ユーザーがアクセスできない機密情報を潜在的に露出させる可能性があります。
  • 個人情報窃盗と詐欺: 個人情報や財務情報にアクセスすることで、攻撃者は個人情報窃盗、不正取引、その他の詐欺行為を行う可能性があります。
  • 評判の低下: 技術的な影響にとどまらず、SQLインジェクション攻撃の被害を受けた企業は深刻な評判の低下のリスクがあります。顧客やパートナーが、企業のデータ保護能力に対する信頼を失う可能性があります。
  • 財務的影響: SQLインジェクション攻撃後の対応には多額のコストがかかる可能性があります。技術的な修復、法的措置、広報活動、影響を受けたユーザーへの補償、データ保護規制違反に対する潜在的な罰金など、関連する費用が発生する可能性があります。
  • 知的財産の漏洩: 企業はデータベースに独自のアルゴリズム、事業計画、その他の知的財産を保存している場合があります。SQLインジェクション攻撃は、これらの貴重なデータの盗難につながる可能性があります。

SQLインジェクションの潜在的な影響を理解することは、データベースやアプリケーションをこのような脅威から保護するための安全なコーディング手法の採用、定期的な脆弱性評価、ペネトレーションテストの重要性を強調します。

SQLインジェクションの防止と検知

SQLインジェクション攻撃の防止と検知には、安全なコーディング、インフラストラクチャの強化、モニタリング、教育の組み合わせが必要です。以下はSQLインジェクション攻撃の防止と検知のためのベストプラクティスです。

防止

  • パラメータ化クエリ(プリペアドステートメント)の使用: 常にSQLでパラメータ化クエリまたはプリペアドステートメントを使用してください。これにより、ユーザー入力が常にデータとして扱われ、実行可能なコードとして扱われることがなくなります。
  • ストアドプロシージャの使用: ストアドプロシージャを使用することで、データアクセスを抽象化し集中管理できるため、生のSQLコマンドへの露出を制限できます。
  • ORM(オブジェクト関係マッピング): ORMを利用してください。ORMはしばしばパラメータ化クエリを基盤としており、生のSQLの直接的な扱いを減らします。ただし、選択したORMがSQLインジェクションに対して安全であることを確認してください。
  • すべてのユーザー入力のエスケープ: SQLクエリに直接データを挿入しなければならない場合は、すべてのユーザー入力が適切にエスケープされていることを徹底してください。これはバックアップ対策となりますが、主要な防御策にはしないようにしてください。
  • 最小権限の原則: ウェブアプリケーションが使用するSQLデータベースアカウントが必要最小限の権限を持つようにしてください。例えば、データを取得するユーザーアカウントには、挿入や削除の権限を与えるべきではありません。
  • ウェブアプリケーションファイアウォール(WAF): ウェブアプリケーションとインターネットの間のHTTPトラフィックをフィルタリングおよび監視するWAFを導入してください。WAFは多くのインジェクション攻撃をブロックできます。
  • 詳細なエラーメッセージの無効化: データベースのエラーメッセージを一般的なものにし、データベース構造の詳細が漏洩しないようにしてください。
  • 入力検証: 入力検証にはホワイトリスト方式を使用してください。すべてのユーザー入力を厳格なルール(例:タイプ、長さ、フォーマット、範囲)に対して検証してください。
  • 定期的な更新とパッチ適用: 既知の脆弱性から保護するために、データベースソフトウェア、ウェブアプリケーションフレームワーク、ライブラリを定期的に更新してください。

検知

  • 定期的なセキュリティ監査とペネトレーションテスト: 潜在的な脆弱性を発見し修正するために、定期的にセキュリティ監査とペネトレーションテストを実施してください。
  • SQLクエリの監視: データベースに対して実行されるSQLクエリを監視し、SQLインジェクションの試行を示す可能性がある異常または予期しないクエリを検知してください。
  • エラーのモニタリング: 攻撃の試行を示す可能性がある、システムまたはアプリケーションの異常なエラーメッセージを監視してください。
  • 侵入検知システム(IDS): 悪意のある活動を監視し警告するために、IDSソリューションを導入してください。
  • ログのモニタリングと分析: 定期的にログを確認し、自動化されたログ分析を使用して攻撃の兆候を検知してください。
  • データベースの整合性チェック: 不正な変更を検知するために、現在のデータベース構造と内容を既知の正常なバックアップやベースラインと定期的に比較してください。
  • 開発者とITスタッフの教育: すべてのチームメンバーがSQLインジェクションのリスクと防止技術を理解していることを確認してください。
  • ハニーポット: 攻撃者を誘導し研究するためにデータベースハニーポットを導入してください。これは新しいSQLインジェクション手法の検出に役立ちます。

防止と検知の両方のメカニズムを組み込み、積極的なセキュリティ姿勢を維持することは、SQLインジェクションやその他の脅威から効果的に防御するために不可欠です。

SQLインジェクション対策

Proofpointは業界をリードするSQLインジェクション対策ソリューションを提供しています。ソリューションには以下が含まれます。

  • 内部脅威管理(ITM): Proofpointの包括的なITMソリューションは、組織が内部脅威やデータ損失から機密データを保護するのに役立ちます。ユーザー活動への深い可視性を提供し、ユーザーリスクを特定し、内部者主導のデータ侵害を検知し、セキュリティインシデント対応を加速します。
  • 高度サイバーセキュリティ対策(ATP): Proofpointの強化されたATPサービスには、ゼロデイSQLインジェクション攻撃を阻止するためのインライン機能が含まれています。
  • 新興脅威インテリジェンス: Proofpointの新興脅威インテリジェンスソリューションは、脅威アクターによって行われる最新の戦術、技術、手順への可視性を提供します。このインテリジェンスにより、組織は最新のSQLインジェクション手法について情報を得て、それに応じて防御を適応させることができます。

Proofpointのこれらの製品を使用する組織は、セキュリティ態勢を強化し、SQLインジェクション攻撃からデータベースを保護します。詳細については、Proofpointにお問い合わせください。

無料トライアル

まずは無料のトライアルをお試しください