画面に何も出ないから大丈夫?「ブラインドSQLインジェクション」という見えない泥棒の話
こんにちは。セキュリティの現場に長くいると、「エラーメッセージを消しておけば攻撃されない」と信じているエンジニアに時々出会います。確かに、画面に「SQL Syntax Error」なんて出れば、泥棒(攻撃者)にヒントを与えているようなものですから、それを隠すのは鉄則です。
でも、家の鍵をかけただけで「うちは絶対に安全だ」と言えるでしょうか? 泥棒は、鍵を壊さなくても、家の中の物音や明かりの消えるタイミングを外から観察して、留守かどうかを判断するかもしれません。
WEBの世界にも、そんな「音」や「光」を頼りに、画面にエラーが出ない環境からデータを盗み出す「ブラインドSQLインジェクション」という攻撃手法が存在します。今日は、その仕組みと、どうやって身を守ればいいのかを、一緒に紐解いていきましょう。
—
1. 「ブラインド」攻撃の仕組み:泥棒は「音」を聞いている
通常のSQLインジェクションは、WEBサイトが「パスワードが違います!」とか「データベースエラー!」といった具体的な情報を画面に出してくれるため、攻撃者にとって「答え合わせ」が簡単です。
しかし、最近のサイトはエラーメッセージを隠すのが当たり前になりました。そこで攻撃者が使うのが「ブラインド(盲目的な)」手法です。画面に何も表示されなくても、「時間」や「反応の有無」を頼りにデータを推測します。
例え話で考えてみよう
あなたが泥棒だとします。家の中には入れません。でも、「電気を1回パチパチさせたら『YES』、2回だったら『NO』」というルールを家主に植え付けたとします。
「お前の名前の1文字目は『A』か?」と外から問いかけ、電気が1回点滅すれば「YES」だと分かります。これを繰り返せば、名前も住所も、金庫の暗証番号だって、時間をかけて少しずつ盗み出せるわけです。
- 時間差攻撃(Time-based): 「もしデータが『A』なら、わざと処理を5秒待て(sleep)」と命令を送ります。画面に変化がなくても、5秒後にレスポンスが返ってくれば、そのデータは正解だと確信できるのです。
- 真偽値攻撃(Boolean-based): 「もしデータが『A』なら正常な画面を返せ、違えば真っ白なページを返せ」と命令します。ページの表示結果が少しでも変われば、それが答えのサインになります。
—
2. 攻撃はどうやって検知する?
現場で「もしかして攻撃されている?」と気づくためには、ログの観察が不可欠です。
- 異常なクエリの連続: 短時間に、同じURLに対して
sleep()やCASE WHENといった、人間が通常入力しないキーワードが大量に含まれるリクエストが送られていないか確認してください。 - レスポンスタイムの偏り: 特定のIPアドレスから、異常に時間がかかるリクエストが連続している場合、それは「時間差攻撃」の兆候です。
—
3. 「一歩ずつ」できる最強の防衛:プリペアドステートメント
さて、ここからが本題です。どうやって防げばいいのでしょうか?
一番の解決策は、「最初からSQLの命令文と、ユーザーの入力を混ぜないこと」です。これをプリペアドステートメント(準備された命令文)と呼びます。
悪い例(泥棒を招き入れているコード)
// ユーザーが入力した値を、そのままSQLの文字列に埋め込んでいる
// これだと「’ OR 1=1 –」なんて入力されたら、すべてが筒抜けです
$sql = “SELECT FROM users WHERE id = ” . $_GET[‘id’];
$db->query($sql);
良い例(鍵をかけるコード)
// SQLの骨組みだけを先にデータベースに送り、データは後から「値」として渡す
// これなら、入力値にどんな怪しい命令(’ OR 1=1 など)が含まれていても、
// 単なる「文字列」としてしか扱われません!
$stmt = $pdo->prepare(“SELECT FROM users WHERE id = :id”);
$stmt->execute([‘id’ => $_GET[‘id’]]); // データはここで安全に流し込む
$user = $stmt->fetch();
—
4. 最後に:セキュリティは「完璧」を目指さない
最後に、現場のエンジニアとしてアドバイスしたいことがあります。「100%完璧な防御」は存在しません。
だからこそ、今日学んだプリペアドステートメントを基本にしつつ、Webアプリケーションファイアウォール(WAF)を導入して、「変なリクエストは入り口で弾く」という二重の鍵をかけておきましょう。
WAFは、例えるなら「家の前に立っている優秀な門番」です。「あ、こいつは怪しい動きをしている泥棒だ!」と見抜いて、玄関に近づく前に追い返してくれます。
セキュリティは、一度設定して終わりではありません。泥棒も常に新しい手口を考えています。でも、今日こうして知識を一つ身につけたあなたは、昨日よりもずっと安全なシステムを作れるようになっていますよ。
一歩ずつ、一緒に守りを固めていきましょう!
コメント