このすみノート

Webエンジニアが技術や趣味を書くブログです。

最近のPHPでは、header()関数に改行を用いたHTTPヘッダインジェクション攻撃が対策されている

最近と言ってもPHP5系時代なので、最近じゃないとツッコまれそうですが、header()関数に改行を用いたHTTPヘッダインジェクション攻撃は対策されていました。

イメージとしては、header()関数に改行付きの攻撃を仕掛けるイメージです。

# https://zenn.dev/shlia/articles/f446bde2b7594a
# http://localhost/?url=http://localhost/%0d%0aSet-Cookie:+PHPSESSID%3Dhogehoge  
header('Location: ' . $_GET['url']);

このケースを解釈すると、header関数に改行を含めたコンテンツを渡し、複数ヘッダーを出力しようとします。

header("Location: http://localhost
Set-Cookie: PHPSESSID=hogehoge");

[PHPウォッチ]第23回 セキュリティ上の問題などを修正したPHP 5.1.2,PHP 4.4.2リリース

改行をサニタイズ処理することで、複数ヘッダー攻撃を回避する方法が、PHP5系時代に実装されました。

header()関数における「HTTPレスポンス分割攻撃(HTTP Response Splitting Attack)」に対する脆弱性

「HTTPレスポンス分割」とは,HTTPレスポンスヘッダーにCR+LFやContent-Length: 0を含めること一つのHTTPレスポンスを複数のHTTPレスポンスであるように偽装し,ブラウザやProxyのキャッシュに悪意のあるHTTPレスポンスヘッダーを残す攻撃手法である。
これにより,この脆弱性を利用された場合,フィッシング詐欺などの被害が発生する可能性がある。この問題を回避するためには,HTTPレスポンスヘッダーの中にあるCR+LFをサニタイズする必要がある。本バージョンでは,header()関数の内部処理においてこのサニタイズ処理を追加し,安全性を向上させている。
https://xtech.nikkei.com/it/article/COLUMN/20060117/227354/

あとがき

PHPがheader()関数でサニタイズしてくれるとは言え、ほとんどのケースで改行ありヘッダーは想定外と思われます。 事前にしっかりバリデーションは推奨いたします。