玄関の鍵だけじゃ防げない?「XSS」という名の“合鍵”を作らせない技術
こんにちは。現場で泥臭いインシデント対応をしていると、よく「ちゃんとWAFを入れているのに攻撃された」という相談を受けます。
セキュリティの世界では、WAF(Web Application Firewall)を「家の玄関に置いた屈強な警備員」に例えることがよくあります。でも、その警備員が「どんな格好をしたのが泥棒か」を知らなかったら、どうなるでしょう?
今日は、Webサイトの情報を盗み出そうとする「XSS(クロスサイトスクリプティング)」という泥棒の手口と、それを玄関先で見破るための「防犯チェックリスト(WAF)」の作り方について、一緒に学んでいきましょう。
—
1. XSSってそもそも何?「知らない人を家に入れる」怖さ
XSSは、一言で言うと「悪意のあるプログラムを、信頼されているサイトの一部としてブラウザに実行させる」攻撃です。
例えば、掲示板の投稿欄に、あなたの名前の代わりにと書き込まれたとします。もしサイト側がこれをそのまま表示してしまうと、他のユーザーがそのページを見た瞬間に、攻撃者が仕込んだプログラムがその人のPCで動いてしまいます。
これは、「泥棒が『大家さんからの荷物です』と書かれた偽の看板を掲げて、住人を騙して家の中に入れさせている」のと同じ状態です。住人(ブラウザ)は、その看板が偽物だとは思いませんから、何の疑いもなく泥棒を中に入れてしまうのです。
—
2. WAFで「怪しい動き」を見抜くには?
WAFは警備員です。彼らに「どのキーワードが危ないのか」を教えるのが「シグネチャ(正規表現)」というルール作りです。
しかし、攻撃者はあの手この手で「私は怪しい者ではありません」と偽装します。そこで、WAFには以下のようなパターンを警戒するよう設定します。
WAFの正規表現サンプル(簡易版)
WAFの設定ファイルやルール作成時に意識する、基本的な攻撃パターンの正規表現です。
1.
2. リンクの属性を使った実行(onerrorなど)を検知
on\w+\s=\s[“‘].?[“‘]
3. JavaScriptの擬似プロトコル(javascript:)を検知
javascript:.
※注意点:これらはあくまで基本です。最近の攻撃者は、大文字・小文字を混ぜたり、特殊なエンコードを使ったりして警備員をすり抜けようとします。WAFを導入したら「これで完璧」と思わず、ログを監視し続けるのが鉄則ですよ。
—
3. ログ分析で「予兆」を早期発見する
WAFで弾いたログをただ眺めるだけではもったいないです。SIEM(統合ログ管理)を使って、以下のような「泥棒の下見」を検知しましょう。
- 短時間に同じIPから大量の特殊文字(<, >, ‘, “)を含むリクエストが飛んできているか?
- これは攻撃者が「どこなら穴が開いているか」を総当たりで探している、まさに下見のサインです。
- 普段のアクセスではあり得ないURLエンコードが含まれていないか?
- 攻撃者は文字を隠すために特殊な符号化を多用します。
もしSIEMを導入しているなら、「1分間に5回以上の403(アクセス拒否)エラーを出したIPアドレスを自動的に24時間ブロックする」といった自動応答を設定しておくと、寝ている間の攻撃も防げるようになります。
—
4. 開発者として覚えておきたい「二重の鍵」
WAFは強力ですが、万能ではありません。開発者である皆さんがアプリケーション側でできる「一番の防犯」は、「入力された文字を信じない」ことです。
最も簡単な防御:出力のエンコード
PHPやJavaScriptで表示する際、特別な記号(< や > など)を「ただの文字」として扱うように変換します。
// 悪い例:そのまま表示してしまう
echo $user_input;
// 良い例:HTMLエンティティに変換して安全にする
// < は < に変換されるので、スクリプトとして動かなくなります
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
また、HTTPレスポンスヘッダーに Content-Security-Policy (CSP) を設定するのも非常に有効です。「このページでは、信頼できる場所以外からのスクリプト実行は一切禁止!」という強力な命令をブラウザに出す、いわば「家の中での行動制限ルール」です。
—
最後に:一歩ずつ、確実に。
セキュリティ対策に「終わり」はありません。でも、今日お話しした「WAFで怪しい奴を見張る」ことと「プログラム側でちゃんと文字を変換する」という2つを意識するだけで、あなたのサイトは格段に硬くなります。
最初は難しく感じるかもしれませんが、まずは「自分のサイトがどんなリクエストを受け取っているのか」をログで確認することから始めてみませんか?それが、プロへの第一歩です。
何か困ったことがあったら、いつでも相談してくださいね。一歩ずつ、一緒に守りを固めていきましょう!
コメント