SQLインジェクション えすきゅーえるいんじぇくしょん
簡単に言うとこんな感じ!
ログインフォームとかに「普通の文字」の代わりに「データベースへの命令文」を入力して、システムを乗っ取っちゃう攻撃だよ!鍵のかかったドアに「合言葉を入力して」と言われたとき、合言葉の代わりに「ドアを開けろという命令書」をねじ込むイメージ。世界中で被害が絶えない超メジャーな攻撃手法なんだ!
SQLインジェクションとは
**SQLインジェクション(SQL Injection)とは、Webアプリケーションのデータベース問い合わせに対して、悪意あるSQL文(データベースへの命令文)**を不正に「注入(インジェクション)」することで、データの盗み出し・改ざん・削除、あるいはシステムの不正操作を引き起こす攻撃手法です。
仕組みとしては、ログインフォームや検索ボックスに入力した文字列が、そのままSQL文に組み込まれてしまう「作りの甘いWebアプリ」を狙います。たとえばユーザーが入力した文字列を検証せずにSQL文に連結している場合、攻撃者はSQL文の構造そのものを書き換えることができてしまいます。
OWASP(Open Web Application Security Project)が毎年発表する「Webアプリ脆弱性ランキング」で長年トップクラスを占めており、個人情報流出・サービス停止・不正ログインなど、実際の大規模インシデントで繰り返し使われてきた代表的な攻撃です。発注者・管理者の立場でも「この開発会社はSQLインジェクション対策をしているか?」を確認することが重要です。
攻撃の仕組みと代表的な手口
攻撃の基本原理
ログインフォームを例に、実際の動きを見てみましょう。
通常のSQL文(開発者が想定していた動き):
SELECT * FROM users
WHERE username = '入力された名前'
AND password = '入力されたパスワード';
攻撃者がユーザー名に ' OR '1'='1 と入力すると……
SELECT * FROM users
WHERE username = '' OR '1'='1'
AND password = '';
'1'='1' は常に「真」なので、パスワードなしで全ユーザー情報が取得できてしまいます。
代表的な攻撃パターン
| 種類 | 概要 | 主な被害 |
|---|---|---|
| クラシックSQLi | エラーや結果をそのまま画面に出力させる | データ盗取 |
| ブラインドSQLi | 真偽の差異(応答時間・表示の違い)から情報を推測 | データ盗取 |
| UNIONベース攻撃 | UNION句で別テーブルの情報を連結して取得 | 個人情報流出 |
| スタック型 | セミコロンで複数命令を連続実行 | データ削除・改ざん |
| 時間ベースブラインド | SLEEP()などで応答遅延を起こし情報を推測 | データ盗取 |
覚え方
「SQL注射」=フォームに毒を注射される! 「インジェクション=注射・注入」と覚えれば、「入力欄から悪い命令を注入される攻撃」とイメージしやすいよ。
歴史と背景
- 1998年 — セキュリティ研究者 Jeff Forristal(Rain Forest Puppy)がSQLインジェクションを技術文書で初めて体系的に公開
- 2002年頃〜 — Webアプリケーションの普及とともに被害が急増。PHPやASPで動くサイトが相次いで被害を受ける
- 2005〜2008年 — 国内でも大手ECサイトやゲームサービスで大規模な顧客情報流出事件が多発
- 2013年 — OWASPが「OWASP Top 10」を公開し、SQLインジェクションが第1位に。業界全体での啓発が本格化
- 2017〜現在 — 対策が普及した一方、古いシステムやメンテナンス不足のサイトへの攻撃は継続中。標的型攻撃の足がかりとしても使われる
対策と脆弱なコードの比較
SQLインジェクションへの対策は「入力をそのままSQL文に混ぜない」ことが大原則です。
主な対策一覧
| 対策 | 内容 | 有効度 |
|---|---|---|
| プレースホルダ(バインド変数) | SQL文と入力値を分離して処理。最も確実な根本対策 | ◎ 最重要 |
| エスケープ処理 | ' などSQL特殊文字を無害化する。プレースホルダの補助として | ○ |
| WAF(Webアプリケーションファイアウォール) | 不審なSQL文パターンを通信レベルで検知・遮断 | ○ 補完的 |
| 最小権限の原則 | DBユーザーに必要最低限の権限のみ付与し、被害を限定 | ○ |
| 入力バリデーション | 数値項目には数値のみ受け付けるなど、形式チェック | △ 補助的 |
| エラーメッセージの非表示 | DBのエラー内容を画面に出さない(攻撃のヒントを与えない) | △ |
関連する規格・RFC
| 規格・ガイドライン | 内容 |
|---|---|
| OWASP Top 10 | Webアプリの重大脆弱性ランキング。SQLiは長年上位 |
| CWE-89 | SQLインジェクションの共通脆弱性識別番号 |
| IPA「安全なWebサイトの作り方」 | 経産省傘下IPAによる開発者向け対策ガイド(日本語) |
| PCI DSS | クレジットカード業界のセキュリティ基準。SQLi対策を明示的に要求 |
関連用語
- XSS(クロスサイトスクリプティング) — SQLiと並ぶWebアプリ二大攻撃。こちらはJavaScriptを注入する
- WAF(Webアプリケーションファイアウォール) — SQLiなどのWebアプリ攻撃を検知・遮断する防御装置
- OWASP — Webセキュリティの脆弱性をまとめた国際的な非営利団体
- 脆弱性診断 — SQLiなどの弱点がないかシステムを検査するサービス
- エスケープ処理 — 特殊文字を無害化してSQL注入を防ぐ基本技術
- 最小権限の原則 — 被害を限定するためにアクセス権を必要最小限に絞る考え方