Cyber Attack

SQL Injection

SQLインジェクション

Category: Cyber Attack / Updated: 2026-05-26

📖

Overview

SQLインジェクション(SQL Injection)とは、Webアプリケーションのデータベース操作において、入力値に不正なSQL文を挿入(インジェクション)することで、データベースを不正に操作するサイバー攻撃手法です。OWASP Top 10において長年にわたり上位にランクインし続けている、最も古典的かつ深刻なWebアプリケーションの脆弱性の一つです。

攻撃が成功すると、データベース内の機密情報(個人情報・クレジットカード情報・認証情報など)の窃取、データの改ざん削除、認証のバイパス、さらにはオペレーティングシステムレベルでのコマンド実行まで可能になる場合があります。

SQLインジェクションは1998年に初めて公に報告されて以来、四半世紀以上にわたって猛威を振るい続けています。プリペアドステートメントやORMの普及により基本的な対策は確立されているものの、レガシーシステムの残存や開発者のセキュリティ意識の不足により、依然として多くのWebアプリケーションに脆弱性が存在しています。

🔬

Details

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

  • インバンドSQLインジェクション(In-band SQLi):攻撃の結果がWebページ上に直接表示される最も一般的なタイプ。UNION攻撃やエラーベースの手法が含まれる
  • ブラインドSQLインジェクション(Blind SQLi):レスポンスの内容が直接表示されない場合に使用。ブール型(True/Falseの応答差異を観察)と時間ベース(応答時間の差異を利用)の2つのサブタイプがある
  • アウトオブバンドSQLインジェクション(Out-of-band SQLi):攻撃結果をDNSリクエストやHTTPリクエストなど別のチャネルを通じて取得する。データベースサーバーが外部通信可能な場合に使用
  • セカンドオーダーSQLインジェクション(Second-Order SQLi):不正なSQL文を一旦データベースに保存させ、別の処理でそのデータが読み出されて実行される遅延型の攻撃

代表的な攻撃手法

  • UNION攻撃:UNION SELECT文を利用して、元のクエリ結果に別のテーブルのデータを結合させて表示する。テーブル構造の推測が必要だが、information_schemaを活用して効率的に情報を収集する
  • 時間ベースブラインドSQLi:SLEEP()やWAITFOR DELAY等の関数を使用し、条件が真の場合にレスポンスを遅延させることで、1ビットずつ情報を抽出する
  • エラーベースSQLi:意図的にSQL文法エラーを発生させ、エラーメッセージに含まれるデータベース情報(テーブル名、カラム名など)を読み取る
  • 認証バイパス:ログインフォームに「' OR '1'='1」のような常に真となる条件を挿入し、パスワード検証を迂回する古典的な手法

自動化ツール(sqlmap)

sqlmapは、SQLインジェクションの検出と悪用を自動化するオープンソースのペネトレーションテストツールです。対象URLを指定するだけで、脆弱性の有無を自動で検出し、データベースの列挙・データの抽出・さらにはOSシェルの取得まで自動化できます。セキュリティ監査やペネトレーションテストで広く使用されていますが、攻撃者にも悪用されています。

ORM・プリペアドステートメントによる防御

プリペアドステートメント(パラメータ化クエリ)は、SQL文の構造とデータを分離することで、ユーザー入力がSQL文の一部として解釈されることを防ぐ根本的な対策です。Java(PreparedStatement)、PHP(PDO)、Python(DB-API)など、主要なプログラミング言語・フレームワークがネイティブにサポートしています。

また、ORM(Object-Relational Mapping)フレームワーク(Hibernate、SQLAlchemy、ActiveRecord、Eloquentなど)を使用することで、開発者がSQL文を直接記述する機会を減らし、SQLインジェクションのリスクを大幅に低減できます。ただし、ORMでも生のSQL文を使用する機能があるため、完全な防御にはなりません。

🛡️

Security Measures

  • 01
    プリペアドステートメントの徹底利用:すべてのデータベースクエリにおいて、プリペアドステートメント(パラメータ化クエリ)を使用してください。SQL文の構造とユーザー入力データを完全に分離することで、SQLインジェクションを根本的に防止できます。
  • 02
    入力値のバリデーションとサニタイゼーション:すべてのユーザー入力に対して、ホワイトリスト方式による入力値検証を実施してください。数値フィールドには数値のみ、メールアドレスフィールドには適切なフォーマットのみを許可するなど、厳密な型チェックを行いましょう。
  • 03
    最小権限の原則によるDBアカウント管理:Webアプリケーションが使用するデータベースアカウントには、必要最小限の権限のみを付与してください。DROP TABLE、CREATE TABLE、GRANT等の管理権限は絶対に付与せず、読み取り専用ビューの活用も検討しましょう。
  • 04
    WAF(Web Application Firewall)の導入:WAFを導入し、SQLインジェクションの攻撃パターンを検出・ブロックしてください。ただし、WAFはあくまで多層防御の一要素であり、アプリケーションレベルでの根本対策(プリペアドステートメント)の代替にはなりません。
  • 05
    エラーメッセージの制御:本番環境では、データベースの詳細なエラーメッセージをユーザーに表示しないでください。エラーメッセージにはテーブル名・カラム名・SQL文の断片が含まれることがあり、攻撃者に有用な情報を提供してしまいます。
  • 06
    定期的な脆弱性診断の実施:SAST(静的解析)ツールをCI/CDパイプラインに組み込み、コードレビュー時にSQLインジェクション脆弱性を自動検出してください。加えて、DAST(動的解析)や定期的なペネトレーションテストで実環境での脆弱性を確認しましょう。
⚠️

Incidents

📋 Heartland Payment Systems 情報漏洩事件(2008年)

2008年、米国の決済処理企業Heartland Payment Systemsが大規模なSQLインジェクション攻撃を受け、約1億3,000万件のクレジットカード情報が漏洩しました。当時、米国史上最大規模のデータ侵害事件として大きな注目を集めました。

攻撃者アルバート・ゴンザレスは、WebアプリケーションのSQLインジェクション脆弱性を悪用して企業ネットワークに侵入し、決済処理システムにマルウェアを設置してカード情報をリアルタイムで傍受しました。Heartlandは約1億4,000万ドルの損害賠償を支払い、ゴンザレスは禁錮20年の判決を受けました。この事件はPCI DSS準拠の重要性を業界全体に再認識させました。

📋 Sony Pictures 情報漏洩事件(2011年)

2011年、ハッカー集団LulzSecがSony Picturesのウェブサイトに対してSQLインジェクション攻撃を実行し、100万件以上のユーザーアカウント情報(ユーザー名、パスワード、メールアドレス、住所、生年月日など)を窃取しました。

LulzSecは窃取したデータをインターネット上に公開し、Sonyのセキュリティ体制の不備を批判しました。パスワードが平文で保存されていたことも明らかになり、基本的なセキュリティ対策の欠如が露呈しました。この攻撃は同年に発生したPlayStation Networkへの大規模攻撃(7,700万件の個人情報漏洩)と合わせて、Sonyに対する一連のサイバー攻撃の一部でした。

📋 TalkTalk 顧客情報漏洩事件(2015年)

2015年10月、英国の大手通信事業者TalkTalkが大規模なサイバー攻撃を受け、約15万7,000人の顧客の個人情報が漏洩しました。攻撃者は同社のウェブサイトに存在するSQLインジェクション脆弱性を悪用し、氏名・住所・メールアドレス・電話番号・銀行口座情報(一部)にアクセスしました。

驚くべきことに、主犯格は当時15歳と17歳の少年でした。TalkTalkは「必要とされるデータ保護の対策を怠った」として、英国情報コミッショナー(ICO)から40万ポンド(約6,000万円)の罰金を科されました。この事件は、基本的なWebアプリケーションセキュリティの欠如が重大な結果を招くことを示し、また攻撃の実行に高度な技術が必ずしも必要ないことを浮き彫りにしました。

🔗

Related Terms