SQLインジェクションとは何ですか? SQLi 攻撃を防ぐ方法
公開: 2023-09-15Web アプリケーションは、私たちのオンライン エクスペリエンスを日々強化しています。 私たちは、つながり、交流し、買い物をし、面白い猫のビデオを視聴します。これらはすべて Web アプリを使用しています。 これらは重要なビジネス サービスを提供し、機密データを保持していますが、何かを使用すればするほど、攻撃を受ける可能性が高くなります。
構造化照会言語 (SQL) の脆弱性を悪用するアプリに対して注意すべきサイバー攻撃の 1 つは、一般的で危険な SQL インジェクションです。
SQLインジェクションとは何ですか?
SQL インジェクション (SQLi) は、サイバー攻撃者が Web アプリケーションの脆弱性を悪用するために使用する有害なコード インジェクション手法です。 彼らはデータベース クエリに一連の悪意のあるコードを追加することで、その弱点を利用して不正アクセスを取得します。
SQL インジェクション攻撃は、不適切なデータ アクセス、操作、個人情報の盗難、経済的損失、評判の低下、および法的影響を引き起こします。 開発者と組織はそのリスクを理解し、完全なセキュリティ対策を実装する必要があります。 Web アプリケーション ファイアウォール (WAF) ソフトウェアやデジタル フォレンジック ソフトウェアなどのツールは、SQL インジェクション攻撃を防ぐように設計されています。 企業は、アプリを保護するために包括的な Web サイト セキュリティ スイートを利用することもできます。
この SQL インジェクション チート シートを読んで、SQL 攻撃がどのように実行されるか、例、そのバリエーション、およびそのような攻撃を防ぐ方法を理解してください。
SQL インジェクション攻撃が危険なのはなぜですか?
SQL インジェクションは、Open Worldwide Application Security Project (OWASP) の Web アプリケーション セキュリティ リスクのトップ 10 リストに何年も入っています。 2022 年だけでも、OWASP はテストしたアプリ内で何らかの形式のインジェクションが 274,000 件以上発生していることを発見しました。 SQL インジェクションとクロスサイト スクリプティング (XSS) が最も一般的でした。
攻撃者は SQL インジェクションを使用して以下を引き起こす可能性があります。
- データベース内の情報の変更または削除によるWeb アプリケーションのエラー。
- ハッカーがデータベースに保存されている個人情報、財務記録、パスワードなどの機密データに不正にアクセスすると、データ侵害が発生します。
- 同じ共有データベースを使用する追加の無許可システムにアクセスすることにより、システムが侵害される。 これにより、攻撃者は同じネットワーク上の他のシステムに攻撃を拡大したり、分散型サービス拒否 (DDoS) を実行したりすることが可能になります。
これらの破壊的な行為は、ビジネスに取り返しのつかない損害を与えます。 これらの犯罪はプライバシーとデータの完全性を侵害し、顧客の信頼とビジネスの評判の損失につながります。 また、余波に対処する企業にとっては経済的負担も増大する。
実際の SQL インジェクション攻撃の例
SQL インジェクションが初めて登場してから 20 年以上が経過しました。 20 年経った今でも、次のような著名な SQL インジェクション インシデントが証明しているように、悪名は依然として残っています。
- Heartland Payments Systems: 2008 年、Heartland Payments Systems は、SQLi 攻撃を通じて 1 億 3,000 万件を超えるクレジット カードおよびデビット カードの詳細が流出するという史上最大のデータ侵害に見舞われました。 ハートランドは数百万ドルの罰金を支払った。
- Yahoo : 2012 年、SQL インジェクション攻撃により、電子メール アドレスやパスワードを含む 500 万近くの Yahoo ユーザーのアカウント詳細が侵害されました。
- Freepik:2020年、ハッカーは同社のFlaticon Webサイトに対するSQLインジェクション攻撃中に、830万人のFreepikとFlaticonユーザーの電子メールとパスワードを盗みました。
- WooCommerce: 人気の WordPress プラグインは、500 万のサイトをデータ盗難の危険にさらした SQL インジェクションの脆弱性を修正しました。
- BillQuick: サイバー犯罪者は、人気のある課金プラットフォームのブラインド SQL の脆弱性を悪用して、ランサムウェアを拡散させました。
- MOVEit: 2023 年 5 月、Cl0p ランサムウェア ギャングは、マネージド ファイル転送ソフトウェア ツール MOVEit の SQL インジェクションの脆弱性を悪用し、1,000 を超える組織と少なくとも 6,000 万人の個人に影響を与え、これまでのところ今年最大のデータ侵害となりました。
SQL インジェクション攻撃はどのように機能するのでしょうか?
最新の Web アプリケーションで使用されるデータベースと SQL クエリの基本を見てみましょう。 これは、SQL インジェクションの内部動作をより深く理解するのに役立ちます。
すべての Web サイトは、SQL データベースとも呼ばれるリレーショナル データベースを使用して、ユーザーとアプリに関するデータを保存します。 それは、ユーザー情報、ログイン資格情報、支払い情報、または会社に関するその他の情報である可能性があります。 たとえば、電子商取引ウェブサイトを考えてみましょう。 製品データ、ユーザー アカウント、注文データ、支払い情報をデータベースに保存します。
その後、Web サイトはこれらのデータベースからデータを取得し、ユーザーに固有のコンテンツやサービスを配信します。 このプロセスは、データベースの管理に使用される標準化されたプログラミング言語である SQL のおかげで行われます。 アプリから何か (購入履歴など) を取得する必要があるときは、実際には SQL クエリ (データベースに特定のアクションの実行を指示するコマンド) を使用してデータベースにリクエストを行っていることになります。
Web 対話をシームレスにするために、多くの Web サイトではユーザーがデータを入力して SQL クエリを作成できるようにしています。 これには、検索語、ユーザー名、支払いの詳細などが含まれる場合があります。
電子商取引 Web サイトの例を考えてみましょう。 「orders」テーブル (o) と「products」テーブル (p) を使用してデータベースから注文履歴を表示する単純な SQL クエリは次のようになります。
SELECT o.order_id、o.order_date、p.product_name、p.price
注文から o
製品を結合する p ON o.product_id = p.product_id
WHERE o.user_id = 12345;
この SQL コードは、Web サイト データベースの USER ID 12345 の製品テーブルから製品名と価格とともに、注文テーブルから注文 ID と日付を取得します。 通常、ID はユーザーからの入力に基づきます。 入力が適切にチェックおよび制御されていない場合、問題が発生します。 攻撃者はこの脆弱性を悪用して SQL インジェクション攻撃を実行します。
通常は次のように展開します。
- 脆弱な入力フィールドの特定:攻撃者は、悪意のあるコードを挿入できる可能性がある Web アプリケーション上の入力フィールドを見つけることから始めます。 彼らはさまざまな値を送信し、アプリがどのように応答するかを確認します。 かどうかを調べます。 アプリケーションがユーザー入力を適切に検証またはサニタイズしない場合、アプリケーションは入力を SQL コードとして処理します。 この潜在的な脆弱性はコードインジェクションに使用されます。
- ユーザー入力によるコード インジェクション:攻撃者は、アプリケーションが入力をどのように処理するかを理解した後、脆弱性を利用する悪意のある SQL コードであるペイロードを構築します。 これには、一重引用符 (')、二重引用符 (")、等号 (=) などの SQL 制御文字を追加して SQL クエリ構造を変更することが含まれます。 これらの制御文字を SELECT や FROM などの一般的な SQL コマンドで使用すると、攻撃者はデータベース サーバーにアクセスしたり、データベース サーバーからデータを取得したりできます。
次に、特別に作成された入力を正当なリクエストとともに送信し、アプリケーションを騙して、怪しいコードをクエリの正当な部分として処理させます。 - 実行:データベースは攻撃を認識せず、クエリを処理し、挿入されたコードを正当なリクエストであるかのように実行します。
- 悪用:攻撃者の意図に応じて、挿入された SQL コードにより機密データの取得、情報の変更または削除、さらには不正アクセスの許可が行われる可能性があります。 これによりアプリケーションのセキュリティが侵害され、機密情報が漏洩する可能性があります。
SQLインジェクションの例
次のような、URL パラメーターを使用して製品 ID に基づいて製品の詳細を取得する Web アプリケーションを考えてみましょう。
http://example.com/products?id=1
攻撃者は、悪意のある SQL コードを挿入してエラーを引き起こし、次のような情報を取得しようとする可能性があります。 http://example.com/products?id=1' OR 1=1; –
アプリケーションがユーザー入力を適切に検証およびサニタイズできない場合、SQL クエリは次のように操作される可能性があります。
SELECT * FROM products WHERE OR 1=1; - - ';
この場合、元のクエリは ID 1 の製品を取得するように設計されていますが、攻撃者の入力により、1=1 と二重ハイフン (- -) が追加されたため、すべての製品を返すようにクエリが変更されます。 これにより、元の終了一重引用符が無効になり、すべての製品の詳細が表示されたり、攻撃者が悪用できるエラー メッセージが明らかになったりします。
33%
2022 年に発生した Web アプリケーションの重大な脆弱性のうち、SQL インジェクションが原因であったもの。
出典: 統計局
SQL の脆弱性が広く蔓延していることと、ビジネスクリティカルなデータがすべて含まれる Web アプリ データベースの魅力により、SQL インジェクションは最も持続的なサイバー攻撃の 1 つとなっています。
出典:スパイスワークス
SQL インジェクション攻撃の種類
SQL インジェクション攻撃には、攻撃者が情報を取得する方法やデータベースと対話する方法に基づいて、次の 3 つの主要なタイプがあります。
- クラシックまたはインバンド SQLi
- ブラインドまたは推論 SQLi
- アウトオブザバンド SQLi
1. クラシックまたはインバンド SQLi
インバンドは、SQL インジェクション攻撃の最も一般的なタイプです。 古典的なハッカーは、同じ通信チャネル (インバンド) を使用して、悪意のある SQL コードを挿入し、結果を取得します。 インバンド SQLi の主なバリエーションは次の 2 つです。
ユニオンベースのインバンド SQLi
この攻撃は、2 つ以上の SELECT ステートメントの結果からのデータを結合するために使用される UNION SQL 演算子を利用します。 これを行うと、攻撃者は直接アクセスできないテーブルからデータを取得できます。
エラーベースのインバンド SQLi
この手法では、攻撃者は SQL クエリで意図的にエラーを引き起こし、データベースから返されたエラー メッセージを悪用します。 エラーによって、データベース構造、テーブル名、列名、さらにはデータ自体に関する貴重な情報が明らかになる可能性があります。 エラーベースの SQLi は、アウトオブザバンド SQLi として実行することもできます。
2. 推論 (ブラインド) SQLi
ブラインド SQLi では、攻撃者は攻撃の結果を直接見ることができません。 代わりに、クエリに応答するアプリケーションの動作やエラー メッセージを観察することで情報を推測します。 このタイプの攻撃は、ハッカーが悪用できる潜在的な脆弱性を見つけるために一連の SQL クエリを作成する必要があるため、時間がかかります。 ブラインド SQLi には次の 2 つのバリエーションがあります。
時間ベースのブラインド SQLi
ここで、攻撃者は、データベースが反応する前に応答を遅らせるクエリを実行します。 応答時間に注意してデータベースに関する情報を推測します。
ブール型ブラインド SQLi
ブール ブラインド SQLi の場合、攻撃者はアプリケーションが SQL クエリ内の true または false 条件に応答する方法を利用します。 Web アプリケーションは、データベースからデータが返されない場合でも、応答に基づいてデータベースに関する情報を推測します。
3. アウトオブザバンド SQLi
アウトオブザバンド SQLi 攻撃により、アプリケーションはハッカーが制御するリモート エンドポイントにデータを送信します。 このような攻撃では、SQL サーバーに、ハイパーテキスト転送プロトコル (HTTP) 要求などの外部ネットワーク要求を開始できるなどの特定の機能が必要です。
SQL インジェクション攻撃を防ぐ方法: チートシート
SQL インジェクションを防止するには、安全なコーディングの実践と継続的な監視を含む多層アプローチが必要です。 SQL インジェクション攻撃から身を守るために重要な手順を記載したチートシートを次に示します。
準備されたステートメントを使用する
SQL インジェクション攻撃に対する主な防御策は、パラメータ化されたクエリを含むプリペアド ステートメントです。 プリペアド ステートメントを使用すると、ユーザー入力が実行可能コードではなくデータとして扱われることが保証されます。
開発者は、クエリ用の SQL コードを、ユーザーからの入力値のプレースホルダーを含むテンプレートとして事前にコンパイルします。 クエリの実行時に、準備されたステートメントはプレースホルダーではなく実際の値をバインドします。 これにより、悪意のあるコードの実行が阻止されます。
準備されたステートメントは、動的 SQL ステートメントよりも優先されます。 実行中に SQL クエリを作成するため、インジェクション攻撃に対して脆弱になります。
一般的なプログラミング言語のプリペアドステートメント:
一般的なデータベース プログラミングでプリペアド ステートメント (パラメーター化されたクエリ) を使用する場合の言語固有の推奨事項を次に示します。
- Java Enterprise Edition (EE): java.sql パッケージのPreparedStatementクラスを使用します。 setString 、 setIntなどのメソッドを使用してパラメータをバインドします。
- Python (SQLite3) : クエリでプレースホルダー ( ? ) を使用します。 タプルまたはリストを使用してパラメータをバインドします。
- PHP: PHP データ オブジェクト (PDO)拡張機能を使用します。 プレースホルダー (:) を使用して準備済みステートメントを使用します。 パラメータをbindValueまたはbindParamでバインドします。
- .NET : MySqlCommandオブジェクトを使用します。 Parameters.AddWithValueを使用してパラメータをバインドします。
もう 1 つの SQL インジェクション防止方法は、ストアド プロシージャ、または何度でも使用できるプリコンパイルされた SQL コードのグループを使用することです。
入力検証を練習する
入力検証には、処理前にユーザー入力をチェックして特定の基準を満たしていることを確認することが含まれます。 ホワイト リストとも呼ばれる許可リストは、入力検証の重要な側面です。 ここでは、事前定義された安全な値またはパターンのみが SQL クエリの一部として受け入れられます。 設定された基準に一致しない入力は拒否されます。 これにより、悪性または予期しない入力がシステムに侵入するのを積極的に防ぎます。
オブジェクト リレーショナル マッピング ライブラリを使用する
オブジェクト リレーショナル マッピング (ORM) ライブラリは、リレーショナル データベースを使用する開発者にとって貴重なツールです。 これにより、開発者は好みのプログラミング言語を使用してデータベースと対話できるため、生の SQL クエリを作成する必要性が減ります。 ORM ライブラリは、SQL インジェクション攻撃に対する組み込みの保護を提供します。
安全なコーディングの実践について開発者と IT チームをトレーニングします。 定期的なセキュリティ監査と侵入テストを必ず実行して、脆弱性を見つけてください。
ヒント:セキュア コード トレーニング ツールを使用すると、プログラマーや開発者がセキュア コーディングをより迅速に学習できるようになります。
最小特権の原則を適用する
最小特権の原則では、データベース ユーザーに、ジョブを実行するために必要な最小限の権限のみが与えられます。 この原則に従うことで、潜在的な SQL インジェクション攻撃やあらゆるサイバー攻撃の影響が軽減されます。 また、データベースに厳密なアクセス制御を適用します。
Web アプリケーション ファイアウォール (WAF) を導入する
WAF は、アプリケーションの受信ネットワーク トラフィックを監視し、既知の攻撃シグネチャのリストに基づいて潜在的な悪意のあるトラフィックをブロックします。
上位 5 つの Web アプリケーション ファイアウォール (WAF) ツール:
- Azure Web アプリケーション ファイアウォール
- AWS WAF
- Imperva Web アプリケーション ファイアウォール (WAF)
- クラウドフレアスペクトル
- Symantec Web アプリケーション ファイアウォールとリバース プロキシ
*上記は、G2 の 2023 年夏のグリッド レポートからの 5 つの主要な WAF ソリューションです。
WAF は、事前定義されたルールを採用して、SQL キーワードや悪意のあるペイロードなど、受信トラフィック内の疑わしいパターンや異常を検出します。 ユーザー入力をサニタイズおよび検証し、有害なリクエストをブロックまたはフィルターで除外します。 これは、システムに侵入する危険な SQL クエリを阻止するのに役立ちます。
最新の WAF は、機械学習を使用して新しい攻撃手法に適応します。
SQL インジェクション攻撃を防ぐその他のセキュリティ ツール
WAF に加えて、他のいくつかのセキュリティ プラットフォームが SQL インジェクション攻撃を阻止します。
- 脆弱性スキャナーは、Web アプリケーションの既知および未知の脆弱性を探します。
- 静的アプリケーション セキュリティ テスト (SAST) ツールと静的コード分析ソフトウェアは、実際にコードを実行せずにセキュリティの脆弱性を検出します。
- 動的アプリケーション セキュリティ テスト ソフトウェアは、実行中のアプリケーションに対する攻撃をシミュレートし、弱点を特定します。
- 侵入検知および防御システムとデジタル フォレンジック ソフトウェアは、アプリケーションの異常や攻撃をリアルタイムで調査します。
データの要塞を守る
SQL インジェクション攻撃は、Web アプリのセキュリティに重大な脅威をもたらします。 企業は、攻撃が成功した場合、貴重なデータ、ユーザーのプライバシー、評判を失うリスクがあります。
SQL インジェクションに対する絶対的な安全性を保証する単一のソリューションはありませんが、ここで説明した予防措置を組み合わせると、攻撃の可能性が大幅に減少します。 Web 開発者とデータベース管理者は、厳重な防御を採用し、潜在的な悪用に対して Web アプリを強化する必要があります。
ウェブサイトを保護するための包括的なソリューションが必要ですか? Web セキュリティ ソフトウェアと、それがデータ侵害につながるサイバー攻撃に対してどのように役立つかを調べます。