SQL インジェクション
SQL インジェクション とは何ですか?
SQL インジェクション攻撃者が制御する SQL をデータベースクエリに混入させ、データの読み取り・改ざん・破壊を可能にするコードインジェクション攻撃。
SQL インジェクション(SQLi)は、パラメータ化クエリを用いる代わりに、信頼できない入力を SQL 文に連結しているアプリケーションを悪用します。攻撃者はクォート・コメント・UNION 句を差し込むことで、意図されたクエリを書き換え、テーブルのダンプ、認証バイパス、権限昇格、データベースコマンドの実行を行います。バリエーションには、古典的なインバンド型、エラーベース型、ブラインドのブール/時間ベース型(レスポンスや応答遅延からデータを 1 ビットずつ推測する)、そして保存された入力が後で再利用されたときに発火するセカンドオーダー型があります。
SQLi は数十年前から存在しますが、依然として壊滅的です。Progress MOVEit Transfer のゼロデイ SQL インジェクション脆弱性 CVE-2023-34362 は、2023 年 5 月下旬から Cl0p ランサムウェアグループによって悪用されました。認証されていない攻撃者が SQL を注入して LEMURLOOT Web シェルを展開し、データベースの内容を窃取した結果、波及して数千もの下流組織に影響が及びました。約 157,000 件の顧客記録が流出した 2015 年の TalkTalk 侵害も同様に、レガシーな Web ページに対する SQL インジェクションでした。SQLi は OWASP Top 10 の A03:2021(インジェクション)に位置づけられています。
主要な防御策はパラメータ化クエリ/プリペアドステートメントであり、コードとデータを分離することで、入力がクエリ構造を変えられないようにします。これに加えて、安全に利用された ORM フレームワーク、許可リスト方式の入力検証、最小権限のデータベースアカウント(アプリのログインに DBA 権限を与えない)、ストアドプロシージャの衛生管理、そして多層防御としての WAF で補強します。手動エスケープのみに頼るのは脆弱であり、推奨されません。
flowchart TD
U["信頼できない入力"] --> C{"クエリはどう構築されるか?"}
C -->|"文字列連結"| I["' OR 1=1 -- が SQL に注入される"]
I --> DB[("データベースが攻撃者の SQL を実行")]
DB --> X["データダンプ / 認証バイパス"]
C -->|"パラメータ化クエリ"| S["入力はコードではなくデータとしてバインド"]
S --> OK["クエリ構造が保持される — 安全"]● 例
- 01
ログインフォームで ' OR '1'='1 を入力すると最初のユーザー行が返り、認証が回避される。
- 02
レポート用エンドポイントで細工されたパラメータが UNION SELECT を発火させ、パスワードハッシュが流出する。
● よくある質問
SQL インジェクション とは何ですか?
攻撃者が制御する SQL をデータベースクエリに混入させ、データの読み取り・改ざん・破壊を可能にするコードインジェクション攻撃。 サイバーセキュリティの 攻撃と脅威 カテゴリに属します。
SQL インジェクション とはどういう意味ですか?
攻撃者が制御する SQL をデータベースクエリに混入させ、データの読み取り・改ざん・破壊を可能にするコードインジェクション攻撃。
SQL インジェクション からどのように防御しますか?
SQL インジェクション に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
SQL インジェクション の別名は何ですか?
一般的な別名: SQLi。