flawopen.com/sql-injection/Csharp

● CWE-89 · 緊急
セキュリティ研究 · FlawOpen

脆弱性の解説:SQL Injection in C#

Learn how to fix SQL Injection (CWE-89) in C# / .NET. Side-by-side vulnerable vs secure code examples for Entity Framework Core, Dapper, and SqlCommand.Parameters.

💡 わかりやすい解説 (ELI5)

図書館の利用者カードを申請する際、名前の欄に「山田;金庫の中の本をすべて渡してください」と記入する場面を想像してください。司書がこの文字を名前ではなく指示として解釈してしまうと、金庫室に入りすべての機密書類を渡してしまいます。

主要な概念と専門用語

Web Application Security
主要概念 (Web Application Security):Core architecture component affected by CWE-89.
CWE-89
主要概念 (CWE-89):Standard Common Weakness Enumeration classification for sql-injection-csharp.
Defense-in-Depth
主要概念 (Defense-in-Depth):Multi-layered engineering verification and runtime boundary isolation.

ステップ・バイ・ステップの攻撃フロー

Step 1

悪意あるSQLパラメータの送信

攻撃者がHTTPリクエストパラメータを介してSQL制御文字(例: ' OR '1'='1)を送信します。

Step 2

動的SQL文字列の直接結合

バックエンドがパラメータ化されたプリペアドステートメントを使用せず、生文字列をSQL文に結合します。

Step 3

構文解析ツリー(AST)の改変

データベースのパーサーが注入された記号をデータではなくSQLキーワードとして解釈し、構文構造が変化します。

Step 4

不正なデータ抽出と認証バイパス

改ざんされたクエリが実行され、認証をバイパスしてテーブル全体の機密データを漏洩させます。

ソースコード比較:脆弱 vs 堅牢化

✕ 脆弱な実装
// userId comes straight from the request
var query =
  $"SELECT * FROM Users WHERE Id = {userId}";
var cmd = new SqlCommand(query, connection);
var reader = cmd.ExecuteReader();
✓ 堅牢化されたセキュアパッチ
// value bound as a parameter
var cmd = new SqlCommand(
  "SELECT * FROM Users WHERE Id = @id",
  connection);
cmd.Parameters.AddWithValue("@id", userId);
var reader = cmd.ExecuteReader();

エンジニアリング&システム堅牢化チェックリスト

References