見えるセキュリティ
SQLインジェクション
SQL INJECTION
この概念とは?
SQLインジェクションとは、入力された文字列をWebアプリが適切に分離せずSQL文へ組み込むことで、その入力の一部がSQLの命令として解釈されてしまう脆弱性です。攻撃者は入力を細工することで、本来とは異なるSQLを実行させ、データの閲覧・変更や認証の回避などを引き起こす場合があります。
利用者の入力が、SQLへ渡す値として扱われるか、SQL文そのものの構造を変える命令として扱われるか。その境界を、問い合わせの組み立て方で比較します。
- THEME
- web-vuln
- KIND
- attack
- REVIEW
- self-reviewed ·
利用者入力がSQL文の構造へ混ざる流れ
入力値の内容ではなく、SQLの構造と入力値の境界がどこで失われるかに注目します。
- 現在のSTEP
攻撃者
SQLとして意味を持ち得る入力を送る
持ち物
- SQLとして意味を持ち得る入力
Webアプリ
入力を使ってSQL文を組み立てる
持ち物
—
データベース
受け取ったSQL文を解釈する
持ち物
—
1. 細工された入力を用意する
攻撃者が、SQL文へ直接連結された場合に問い合わせ構造へ影響し得る入力を用意します。
STEP 1 / 5: 細工された入力を用意する
この概念の要点
要点
問題は記号そのものではない
特定の記号が存在するだけでSQLインジェクションになるのではありません。利用者入力がSQLの固定構造へ直接組み込まれ、命令と値の境界が崩れることが問題です。
注意
入力がSQL構造へ影響する
文字列連結でSQL文を組み立てると、入力がSQLへ渡す値ではなくSQL構文の一部として解釈される可能性があります。
理解確認
参考資料
- IPA安全なウェブサイトの作り方 - 1.1 SQLインジェクション
SQLインジェクションの仕組みと対策
- OWASPSQL Injection Prevention Cheat Sheet
パラメータ化された問い合わせを中心とした防御
- CWECWE-89: SQLインジェクション
CWE-89CWE-89の日本語分類とSQLインジェクションの定義