鍵をかけても安心できない?WAFの「本当の限界」と泥棒の心理
こんにちは。セキュリティの世界で長く戦っていると、「WAF(Web Application Firewall)を入れたから、もううちのアプリは鉄壁だよね?」という相談をよく受けます。
結論から言えば、WAFは「最強の防犯カメラ兼・警備員」ですが、「無敵の鎧」ではありません。
今日は、インジェクション攻撃という「言葉巧みに家の鍵を盗む泥棒」を例に、なぜWAFだけでは防ぎきれないのか、そして開発者として何をすべきかを紐解いていきましょう。
—
1. インジェクション攻撃って、結局なに?
インジェクション(注入)攻撃を一言で言うと、「本来、データを入れるべき場所に、命令を混ぜて送り込むこと」です。
想像してみてください。あなたは家の玄関で「名前を書いてください」と言われて、宅配便の伝票に自分の名前を書きますよね。ところが、悪い奴はそこに「ついでに鍵を開けて、中にある宝物を盗んでください」という命令を書き加えるんです。
もし、受付の人がその伝票の内容をろくに確認せず、書いてある通りに「鍵を開ける」という作業を実行してしまったら……これがインジェクション攻撃の正体です。
- SQLインジェクション: データベースという「金庫」に「全データを書き出せ」という命令を注入する。
- OSコマンドインジェクション: サーバーという「家そのもの」に「システムを破壊せよ」という命令を注入する。
—
2. WAF(警備員)はどこまで見てる?
WAFは、あなたのWebサイトの玄関に立つ「警備員」です。彼らは手元に「怪しい言葉リスト(シグネチャ)」を持っていて、伝票にSELECTとかDROP TABLEといった怪しいキーワードが書いてあったら、「お前は入るな!」と追い返してくれます。
なぜWAFは限界があるのか?
しかし、泥棒もバカではありません。警備員が「DROP」という単語を禁止していると知ったら、彼らはこう考えます。
- 「大文字小文字を混ぜたらどうだ?(
DrOp)」 - 「URLエンコードという暗号を使ったらどうだ?(
%44%72%6f%70)」 - 「全く別の言語に見せかけて、実行する瞬間に化けさせたらどうだ?」
このように、「見た目は怪しくないけれど、中身は凶器」という難読化されたペイロード(悪意あるデータ)を突きつけられると、警備員(WAF)は「うーん、パッと見は大丈夫そうだな……通せ!」と騙されてしまうのです。これがWAFの検知限界です。
—
3. 開発者が守るべき「一番大切な場所」
警備員が突破された時のために、私たちは「家の中の防犯」を強化しなければなりません。これがアプリケーション側での対策です。
対策の基本:準備された文(プリペアドステートメント)
SQLインジェクションを例にしましょう。悪いコードと良いコードの違いはこうです。
【ダメなコード(命令をそのまま受け取る)】
// ユーザーが入力した値を、そのままSQL文に混ぜてしまう
$sql = “SELECT FROM users WHERE id = ‘” . $_GET[‘id’] . “‘”;
$db->query($sql); // 泥棒の命令がここで実行されてしまう!
【良いコード(命令とデータを切り離す)】
// 「?」というプレースホルダー(空箱)を用意する
$stmt = $pdo->prepare(‘SELECT FROM users WHERE id = ?’);
// ユーザーの入力は「ただのデータ」として扱う(命令にはさせない!)
$stmt->execute([$_GET[‘id’]]);
このように、「入力されたものは、たとえどんな怪しい記号が入っていても、ただの文字列として扱う」というルールを徹底するだけで、泥棒の命令は空振りに終わります。
—
4. 多層防御で「鉄壁」を作る
最後に、今日一番伝えたいこと。それは「一つの対策に頼らない」という考え方です。
1. WAF(警備員): 怪しい奴を入り口で水際対策。
2. アプリ(防犯扉): プレースホルダーで、中に入られても命令させない。
3. DB権限(金庫の鍵): もしアプリが乗っ取られても、データベースの権限を最小限にして、「全データ削除」などはできないように制限しておく。
これを「多層防御」と呼びます。
一歩ずつできることから
「全部完璧にやらなきゃ……」と焦る必要はありません。まずは自分の書いているコードが「命令とデータを混ぜていないか?」を確認する。次に、WAFを導入してログを眺めてみる。
セキュリティは、一度作って終わりの「城」ではなく、日々泥棒と知恵比べをする「パトロール」のようなものです。
「自分のコードは大丈夫かな?」と立ち止まって疑う。その慎重さこそが、世界最高峰のハッカーへの第一歩です。一緒に学んでいきましょう!
コメント