HTTPヘッダーインジェクションとは

HTTPヘッダーインジェクションは、Webアプリケーションの脆弱性を悪用する攻撃手法です。攻撃者は、Webサーバーに送信するHTTPリクエストに、キャリッジリターンおよびラインフィード(CRLF)文字を含む悪意のある文字列を埋め込むことで、HTTPレスポンスを操作できます。ユーザーが指定したパラメーターをサニタイズせずにHTTPレスポンスヘッダーへ直接格納するWebアプリケーションは、特にこの種の攻撃を受けやすくなります。

たとえば、ブラウザがパラメーターを含む次のリクエストを送信する場合を考えてみましょう。

http://f5.com/index.html?status=1

Webアプリケーションがセッション管理にstatus=1パラメーターを使用する場合、次のようなHTTPレスポンスを返すことがあります。

HTTP/1.1 200 OK
...
Set-Cookie:status=1

ここで、次のように細工した入力によってリクエストが変更されたとします。

http://f5.com/index.html?status=1<CRLF><CRLF><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つのCRLF文字(空行)より後にあるコンテンツはすべてレスポンスボディとして扱われ、ブラウザによりレンダリングされます。レスポンスボディに悪意のあるJavaScriptが含まれている場合、ブラウザがそれを実行するため、セキュリティ侵害につながる可能性があります。さらに、攻撃者は入力を細工し、次のようなヘッダーコンテンツを挿入する可能性があります。

<CRLF>Set-Cookie:PHPSESSID=abc

これにより、ブラウザに特定のセッションIDが設定され、セッション固定攻撃が可能になります。

HTTPヘッダーインジェクションを防ぐ方法

  • サニタイズ:HTTPリクエストヘッダーで受信したパラメーターを検証してサニタイズし、悪意のある文字列を無害化します。
  • Web Application Firewall(WAF):すべてのWebアプリケーションを一貫してサニタイズすることは困難なため、WAFの導入が効果的です。WAFはアプリケーション層のトラフィックを監視し、攻撃と判断されたリクエストをブロックできるため、HTTPヘッダーインジェクションのリスク軽減に役立ちます。