概要
OWASP ZAPなどの脆弱性診断ツールを実行した際、「Advanced SQL Injection (boolean-based blind)」という項目が検出されることがあります。
本記事では、この「Blind(ブラインド)型」のSQLインジェクションがどのような攻撃手法なのか、その仕組みと根本的な対策、そして診断ツール利用時によく遭遇する「誤検知」の理由について解説します。
【起】見えないデータを盗み出す「Blind SQLインジェクション」
SQLインジェクションは、Webアプリケーションの入力フォームなどを通じて悪意のあるSQL文を注入し、データベースを不正に操作する攻撃です。通常、この攻撃が成功すると、画面上にデータベースのエラー文や、本来見えないはずの他人のデータがそのまま表示されます。
しかし、セキュリティ設定によってエラーメッセージが非表示化されていたり、検索結果が直接画面に出力されないような設計のシステムもあります。このような「攻撃者から結果が直接見えない(Blind)」状態であっても、データを抜き取る手法が存在します。それが「Blind SQLインジェクション」です。
【承】「はい」か「いいえ」でデータを特定する攻撃の仕組み
Blind SQLインジェクションの中でも代表的なものが「Boolean-based(真偽値ベース)」と呼ばれる手法です。
攻撃者は、データベースに対して「パスワードの1文字目は『A』ですか?」といった「True(真)」か「False(偽)」で判定できる条件式を注入します。
データそのものは画面に表示されなくても、システムからの応答にはわずかな違いが生じます。
・True(真)の場合の応答: 通常のページが表示される、特定の文字が含まれるなど。
・False(偽)の場合の応答:ページの内容が一部欠ける、HTTPステータスコードが変わる、データ長(バイト数)が変わるなど。
攻撃者はこの微細な「応答の差」を観察し、「Aではない」「Bでもない」「Cだ(Trueの応答が返ってきた)」というように、根気よくデータを1文字ずつ推測して抽出します。これがBoolean-based Blind SQL Injectionの恐ろしさです。
【転】根本的な対策と、診断ツールの「誤検知」について
必須となるセキュリティ対策
Blind型であっても、通常のSQLインジェクションと防ぎ方は同じです。
1. Prepared Statement(バインド変数)の利用
SQLの骨組みをあらかじめ固定し、ユーザーからの入力値は単なる「データ(文字列や数値)」として扱う仕組みです。これにより、入力値の中にSQLの命令が含まれていても、それが実行されることはありません。
2. 入力値のバリデーション
システムが想定する形式(数値のみ、特定の文字数など)以外の入力を、処理の入り口で弾くようにします。
脆弱性スキャナーにおける「誤検知(False Positive)」
OWASP ZAPなどの診断ツールも、攻撃者と同じように「Trueになる入力」と「Falseになる入力」を送信し、レスポンスの長さに差があった場合に「脆弱性あり」と判定します。
ただし、この判定ロジックゆえに、Blind SQLインジェクションは診断ツールで誤検知(False Positive)が非常に起きやすい項目でもあります。
例えば、以下のような理由でレスポンスの長さに差が出た場合、ツールはSQLインジェクションと勘違いしてアラートを出します。
・セキュリティ対策として埋め込まれているCSRFトークンやセッションIDが、リクエストごとに動的に変わっている。
・診断ツールの特殊な入力値がバリデーションエラーに引っかかり、画面にエラー文言が出たことで文字数が変化した。
【結】まとめ
Blind SQLインジェクションは、画面上に直接的な情報漏洩の兆候が見えなくても、システム内部のデータを確実に盗み出される危険な攻撃です。データベースへアクセスする際は、必ずPrepared Statementを利用し、SQLを動的に文字列結合しない設計を徹底してください。
また、脆弱性診断でこのアラートが出た場合は慌てずに、「本当に入力値がSQLに結合されているか」「レスポンスの差違はSQLの実行結果によるものか、それともフレームワークの動的な仕様か」を見極めることが重要です。