【入門編】HTTPヘッダーインジェクションの攻撃ベクトル – HTTPプロトコル・通信規格実践ガイド

こんにちは!ネットワークの世界へようこそ。今日は、Web通信の「お作法」であるHTTPに潜む、ちょっと怖いけれど面白い「ヘッダーインジェクション」という攻撃手法について、一緒に紐解いていきましょう。

難しそうに聞こえるかもしれませんが、大丈夫。郵便配達の仕組みに例えれば、スッと頭に入ってきますよ。一歩ずつ、丁寧に見ていきましょう。

—

そもそもHTTPヘッダーって何だろう?

Webサイトを見るとき、ブラウザ(郵便の送り手)とサーバー(郵便の受け取り手)の間では、こんなやり取りが行われています。

1. ブラウザ: 「このページを見せて!あ、僕は日本語が読めるよ」
2. サーバー: 「わかった!じゃあ日本語のページを送るね」

この「僕は日本語が読めるよ」といった「付随情報」をまとめた場所、それがHTTPヘッダーです。封筒に貼る「速達」や「取扱注意」といった付箋のようなものですね。

「CRLF」という名の「改行」が招く悪夢

HTTP通信において、ヘッダーの終わりを告げるには特別な合図が必要です。それが「CRLF(キャリッジリターン・ラインフィード)」。要するに、キーボードの「Enterキー」を押したときの「改行コード」のことです。

郵便で例えるなら、「ここから先は中身(本文)ですよ」と区切るための「二重線」のようなものですね。

ヘッダーインジェクションの仕組み

もし、悪意ある誰かが、本来入力すべき場所に「改行」を混ぜ込めたらどうなるでしょうか?

例えば、ユーザー名を入力するフォームに、こんな細工をします。
`山田太郎%0D%0Aセットクッキー: 秘密のID=悪意ある値`

サーバーがこれをそのまま受け取ると、サーバーは「おっと、ここでヘッダーが終わって、次が本文だな」と勘違いしてしまいます。結果として、本来送るはずのない「偽のヘッダー」を、ブラウザに送りつけてしまうのです。これがヘッダーインジェクションの正体です。

—

どんな被害があるの?

この攻撃で狙われるのは、主に次の2つです。

1. レスポンス分割攻撃(HTTP Response Splitting)

サーバーから返ってくるはずの答えを、無理やり2つに分けます。前半は正常なページに見せかけて、後半に偽のサイトへの転送命令を混ぜる……なんてことが可能です。ユーザーを偽のログイン画面に誘導する手口ですね。

2. キャッシュ汚染

中間にあるキャッシュサーバー(Webの「中継基地」)に「このページはこういう内容だ」と嘘の情報を覚え込ませます。すると、次にアクセスした無実のユーザーまで、偽のページを見せられてしまう……という広範囲な被害に繋がります。

—

防御策:どうやって身を守ればいい?

「じゃあ、どう対策すればいいの?」と不安になりますよね。安心してください。現代のWeb開発では、「ユーザーからの入力を決して信用しない」のが鉄則です。

実践的なコード例(PHPでの対策)

もし皆さんがWebアプリを作っているなら、入力値に「改行コード」が含まれていないかチェックすることが最大の防御になります。

// ユーザーが入力した値を受け取る例
$username = $_GET[‘user_name’];

// 対策:改行コード(CR: \r または LF: \n)が含まれていないかチェックする
if (preg_match(“/[\r\n]/”, $username)) {
// 改行が含まれていたら、それは攻撃の可能性大!
// 処理を中断してエラーにする
die(“不正な入力です。”);
}

// ここまでくれば安全!ヘッダーにセットする
header(“X-User-Name: ” . $username);

—

まとめ:ネットワークの健康を守るために

ヘッダーインジェクションは、いわば「封筒の書き方ルールを悪用して、郵便局員を騙す行為」です。

1. ヘッダーは「付箋(ラベル)」であること。
2. 改行(CRLF)が境界線になっていること。
3. ユーザーの入力をそのままヘッダーに使わないこと。

この3つを意識するだけで、皆さんが作るWebサービスはグッと強固なものになります。

最初は複雑に見えるパケットの世界も、こうして「郵便配達」に例えると少し身近に感じられませんか?もし「もう少しここが知りたい!」という部分があれば、ぜひ教えてくださいね。一緒に学んでいきましょう!

コメント

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