SQLインジェクション(SQLi)とは?
SQLインジェクション(SQLi)は、攻撃者が入力フィールドに悪意のあるSQL文を入力してデータベースを操作する攻撃の一種です。
この攻撃は、適切に検証やユーザー入力の処理を行わないアプリケーションを対象としており、パスワードやクレジットカードの詳細などの機密データへの不正アクセスを可能にします。
SQLインジェクションの仕組み
アプリケーションがユーザー入力を適切に検証せずにデータベースクエリに直接含めると、攻撃者はクエリの動作を変更して悪意のあるSQL文を入力することができます。
例えば:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
攻撃者は次のように入力することができます:
' OR '1'='1
結果として:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
これにより常にtrueが返され、不正アクセスが許可されます。
サイバーセキュリティにおけるSQLインジェクションの重要性
SQLインジェクションは、サイバーセキュリティにおいて最も危険で古い技術です。このタイプの攻撃は、常にOWASP Top 10にリストされています。
小さな脆弱性でも攻撃者に以下を許可します:
- データへのアクセス、変更、削除
- 認証の回避
- データベース上での管理操作の実行
- システム全体の侵害
一般的なSQLインジェクションの種類
- クラシックSQLi : ウェブフォームやURLパラメータを介した直接的なインジェクション。
- ブラインドSQLi : 攻撃者がエラーメッセージや応答時間を通じて間接的にデータベース情報を推測。
- ユニオンベースSQLi : UNION演算子を使用して複数のクエリの結果を結合。
- エラーベースSQLi : データベースのエラーメッセージに依存して情報を抽出。
- 時間ベースブラインドSQLi : サーバーの応答遅延を利用してクエリ結果を推測。
SQLインジェクションを防ぐ方法
1. パラメータ化クエリ(プリペアドステートメント)の使用
SQLコマンドがユーザー入力をデータとして扱い、実行可能なコードとして扱わないようにする。
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. 入力の検証とサニタイズ
ユーザーからのすべての入力を検証し、期待される文字のみを許可する。
3. ORMフレームワークの使用
PrismaやHibernateなどのフレームワークは、直接的なSQLの取り扱いを減少させる。
4. 最小特権の原則
ユーザーの権限を制限し、必要な権限のみを与える。
5. 定期的なセキュリティテスト
アプリケーションセキュリティテストツールを使用して、SAST、DAST、またはIASTのようなツールを使用して、インジェクションの欠陥を早期に検出します。
現実世界での例
あるオンラインストアのウェブサイトが侵害され、攻撃者がログインフォームでSQLインジェクションを使用してデータベースからクレジットカードの詳細を抽出しました。
関連用語
- XSS(クロスサイトスクリプティング)
- DAST(動的アプリケーションセキュリティテスト)
- OWASP Top 10
- アプリケーションセキュリティテスト