Webアプリケーション攻撃

SQLインジェクション えすきゅーえるいんじぇくしょん

SQLデータベース不正アクセス脆弱性Webセキュリティエスケープ処理
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インジェクション:脆弱なコード vs 安全なコード ❌ 脆弱なコード(文字列結合) $name = $_GET['name']; $sql = "SELECT * FROM users WHERE name='" . $name . "'"; ⬇ 問題点 入力値をそのままSQL文に 連結しているため、 SQL構造を書き換えられてしまう ✅ 安全なコード(プレースホルダ) $name = $_GET['name']; $stmt = $pdo->prepare( "SELECT * FROM users WHERE name = ?" ); $stmt->execute([$name]); ⬇ ポイント 「?」が入力値を受け取る枠として 機能し、SQL命令として 解釈されることを防ぐ 比較

主な対策一覧

対策内容有効度
プレースホルダ(バインド変数SQL文と入力値を分離して処理。最も確実な根本対策◎ 最重要
エスケープ処理' などSQL特殊文字を無害化する。プレースホルダの補助として
WAF(Webアプリケーションファイアウォール不審なSQL文パターンを通信レベルで検知・遮断○ 補完的
最小権限の原則DBユーザーに必要最低限の権限のみ付与し、被害を限定
入力バリデーション数値項目には数値のみ受け付けるなど、形式チェック△ 補助的
エラーメッセージの非表示DBのエラー内容を画面に出さない(攻撃のヒントを与えない)

関連する規格・RFC

規格・ガイドライン内容
OWASP Top 10Webアプリの重大脆弱性ランキング。SQLiは長年上位
CWE-89SQLインジェクションの共通脆弱性識別番号
IPA「安全なWebサイトの作り方」経産省傘下IPAによる開発者向け対策ガイド(日本語)
PCI DSSクレジットカード業界のセキュリティ基準。SQLi対策を明示的に要求

関連用語