【入門編】HTTPヘッダインジェクション:レスポンス分割攻撃 – アプリケーションセキュリティ & 安全な開発防御ガイド

玄関の鍵をすり抜ける「見えない泥棒」の話:HTTPレスポンス分割攻撃入門

こんにちは。セキュリティの最前線で、日々「どうすればシステムを堅牢にできるか」を考えているエンジニアです。

今日は、初心者の方が意外と見落としがちな「HTTPレスポンス分割攻撃(HTTP Response Splitting)」についてお話しします。名前は少し難しそうですが、仕組みを理解すれば怖くありません。まるで「家の玄関の鍵」を例にして、一緒に一歩ずつ紐解いていきましょう。

—

1. なぜ「ヘッダ」が狙われるのか?

Webサイトにアクセスしたとき、ブラウザとサーバーの間では「手紙」のやり取りが行われています。その手紙の「封筒の表書き」にあたるのがHTTPレスポンスヘッダです。

本来、このヘッダには「このページはHTMLですよ」「文字コードはUTF-8ですよ」といった、ブラウザに対する大事な指示が書かれています。

ここで想像してみてください。もし、あなたが泥棒だったとして、家主(サーバー)が郵便受けに投函する手紙を少しだけ書き換えられたらどうしますか? 封筒の中に「この家は空き巣歓迎です」という偽のチラシを忍び込ませたり、別の宛先に転送させるような指示を書き足したりしますよね。

これが、HTTPレスポンス分割攻撃の正体です。ヘッダの中に「改行コード」という特殊な文字を紛れ込ませることで、本来1つであるはずの手紙を無理やり2つに分割し、偽の情報を追加してしまう攻撃なのです。

—

2. 攻撃のメカニズム:改行という名の「仕切り板」

Webアプリケーションが、ユーザーから受け取った入力値(名前や検索ワードなど)を、そのままレスポンスヘッダに埋め込んでしまうと危険です。

例えば、Webアプリが「ようこそ、〇〇さん!」と挨拶を返すために、URLのパラメータをヘッダにそのまま反映しているとします。

攻撃者はここに、「改行コード(CRLF)」を混ぜ込みます。
サーバーは、改行コードを見ると「あ、ここでヘッダは終わりだな。次はボディ(Webページの中身)だな」と勘違いしてしまいます。

その結果、本来送るはずのない「偽のWebページ」や「悪意あるスクリプト」を、あたかも正当なコンテンツであるかのようにブラウザに送りつけてしまうのです。これが「分割」の恐ろしさです。

—

3. どうやって防げばいいのか?(泥棒を入れない鉄則)

対策は非常にシンプルです。「入力値には、絶対に改行を入れさせない」。これに尽きます。

多くのフレームワークでは、ヘッダに改行コードが含まれているとエラーを吐くようになっていますが、古いシステムや独自のハンドラーを書いている場合は注意が必要です。

実践:Javaでの防御例

もしJavaでヘッダを構築するなら、値をセットする前に必ずチェックを行いましょう。

public void setHeader(String key, String value) {
// 改行コード(CR: \r または LF: \n)が含まれていたら拒否する
if (value.contains(“\r”) || value.contains(“\n”)) {
throw new IllegalArgumentException(“不正な値が含まれています”);
}
// 安全を確認してからヘッダをセットする
response.setHeader(key, value);
}

実践:PHPでの防御例

PHPなどの言語でも、ユーザーからの入力をそのまま出力するのは厳禁です。

$user_input = $_GET[‘name’];

// 改行コードを除去する関数を使う
$clean_input = str_replace(array(“\r”, “\n”), ”, $user_input);

// 安全な値を使ってヘッダを設定
header(“X-User-Name: ” . $clean_input);

—

4. まとめ:今日からできる防犯対策

最後に、今日から意識してほしい3つのポイントをまとめました。

1. ユーザー入力を信用しない: URLパラメータ、フォームの値、Cookieなど、外部からのデータはすべて「悪意があるかもしれない」という前提で扱いましょう。
2. ヘッダへの直接反映は避ける: どうしてもヘッダに値を入れる必要がある場合は、必ずホワイトリスト方式(許可された文字だけを通す)で検証してください。
3. フレームワークの力を信じる: モダンなフレームワークには、こうしたインジェクションを防ぐ機能が備わっています。自力で独自のヘッダ処理を書こうとせず、標準ライブラリの作法に従うことが最大の防御です。

セキュリティは「完璧な壁」を作ることではなく、「泥棒が入りにくい習慣」を積み重ねることです。今回学んだ「ヘッダに改行を入れない」というルール、ぜひ明日からの開発で意識してみてくださいね。

皆さんの書くコードが、今日も安全であることを祈っています!

コメント

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