【入門編】SQLインジェクションにおけるWAF回避手法と正規化の重要性 – アプリケーションセキュリティ & 安全な開発防御ガイド

玄関の鍵をすり抜ける「泥棒の知恵」:SQLインジェクションとWAFの攻防

こんにちは。セキュリティの世界へようこそ。今日は、Webアプリを守るための「門番」であるWAF(ワフ)が、なぜ時として突破されてしまうのか、そして私たちが何を守るべきなのかを、一緒に紐解いていきましょう。

いきなり難しい話はしません。まずは、皆さんの家を想像してみてください。

1. WAFは「玄関の高性能な監視カメラ」

Webサイトを運営する際、WAF(Web Application Firewall)は「玄関に設置された、怪しい動きを検知する高性能な監視カメラと警備員」のような存在です。

攻撃者は、あなたの家の合鍵を盗もうと、あの手この手で「怪しい動き」をします。例えば、SQLインジェクションという手法は、「玄関の郵便受けから針金を突っ込んで、内側から鍵を開けようとする」ような、非常に狡猾な手口です。

本来なら、警備員(WAF)が「おい、何をしている!」と追い払ってくれるはずなのですが、泥棒もプロです。彼らはWAFの目を欺くために「変装」を繰り返します。

2. 泥棒が使う「変装」テクニック

WAFは、入力されたデータの中に「怪しい命令(SELECTやOR 1=1など)」が含まれていないか監視しています。しかし、泥棒はこう考えます。

  • 「コメントアウトで隠してしまえ」:

WAFは「SELECT」という文字列を探していますが、例えばSEL//ECTのように、途中にコメントを挟むと、WAFが「お、これはただのコメントだな」と見逃してくれることがあります。

  • 「多重エンコーディングで化かせ」:

日本語や特殊記号をWebで送る際、文字はコード化(エンコード)されます。これを二重、三重に重ねると、WAFは「ただの暗号の羅列」と勘違いして通してしまうのです。

これらは、警察が「怪しい人リスト」を持っていても、相手が完璧な変装をして通り過ぎるようなもの。WAF単体では、どうしても限界があるのです。

3. 最強の防犯は「家の構造そのものを変えること」

では、私たちはどうすればいいのでしょうか? 警備員を雇うだけでは不十分です。「鍵を開けようとされても、そもそもそこが鍵穴ではない」という構造を作ること、それが「正規化(Normalization)」と「プリペアドステートメント」です。

正規化:泥棒の変装を剥ぎ取る

正規化とは、受け取ったデータを「もっともシンプルで純粋な形」に戻す作業です。
例えば、SEL//ECT や %53%45%4c... といった複雑な入力を、バックエンドで「ただのSELECTという文字列」に戻して解釈します。

(コード例:PHPでの正規化のイメージ)

// ユーザーからの入力を受け取ったら、まずは一度解読(デコード)する
$input = rawurldecode($_GET[‘id’]);

// もし悪意あるコメント記号が含まれていれば、ここで徹底的に除去する
$clean_input = str_replace([‘/’, ‘/’], ”, $input);

// この時点でデータは「本来の姿」に戻ります

4. 本当の鍵は「パラメーター化」にある

どれだけ正規化を頑張っても、泥棒は新しい変装を考えつきます。そこで、最も確実な対策が「プリペアドステートメント(静的プレースホルダ)」です。

これは、「玄関の鍵穴そのものをなくして、専用のICカードしか受け付けないようにする」ような対策です。

(コード例:安全なクエリの書き方)

// SQLの命令文を先にサーバーに送っておく(ここにはデータは入れない)
$stmt = $pdo->prepare(“SELECT FROM users WHERE id = :id”);

// ユーザーの入力は、後から「ただのデータ」として流し込む
// これなら、いくら攻撃コードを入力しても、SQL命令としては実行されません!
$stmt->execute([‘id’ => $_GET[‘id’]]);

最後に:一歩ずつ、確実に。

「WAFがあるから安心」というのは、少しだけ楽観的かもしれません。WAFは強力な盾ですが、アプリケーション側の開発が「鍵をかけ忘れた家」であれば、いつか突破されてしまいます。

  • 正規化で入力をクリーンにする
  • プリペアドステートメントで命令とデータを分ける

この2つを意識するだけで、皆さんのWebサイトは劇的に強固になります。まずは今日、自分の書いているコードが「命令とデータを混ぜていないか?」を確認してみてください。

セキュリティは、一度の完璧な設定よりも、日々の小さな積み重ねが勝敗を分けます。一歩ずつ、一緒に強くなっていきましょう!

コメント

タイトルとURLをコピーしました