SQLインジェクション(SQLi)攻撃は、今日、データの完全性と機密性に対する最も深刻な脅威の一つであり、攻撃者が権限のない安全なデータにアクセスすることを可能にします。本記事では、SQLiとその攻撃の仕組みを、種類や例とともに解説します。
SQLインジェクションとは?
SQLインジェクション(SQL挿入)は、SQLベースのアプリケーションの脆弱性を悪用する悪意のある攻撃手法です。SQLiでは、ハッカーがSQLクエリに任意のコードを挿入し、データベースに保存されたレコードを直接追加、変更、削除できるようにします。SQLi攻撃は、MySQL、SQL Server、Oracleなど、SQLデータベースを使用するあらゆるWebアプリケーションやWebサイトに影響を及ぼす可能性があります。
ハッカーはSQLクエリに任意のコードを挿入し、データベースに保存されたレコードを直接追加、変更、削除できるようにします。
SQLiに関する最初の公開討論は、1998年にJeff Forristalによって始まりました。ForristalはSQLiについてのインタビューで、「SQLの仕組みを完全に変えられる」と語っています。2017年には、Open Web Application Security Project(OWASP)が、脆弱なWebアプリケーションに対する最も一般的な脅威としてインジェクションを挙げました。
ハッカーはSQLi攻撃を利用して、個人情報、企業データ、顧客データ、企業秘密などの機密データに不正アクセスする可能性があります。SQLi攻撃によって、悪意のあるSQL文を実行し、Webアプリケーションの背後にあるデータベースサーバーを制御できるようになります。
攻撃者はSQLの脆弱性を利用してアプリケーションのセキュリティを回避し、Webアプリケーションの認可や認証を迂回して、データベース全体からデータを取得できます。
詳しく読む: 2022年版・SQL Serverの監視およびパフォーマンスツールのベスト
SQLインジェクション攻撃の仕組みとは?
SQL(Structured Query Language)は、リレーショナルデータベースに保存されたデータを管理するために設計された標準化プログラミング言語です。SQLi攻撃は、入力データを介してSQLクエリを注入または挿入するものです。SQLコマンドをデータプレーンの入力に挿入し、あらかじめ定義されたSQLコマンドの実行を攻撃します。
SQLi攻撃は、入力データを介してSQLクエリを注入または挿入するものです。
SQLi攻撃を実行するため、攻撃者はWebサイトやWebアプリケーション内の脆弱な入力箇所を探します。次に、SQLクエリ形式のユーザー入力を使って、この脆弱性を悪用します。攻撃者は、特別に細工したSQLコマンドをサイバー侵入として実行します。このコードによって、データベースの構造を明確に把握できる応答を取得し、データベースへの完全なアクセスが可能になります。
SQLiを使った攻撃は、データベースエンジンの種類によって異なりますが、すべてのSQLi攻撃は動的SQL文を標的にします。SQLiとその亜種は、扱いが難しい場合があります。
SQLiの一般的な亜種には、次のようなものがあります。
- ユーザー入力ベースのSQLi
- CookieベースのSQLi
- HTTPヘッダーベースのSQLi
- 二次SQLi
eSecurity Planetの関連記事: 2021年にSQLインジェクション攻撃を防ぐ方法
SQLインジェクション攻撃の例
SQLi攻撃は最も一般的な攻撃手法の一つであるため、多くの事例があります。以下に、SQLiを使った代表的な攻撃例を紹介します。
- 2002年、Jeremiah Jacksは、Guess.comがSQLi攻撃に対して脆弱であることを発見し、攻撃者が適切に細工したURLを作成して、20万件を超える顧客データベースから全顧客の氏名、クレジットカード番号、有効期限を抜き出せる状態になっていました。
- 2007年には、Microsoft UKのWebサイトが改ざんされました。SQLiを使ったコンピューター犯罪者によるものでした。
- 2010年、スウェーデン総選挙の期間中、SQLiが試みられました。これは、記名投票の一環としてSQLコマンドを手書きで記入するというものでした。
- 2015年には、顧客情報を盗み出そうとするSQLi攻撃が英国の通信会社TalkTalkのサーバーに対して行われました。攻撃者は、旧式のWebポータルに存在した脆弱性を悪用しました。
- 2021年、攻撃者が70ギガバイトのデータを盗み出しました。SQLi攻撃を使い、極右系WebサイトGabから盗み出したものです。GabのCTOであるFosco Marotto自身が、Gabのコードベースにこの脆弱性を組み込んでいました。
CIO Insightの関連記事: 組織が直面するサイバーセキュリティ脅威のトップ
SQLインジェクションの種類
SQLiは、バックエンドデータへのアクセス方法と、それによって生じる被害の可能性に基づいて分類できます。SQLインジェクションは通常、次の3つの主要カテゴリーに分類されます。
- インバンドSQLi(クラシック)
- 推論型SQLi(ブラインド)
- アウト・オブ・バンドSQLi
インバンド(クラシック)SQLi
インバンド(クラシック)SQLiは、最も一般的なSQLi攻撃の種類の一つです。攻撃者は、攻撃の実行と結果の取得に同じ通信チャネルを使用します。インバンドSQLiには2つの亜種があります。
- エラーベースSQLi:この手法では、データベースサーバーが返すエラーメッセージを利用して、データベース構造に関する情報を収集します。
- ユニオンベースSQLi:この手法では、UNION SQL演算子を利用してSELECT文の結果を結合し、単一のHTTPレスポンスを取得します。攻撃者は、そのレスポンスのデータをさらに利用できます。
推論型(ブラインド)SQLi
推論型(ブラインド)SQLiは、サーバーの応答と動作パターンに依存するため、実行は通常より遅くなりますが、より大きな被害につながる可能性があります。攻撃者はサーバーにペイロードを送信し、その応答と動作を観察してデータベース構造を再構築します。推論型SQLiには2つの亜種があります。
- ブールベースSQLi:攻撃者は、アプリケーションに結果を返させるSQLクエリをデータベースに送信します。その結果に基づいて、HTTPレスポンス内の情報が変更されるかどうかが決まります。
- 時間ベースSQLi:この手法では、応答を返す前にデータベースを指定した時間(秒単位)だけ待機させるSQLクエリを送信します。応答時間によって、クエリの結果がTRUEかFALSEかを判定できます。
アウト・オブ・バンドSQLi
これはSQLi攻撃の中で最も一般的でない手法です。アウト・オブ・バンドSQLiでは、データベースサーバーにDNSまたはHTTPリクエストを実行させ、攻撃者にデータを送信します。この攻撃は、攻撃者が攻撃の実行と結果の取得に同じチャネルを使えない場合に発生します。アウト・オブ・バンドSQLiは、特にサーバーの応答が安定しない場合に、推論型の時間ベース手法に代わる手段となります。
アウト・オブ・バンドSQLiは、特にサーバーの応答が安定しない場合に、推論型の時間ベース手法に代わる手段となります。
あらゆる組織は、SQLi攻撃から貴重な情報を守ることに注力する必要があります。こうした脆弱性を検査するための自動検出ツールは数多く存在します。データを中心とした戦略を含む多層的なアプローチは、SQLi攻撃に対する最適な防御策になり得ます。これは、アプリケーションやネットワークだけでなく、データ自体の保護にも重点を置くものです。