flawopen.com/sql-injection/Kotlin

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

脆弱性の解説:SQL Injection in Kotlin

Learn how to fix SQL Injection (CWE-89) in Kotlin. Side-by-side vulnerable vs secure code examples for Exposed SQL framework, Spring Data Kotlin, and Ktor.

💡 わかりやすい解説 (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-kotlin.
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 user input
val query =
  "SELECT * FROM users WHERE id = $userId"
val cursor = db.rawQuery(query, null)
✓ 堅牢化されたセキュアパッチ
// value bound, never templated in
val cursor = db.rawQuery(
  "SELECT * FROM users WHERE id = ?",
  arrayOf(userId)
)

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

References