HTTPヘッダ インジェクションとは、Webアプリケーションの脆弱性を利用した攻撃手法の1つです。WebブラウザがWebサーバに対して送信するHTTPリクエストに、改行コードを含む不正な文字列を紛れ込ませることで、WebサーバからのHTTPレスポンスを改ざんします。WebアプリケーションがHTTPレスポンスに含まれるパラメータ等を、そのままHTTPレスポンス ヘッダに格納して返信するようなWebアプリケーションは、この攻撃に対する脆弱性を持っていると言えます。この種のWebアプリケーションとしては、ユーザが指定したパラメータをその後のセッション管理で利用するため、そのパラメータを「Set-Cookie」にセットして返送するもの等が考えられます。
例えばWebブラウザが、以下のようにパラメータ付きでリクエストを送ったとしましょう。
http://f5.com/index.html?status=1
これに対して「stats=1」をその後のセッション管理で利用したい場合、Webアプリケーションは以下のようなHTTPレスポンスを返すことになります。
HTTP/1.1 200 OK
(中略)
Set-Cookie:status=1
ここで最初のリクエストに以下の細工をしたらどうなるでしょうか。
http://f5.com/index.html?status=1「改行コード」「改行コード」<html><body><script>~</script></body></html>
WebアプリケーションからのHTTPレスポンスは、以下のようになります。
HTTP/1.1 200 OK
(中略)
Set-Cookie:status=1
(空行)
<html><body><script>~</script></body></html>
HTTPレスポンスでは、レスポンス ヘッダの後2回改行を行った(つまり空行をはさんだ)後の部分が、レスポンス ボディとなります。実際にWebブラウザに表示されるのは、このレスポンス ボディに記述されたHTMLです。もしここにスクリプト記述があれば、Webブラウザはこのスクリプトを実行してしまうため、セキュリティ上な問題が生じることになります。またここで仕込まれる文字列が「改行」+「Set-Cookie:PHPSESSID=abc」といった内容であれば、WebブラウザのセッションIDを意図的に指定し、セッション固定攻撃を仕掛けることも可能になります。
この攻撃を防止するには、HTTPリクエスト ヘッダで渡されたパラメータのサニタイズ(攻撃に使用される文字列を無効化すること)が必要です。しかし全てのWebアプリケーションでサニタイズを確実に行うのは、決して簡単ではありません。この問題の解決手段として有効なのが、Webアプリケーション ファイアウォール(WAF)の活用です。Webアプリケーション ファイアウォールはアプリケーション レベルの通信を監視し、攻撃とみなされる通信を遮断することが可能です。